vue-cli2 构建速度优化的实现方法


Posted in Javascript onJanuary 08, 2019

对于使用 vue-cli 脚手架创建的前端项目,编译发布几乎是必需操作,有的编译只需要几秒钟,快如闪电,有的却需要好几分钟,慢如蜗牛。如果是线上进行热修复,那更是分秒必争,网页响应的速度直接影响了用户体验,用户不会那么有耐心长时间等着,让你慢慢编译。

网上流传 vue-cli 一些优化配置,有些在新版本的 vue-cli 和 webpack3 已经不再需要了,有些是针对 webpack4 的。对于新版本的 vue-cli 和 webpack3,以下简单配置优化后,即可大幅提升构建速度。

  1. 按需引用及动态路由
  2. 启用 uglifyjs-webpack-plugin 缓存
  3. 关闭 source-map
  4. 利用 DllPlugin 和 DllReferencePlugin 提取公用库

一、动态路由

1、修改 src/router/index.js

import Vue from 'vue'
import Router from 'vue-router'

// webpackChunkName 打包后的文件名
const Menu = () => import(/* webpackChunkName: 'Menu' */ '@/pages/menu/index.vue')

export default new Router({
 routes: [
 {
  path: '/',
  name: 'Menu',
  component: Menu
 }
 ]
})

2、配置 .babelrc(可选)

{
 ... 
 "comments": true, // 输出编译信息
 "plugins": ["transform-vue-jsx", "transform-runtime"]
}

3、修改 build/webpack.prod.conf.js

output: {
 path: config.build.assetsRoot,
 filename: utils.assetsPath('js/[name].[chunkhash].js'),
 chunkFilename: utils.assetsPath('js/[name].js') // 使用webpackChunkName定义的文件名
},

二、启用 uglifyjs-webpack-plugin 缓存

new UglifyJsPlugin({
  parallel: true, // 并行
  cache: true // 缓存
}),

三、关闭 source-map

修改 src/config/index.js 中 productionSourceMap 值

productionSourceMap:false

四、公用库提取

1、安装 clean-webpack-plugin add-asset-html-webpack-plugin

yarn add clean-webpack-plugin add-asset-html-webpack-plugin@2.1.0 --dev

2、build 目录下创建 webpack.dll.conf.js

const webpack = require('webpack')
const path = require('path')
const CleanWebpackPlugin = require('clean-webpack-plugin')
const dllPath = path.resolve(__dirname, '../src/assets/dll') // dll文件存放的目录

process.env.NODE_ENV = 'production' // NODE_ENV 设置为 production 减少依赖

module.exports = {
 entry: { // 把 vue 相关模块的放到一个单独的动态链接库
 vue: ['babel-polyfill', 'vue', 'vue-router', 'vuex', 'axios', 'element-ui']
 },
 output: {
 filename: '[name]-[hash].dll.js', // 生成vue.dll.js
 path: dllPath,
 library: '_dll_[name]'
 },
 plugins: [ 
 new CleanWebpackPlugin(['*.js'], { // 清除之前的dll文件
  root: dllPath
 }), 
 new webpack.DefinePlugin({  
  'process.env': {
  NODE_ENV: JSON.stringify(process.env.NODE_ENV) // 设置环境变量
  }
 }), 
 new webpack.DllPlugin({
  name: '_dll_[name]',  // manifest.json 描述动态链接库包含了哪些内容
  path: path.join(__dirname, './', '[name].dll.manifest.json')
 }), 
 // 压缩代码
 new webpack.optimize.UglifyJsPlugin({
  compress: {
  warnings: false,
  pure_funcs: ['console.log']
  },
  sourceMap: false
 })
 ]
}

3、在 package.json 中新增 dll 构建命令

"scripts": { 
 "dll": "webpack --config build/webpack.dll.conf.js" // dll打包命令
 },

4、修改 build/webpack.prod.conf.js

const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin')

plugins: [ 
 // 引用 manifest.json
 new webpack.DllReferencePlugin({
  manifest: require('./vue.dll.manifest.json')
 }), 
 // 将 dll 注入到 生成的 html 模板中
 new AddAssetHtmlPlugin({
  filepath: path.resolve(__dirname, '../src/assets/dll/*.js'), // dll文件位置
  publicPath: config.build.assetsPublicPath + utils.assetsPath('dll/'), // dll 引用路径
  outputPath: config.build.assetsPublicPath + utils.assetsPath('dll/'), // dll最终输出的目录
  includeSourcemap: false
  // hash: true,
 }),
 ...
]

五、编译

yarn run dll // 运行一次生成 dll 文件即可,下次构建时不必运行
yarn run build

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript实现动态CSS换肤技术的脚本
Jun 29 Javascript
js冒泡法和数组转换成字符串示例代码
Aug 14 Javascript
Iframe实现跨浏览器自适应高度解决方法
Sep 02 Javascript
jQuery Ajax()方法使用指南
Nov 19 Javascript
javascript实现的图片切割多块效果实例
May 07 Javascript
jquery中添加属性和删除属性
Jun 03 Javascript
深入剖析JavaScript:Object类型
May 10 Javascript
jQuery插件Echarts实现的渐变色柱状图
Mar 23 jQuery
Vue内容分发slot(全面解析)
Aug 19 Javascript
javascript for循环性能测试示例
Aug 07 Javascript
JavaScript对象原型链原理详解
Feb 05 Javascript
js+cavans实现图片滑块验证
Sep 29 Javascript
一个因@click.stop引发的bug的解决
Jan 08 #Javascript
JavaScript学习笔记之图片库案例分析
Jan 08 #Javascript
JavaScript学习笔记之DOM操作实例分析
Jan 08 #Javascript
vue单文件组件lint error自动fix与styleLint报错自动fix详解
Jan 08 #Javascript
说说如何在Vue.js中实现数字输入组件的方法
Jan 08 #Javascript
小试SVG之新手小白入门教程
Jan 08 #Javascript
vue组件通信传值操作示例
Jan 08 #Javascript
You might like
通过php快速统计某个数据库中每张表的数据量
2012/09/04 PHP
一个简洁实用的PHP缓存类完整实例
2014/07/26 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
PHP7引入的"??"和"?:"的区别讲解
2019/04/08 PHP
PHP判断函数是否被定义的方法
2019/06/21 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
javascript判断chrome浏览器的方法
2014/03/26 Javascript
分享JavaScript与Java中MD5使用两个例子
2015/12/23 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
jQuery点击弹出层弹出模态框点击模态框消失代码分享
2017/01/21 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
2017/02/13 Javascript
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
微信小程序动态的加载数据实例代码
2017/04/14 Javascript
JS实现动态添加DOM节点和事件的方法示例
2017/04/28 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
快速了解Node中的Stream流是什么
2019/02/13 Javascript
Python迭代用法实例教程
2014/09/08 Python
python用opencv批量截取图像指定区域的方法
2019/01/24 Python
如何基于Python实现数字类型转换
2020/02/07 Python
大学生咖啡店创业计划书
2014/01/21 职场文书
校运会口号
2014/06/18 职场文书
党员作风建设自查报告
2014/10/23 职场文书
校园运动会广播稿
2015/08/19 职场文书
听课评课活动心得体会
2016/01/15 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书