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 相关文章推荐
Prototype源码浅析 String部分(四)之补充
Jan 16 Javascript
基于jquery实现控制经纬度显示地图与卫星
May 20 Javascript
javascript获取当前鼠标坐标的方法
Jan 10 Javascript
JavaScript计算两个日期时间段内日期的方法
Mar 16 Javascript
jquery中ajax跨域方法实例分析
Dec 18 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
Jun 16 Javascript
js接收并转化Java中的数组对象的方法
Aug 11 Javascript
JQuery 动态生成Table表格实例代码
Dec 02 Javascript
常用的js方法合集
Mar 10 Javascript
Node.js和Express简单入门介绍
Mar 24 Javascript
使用javascript做在线算法编程
May 25 Javascript
Angular 实现输入框中显示文章标签的实例代码
Nov 07 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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
人大复印资料处理程序_补充篇
2006/10/09 PHP
php调用mysql数据 dbclass类
2011/05/07 PHP
基于PHPexecl类生成复杂的报表表头示例
2016/10/14 PHP
PHP面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
javascript高亮效果的二种实现方法
2008/09/14 Javascript
Input 特殊事件onpopertychange和oninput
2009/06/17 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
jquery实现焦点图片随机切换效果的方法
2015/03/12 Javascript
jQuery实现分章节锚点“回到顶部”动画特效代码
2015/10/23 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
如何理解Vue的作用域插槽的实现原理
2017/08/19 Javascript
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
基于JS实现带动画效果的流程进度条
2018/06/01 Javascript
默认浏览器设置及vue自动打开页面的方法
2018/09/21 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
python 运算符 供重载参考
2009/06/11 Python
python爬虫入门教程之糗百图片爬虫代码分享
2014/09/02 Python
使用PDB简单调试Python程序简明指南
2015/04/25 Python
用Python编写web API的教程
2015/04/30 Python
DES加密解密算法之python实现版(图文并茂)
2018/12/06 Python
python使用threading.Condition交替打印两个字符
2019/05/07 Python
Vrbo英国:预订度假屋
2020/08/19 全球购物
产品促销活动策划书
2014/01/15 职场文书
投标邀请书范文
2014/01/31 职场文书
八一演出活动方案
2014/02/03 职场文书
无罪辩护词范文
2015/05/21 职场文书
投诉信回复范文
2015/07/03 职场文书
八年级作文之一起的走过日子
2019/09/17 职场文书
Python使用Kubernetes API访问集群
2021/05/30 Python
如何vue使用el-table遍历循环表头和表体数据
2022/04/26 Vue.js
基于Python编写一个监控CPU的应用系统
2022/06/25 Python