所用vue-cli版本爲2.9.3, 非最新的3.0+版本, 包管理工具爲yarn如今vue cli 3.x版本已經穩定, 推薦使用 @vue/cli 3.x版本css
vue init webpack my-project cd my-project yarn install
腳手架項目webpack版本爲3.6.0html
yarn upgrade webpack@4.6.0 yarn add webpack-dev-server webpack-cli -D
光升級這寫是不夠的, 此時運行項目會報一些奇奇怪怪的錯誤, 好比TypeError: compilation.mainTemplate.applyPluginsWaterfall is not a function
查看錯誤信息上下文,vue
/workspace/my-project/node_modules/html-webpack-plugin/lib/compiler.js:81 var outputName = compilation.mainTemplate.applyPluginsWaterfall('asset-path', outputOptions.filename, { TypeError: compilation.mainTemplate.applyPluginsWaterfall is not a function
應該是相關插件版本不對, 好比這個錯誤就是html-webpack-plugin
未升級版本致使node
繼續升級相關pluginwebpack
須要升級的相關plugin以下:git
html-webpakc-plugin vue-loader
其餘未涉及的, 也儘量升級到新的版本.github
指定webpack.dev.conf.j和webpack.prod.conf.js 的mode 爲development
和production
, 不然會有警告信息⚠️The 'mode' option has not been set, webpack will fallback to 'production' for this value.
web
此時項目已經能在dev-server下順利運行.
刪除多餘配置項: webpack.DefinePlugin
已再也不須要, 在開發模式下, process.env.NODE_ENV 自動被設置爲'development', 生成模式下則是production
其餘環境變量推薦使用cross-env
在命令裏設置, 若是須要也能夠保留.vue-cli
cross-env cross-env NODE_ENV=test yarn test
其餘插件修改:NoEmitOnErrorsPlugin
廢棄,使用optimization.noEmitOnErrors
替代,在生產環境中默認開啓ModuleConcatenationPlugin
廢棄,使用optimization.concatenateModules
替代,在生產環境默認開啓該插件。NamedModulesPlugin
廢棄,使用optimization.namedModules
替代,在生產環境默認開啓。uglifyjs-webpack-plugin
升級到了v1.0版本, 默認開啓緩存和並行功能。CommonsChunkPlugin
被刪除api
在配置文件中刪除廢棄的插件, 至此, 開發模式改造完畢
應爲CommonsChunkPlugin
被刪除, 改成內置的api, 首先刪除webpack.prod.conf.js
相關配置(CommonsChunkPlugin和UglifyJsPlugin), 新增項optimization,
optimization: { runtimeChunk: { name: 'manifest' }, minimizer: [ new UglifyJsPlugin({ cache: true, parallel: true, sourceMap: config.build.productionSourceMap, uglifyOptions: { warnings: false } }), new OptimizeCSSPlugin({ cssProcessorOptions: config.build.productionSourceMap ? { safe: true, map: { inline: false } } : { safe: true } }), ], splitChunks:{ chunks: 'async', minSize: 30000, minChunks: 1, maxAsyncRequests: 5, maxInitialRequests: 3, name: false, cacheGroups: { vendor: { name: 'vendor', chunks: 'initial', priority: -10, reuseExistingChunk: false, test: /node_modules\/(.*)\.js/ }, styles: { name: 'styles', test: /\.(scss|css)$/, chunks: 'all', minChunks: 1, reuseExistingChunk: true, enforce: true } } } }
extract-text-webpack-plugin
已再也不被推薦使用, webpack4 推薦使用新的插件mini-css-extract-plugin
yarn add mini-css-extract-plugin -D
修改配置文件
// const ExtractTextPlugin = require('extract-text-webpack-plugin') const MiniCssExtractPlugin = require('mini-css-extract-plugin') ... plugins: [ ... // new ExtractTextPlugin({ // filename: utils.assetsPath('css/[name].[contenthash].css'), // allChunks: true, // }), new MiniCssExtractPlugin({ filename: 'css/app.[name].css', chunkFilename: 'css/app.[contenthash:12].css' // use contenthash * }), ]
再修改build/utils文件中extract css的設置
// const ExtractTextPlugin = require('extract-text-webpack-plugin') const MiniCssExtractPlugin = require('mini-css-extract-plugin') ... if (options.extract) { // return ExtractTextPlugin.extract({ // use: loaders, // fallback: 'vue-style-loader' // }) // MiniCssExtractPlugin.loader, return [MiniCssExtractPlugin.loader].concat(loaders) } else { return ['vue-style-loader'].concat(loaders) }
yarn build
已經可以正常打包, 通過測試, 打包5萬行代碼的一個項目, webpack4比3快20s左右
通過修改的demo項目github地址
補充: 若是打包的時候出現
WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB). This can impact web performance.
在webpack中增長配置便可
performance: { hints: false }
新版的webpack devserver 若是不指定host, 只能經過localhost訪問, 經過ip不能訪問, 修改方法很簡單, 指明host爲 '0.0.0.0'就能夠
... host: '0.0.0.0', // can be overwritten by process.env.HOST port: 8080 ...
若是build或者dev時候出現, html-webpack-plugin報錯的狀況, 請升級該插件, 相關issue
yarn add html-webpack-plugin@next -D
若是報chunksSortMode相關的錯誤, 請刪除chunksSortMode: 'dependency'
以後再嘗試build
仍是建議升級html-webpack-plugin@next