移动端项目,须要严格控制包的大小,否则影响用户体验,因此须要对webpack进行优化
本文档主要介绍本身初次体验webpack优化的一些知识点。css
便于分析哪些包有问题,哪些包体积过大等现象
vue-cli内置包分析工具vue
// webpack.prod.conf.js if (config.build.bundleAnalyzerReport) { const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin webpackConfig.plugins.push(new BundleAnalyzerPlugin()) }
能够经过在package.json
添加命令开启包分析工具,默认8888端口node
"analyze": "NODE_ENV=production npm_config_report=true npm run build"
vue-cli默认配置将node_modules
里的依赖都打进vendor
中,有一些弊端webpack
vendor
文件越大node_modules
中全部依赖都进行抽离,以后维护若是添加新的模块或者删除一些没有用的模块,那么vendor的hash值会发生变化,不利于浏览器缓存项目中,我主要经过CommonsChunkPlugin
插件对webpack进行优化,将原本1M的包,最后只有300+kbweb
node_modules
中的模块抽离出来new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', minChunks: function (module) { // this assumes your vendor imports exist in the node_modules directory return module.context && module.context.includes('node_modules'); } });
vue vuex vue-router vant
继续抽离出一个文件代码以下,两种写法vue-router
// 方法一 对module.context进行过滤 new webpack.optimize.CommonsChunkPlugin({ names: "common", minChunks: function(module, count) { if (module.resource && /^.*\.(css|scss)$/.test(module.resource)) { return false; } return module.context && (module.context.includes("vue") || module.context.includes("vant") || module.context.includes("vuex") || module.context.includes("vue-router")); } }),
// 方法二 // webpack.base.conf 文件 将公共模块,写入入口 entry: { app: './src/main.js', common: ['vue', 'vuex', 'vue-router', 'vant'] }, // webpack.prod.conf new webpack.optimize.CommonsChunkPlugin({ name: 'common', minChunks: Infinity // 除了入口的模块,其余模块都不打包进入common }),
经过下面对每一个路由进行修改,添加webpackChunkName
,打包出来每一个模块的js名称会根据本身设定的来
除此以外,还须要同步修改webpack.prod.conf.js
中output
的配置vuex
output: { path: config.build.assetsRoot, filename: utils.assetsPath('js/[name].[chunkhash].js'), chunkFilename: utils.assetsPath('js/[name].[chunkhash].js') },
component: () => import(/* webpackChunkName: "home" */ '@/containers/home.vue'),
当entry属性的值为对象时,做为多个入口的文件们,每一个都是一个chunkvue-cli
某个模块最少被多少个入口文件依赖,当大于等于设定的值,就会被打入公共包,小于这个值,该模块就会被和每一个入口打包在一块儿npm
不会把任何依赖的模块提取出来打入公共包json
若是没有设置,则为默认值,只有被全部入口文件所依赖,则提取出来打公共包
按需加载 (利用路由中 import() 语法 component: () => import('@/components/Hello'))
根据模块的相对路径生成一个四位数的hash做为模块id
new webpack.HashedModuleIdsPlugin()
webpack
commonsChunkPlugin
demo
但愿此文对你们有帮助,欢迎吐槽