diff --git a/.postcssrc.js b/.postcssrc.js
index eee3e92d..09948d63 100644
--- a/.postcssrc.js
+++ b/.postcssrc.js
@@ -2,8 +2,6 @@
 
 module.exports = {
   "plugins": {
-    "postcss-import": {},
-    "postcss-url": {},
     // to edit target browsers: use "browserslist" field in package.json
     "autoprefixer": {}
   }
diff --git a/package.json b/package.json
index 41929346..2a11617a 100644
--- a/package.json
+++ b/package.json
@@ -37,7 +37,6 @@
     "axios": "0.18.0",
     "clipboard": "1.7.1",
     "codemirror": "5.39.2",
-    "connect": "3.6.6",
     "driver.js": "0.5.2",
     "dropzone": "5.2.0",
     "echarts": "4.1.0",
@@ -49,7 +48,7 @@
     "jszip": "3.1.5",
     "normalize.css": "7.0.0",
     "nprogress": "0.2.0",
-    "path-to-regexp": "^2.4.0",
+    "path-to-regexp": "2.4.0",
     "screenfull": "3.3.3",
     "showdown": "1.8.6",
     "simplemde": "1.11.2",
@@ -64,30 +63,21 @@
     "xlsx": "^0.11.16"
   },
   "devDependencies": {
-    "@babel/core": "7.0.0",
     "@babel/register": "7.0.0",
-    "@vue/babel-helper-vue-jsx-merge-props": "0.1.0",
-    "@vue/cli-plugin-babel": "^3.0.5",
-    "@vue/cli-plugin-eslint": "^3.0.5",
-    "@vue/cli-plugin-unit-mocha": "^3.0.5",
-    "@vue/cli-service": "^3.0.5",
-    "@vue/eslint-config-standard": "^3.0.5",
-    "@vue/test-utils": "^1.0.0-beta.25",
-    "autoprefixer": "8.5.0",
-    "babel-plugin-istanbul": "^4.1.6",
+    "@vue/cli-plugin-babel": "3.0.5",
+    "@vue/cli-plugin-eslint": "3.0.5",
+    "@vue/cli-plugin-unit-jest": "3.0.5",
+    "@vue/cli-service": "3.0.5",
+    "@vue/test-utils": "1.0.0-beta.25",
+    "babel-core": "7.0.0-bridge.0",
+    "babel-jest": "23.6.0",
     "husky": "0.14.3",
     "lint-staged": "7.2.2",
     "mockjs": "1.0.1-beta3",
-    "node-notifier": "5.2.1",
     "node-sass": "^4.7.2",
-    "optimize-css-assets-webpack-plugin": "5.0.0",
-    "postcss-import": "11.1.0",
-    "postcss-loader": "2.1.6",
-    "postcss-url": "7.3.2",
     "sass-loader": "7.0.3",
     "script-ext-html-webpack-plugin": "2.0.1",
     "script-loader": "0.7.2",
-    "shelljs": "0.8.2",
     "svg-sprite-loader": "3.8.0",
     "svgo": "1.0.5",
     "vue-template-compiler": "2.5.17"
diff --git a/public/index.html b/public/index.html
index adb0ecc0..a2fac6d6 100644
--- a/public/index.html
+++ b/public/index.html
@@ -6,7 +6,7 @@
     
     
     
-    
vue-element-admin
+    <%= webpackConfig.name %>
   
   
     
diff --git a/vue.config.js b/vue.config.js
index d4f047fa..3cf98e60 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -1,18 +1,37 @@
 'use strict'
-require('@babel/register')
 const path = require('path')
-const bodyParser = require('body-parser')
 
 function resolve(dir) {
   return path.join(__dirname, dir)
 }
 
+const port = 9527 // TODO: change to Settings
+
+// Explanation of each configuration item You can find it in https://cli.vuejs.org/config/
 module.exports = {
+  /**
+   * You can set by yourself according to actual condition
+   * You will need to set this if you plan to deploy your site under a sub path,
+   * for example GitHub pages. If you plan to deploy your site to https://foo.github.io/bar/,
+   * then assetsPublicPath should be set to "/bar/".
+   * In most cases please use '/' !!!
+   * Detail https://cli.vuejs.org/config/#baseurl
+   */
+  baseUrl: '/',
+  outputDir: 'dist',
+  assetsDir: 'static',
+  lintOnSave: process.env.NODE_ENV !== 'production',
+  productionSourceMap: false,
   devServer: {
+    port: port,
     open: true,
+    overlay: {
+      warnings: false,
+      errors: true
+    },
     proxy: {
       '/api': {
-        target: 'http://localhost:8080/mock',
+        target: `http://localhost:${port}/mock`,
         changeOrigin: true,
         pathRewrite: {
           '^/api': ''
@@ -20,6 +39,9 @@ module.exports = {
       }
     },
     after(app) {
+      console.log('apple')
+      const bodyParser = require('body-parser')
+      require('@babel/register')
       // parse app.body
       // http://expressjs.com/en/4x/api.html#req.body
       app.use(bodyParser.json())
@@ -33,28 +55,74 @@ module.exports = {
     }
   },
   configureWebpack: {
+    // We provide the app's title in Webpack's name field, so that
+    // it can be accessed in index.html to inject the correct title.
+    name: 'vue-element-admin', // TODO: change to Settings
     resolve: {
       alias: {
-        '$@': resolve('src/components')
+        '@': resolve('src')
       }
-    },
-    module: {
-      rules: [
-        {
-          test: /\.svg$/,
-          loader: 'svg-sprite-loader',
-          include: [resolve('src/icons')],
-          options: {
-            symbolId: 'icon-[name]'
-          }
-        }
-      ]
     }
   },
   chainWebpack(config) {
+    config.plugins.delete('preload')// TODO: need test
+    config.plugins.delete('prefetch')// TODO: need test
     config.module
       .rule('svg')
       .exclude.add(resolve('src/icons'))
       .end()
+    config.module
+      .rule('icons')
+      .test(/\.svg$/)
+      .include.add(resolve('src/icons'))
+      .end()
+      .use('svg-sprite-loader')
+      .loader('svg-sprite-loader')
+      .options({
+        symbolId: 'icon-[name]'
+      })
+      .end()
+
+    config
+      .when(process.env.NODE_ENV === 'development',
+        config => config.devtool('cheap-source-map')
+      )
+
+    config
+      .when(process.env.NODE_ENV !== 'development',
+        config => {
+          config
+            .plugin('ScriptExtHtmlWebpackPlugin')
+            .use('script-ext-html-webpack-plugin', [{
+              // `runtime` must same as runtimeChunk name. default is `runtime`
+              inline: /runtime\..*\.js$/
+            }])
+          config
+            .optimization.splitChunks({
+              chunks: 'all',
+              cacheGroups: {
+                libs: {
+                  name: 'chunk-libs',
+                  test: /[\\/]node_modules[\\/]/,
+                  priority: 10,
+                  chunks: 'initial' // 只打包初始时依赖的第三方
+                },
+                elementUI: {
+                  name: 'chunk-elementUI', // 单独将 elementUI 拆包
+                  priority: 20, // 权重要大于 libs 和 app 不然会被打包进 libs 或者 app
+                  test: /[\\/]node_modules[\\/]element-ui[\\/]/
+                },
+                commons: {
+                  name: 'chunk-commons',
+                  test: resolve('src/components'), // 可自定义拓展你的规则
+                  minChunks: 3, // 最小公用次数
+                  priority: 5,
+                  reuseExistingChunk: true
+                }
+              }
+            })
+          config.optimization.runtimeChunk('single')
+        }
+      )
   }
 }