在使用vue开发单页面应用时,随着项目页面的增多,你会发现生产环境的build速度会很慢,同时页面初始的js大小愈来愈大。当你没法忍受的时候就该优化了。html
这方面的优化无非就是异步加载、提取一部分长期不须要更新代码的基础js库。vue
能够采用vue-router的路由懒加载点击连接进行学习webpack
能够学习下DllPlugin和DllReferencePlugin两个插件,同时配合(add-asset-html-webpack-plugin)一块儿完成提取到自动引入。ios
值得关注的是lib数组(资源依赖包,提早编译)这里根据本身项目的具体引用状况自行添加web
const webpack = require('webpack'); const path = require('path'); const isDebug = process.env.NODE_ENV === 'development'; const outputPath = isDebug ? path.join(__dirname, '../src/common/debug') : path.join(__dirname, '../src/common/dist'); const fileName = '[name]_[hash].js'; // 资源依赖包,提早编译 const lib = [ 'vue', 'vuex', 'vue-router', 'axios', 'body-parser', 'cookie-parser', 'weixin-js-sdk', 'element-ui', 'vue-scroll' ]; const plugin = [ new webpack.DllPlugin({ /** * path * 定义 manifest 文件生成的位置 * [name]的部分由entry的名字替换 */ path: path.join(outputPath, 'manifest.json'), /** * name * dll bundle 输出到那个全局变量上 * 和 output.library 同样便可。 */ name: '[name]_[hash]', context: __dirname }), new webpack.optimize.OccurrenceOrderPlugin() ]; if (!isDebug) { plugin.push( // new webpack.DefinePlugin({ // 'process.env.NODE_ENV': JSON.stringify('production') // }), new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false }, sourceMap: true }) ) } module.exports = { devtool: '#source-map', entry: { lib: lib }, output: { path: outputPath, filename: fileName, /** * output.library * 将会定义为 window.${output.library} * 在此次的例子中,将会定义为`window.vendor_library` */ library: '[name]_[hash]', libraryTarget: 'umd', umdNamedDefine: true }, plugins: plugin }
简单的方式是在package.json文件中添加(须要注意的使用的是webpack2) "dll-production": "NODE_ENV=production webpack --config build/webpack.dll.config.js --progress", "dll-test": "NODE_ENV=development webpack --config build/webpack.dll.config.js --progress", 而后经过npm run dll-production 和 npm run dll-test进行构建 正如NODE_ENV的值同样不一样环境引用不一样路径下的lib.js 构建后目录以下图
#安装add-asset-html-webpack-plugin $ npm install --save-dev add-asset-html-webpack-plugin
修改开发环境webpack.dev.config.js
#初始化 const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin') 在plugins中添加 new webpack.DllReferencePlugin({ context: __dirname, manifest: require(path.join(__dirname, '../src/common/debug/manifest.json')) }), new AddAssetHtmlPlugin({ filepath: path.resolve(__dirname, '../src/common/debug/lib_*.js') }),
执行npm run devvue-router
修改生产环境webpack.prod.config.js
#初始化 const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin') 在plugins中添加 new webpack.DllReferencePlugin({ context: __dirname, manifest: require(path.join(__dirname, '../src/common/dist/manifest.json')) }), new AddAssetHtmlPlugin({ filepath: path.resolve(__dirname, '../src/common/dist/lib_*.js') }),
执行npm run build(同时与之前的构建速度对比,你会发现节省了不少时间,目前个人项目省了1/3时长)vuex
共同点:都是提取公共模块到父模块中,利用缓存来提升访问速度(第一次加载除外)
区别:dll-plugin须要手动去配置和打包公共模块,CommonsChunkPlugin则是每次构建时按照配置打包公共模块。
使用 DllPlugin 将更改不频繁的代码进行单独编译。这将改善引用程序的编译速度,即便它增长了构建过程的复杂性。
webpack文档也推荐使用dll-plugin进行公共模块的分离。npm