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 相关文章推荐
动态加载js的几种方法
Oct 23 Javascript
JavaScript RegExp方法获取地址栏参数(面向对象)
Mar 10 Javascript
jquery插件jTimer(jquery定时器)使用方法
Dec 23 Javascript
jquery ui resize 中border-box的bug修正
Apr 26 Javascript
AngularJS基础 ng-href 指令用法
Aug 01 Javascript
如何使用headjs来管理和异步加载js
Nov 29 Javascript
JavaScript定义全局对象的方法示例
Jan 12 Javascript
微信小程序实现单选选项卡切换效果
Jun 19 Javascript
JS实现简单的抽奖转盘效果示例
Feb 16 Javascript
JavaScript的查询机制LHS和RHS解析
Aug 16 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
Sep 20 Javascript
js实现Element中input组件的部分功能并封装成组件(实例代码)
Mar 02 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
收音机玩机评测 406 篇视频合集
2020/03/11 无线电
S900/ ETON E1-XM 收音机
2021/03/02 无线电
在普通HTTP上安全地传输密码
2007/07/21 PHP
php+javascript的日历控件
2009/11/19 PHP
PHP开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
javascript 操作文件 实现方法小结
2009/07/02 Javascript
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
js取滚动条的尺寸的函数代码
2011/11/30 Javascript
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
js确认删除对话框效果的示例代码
2014/02/20 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
jquery中each遍历对象和数组示例
2014/08/05 Javascript
Javascript模拟加速运动与减速运动代码分享
2014/12/11 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
2016/06/21 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
jQuery中的100个技巧汇总
2016/12/15 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
layui框架中layer父子页面交互的方法分析
2017/11/15 Javascript
Vue插值、表达式、分隔符、指令知识小结
2018/10/12 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
Vue实现摇一摇功能(兼容ios13.3以上)
2021/01/26 Vue.js
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
python中sets模块的用法实例
2014/09/30 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
2017/08/31 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
Windows下python3.6.4安装教程
2018/07/31 Python
python tkinter界面居中显示的方法
2018/10/11 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
利用python生成照片墙的示例代码
2020/04/09 Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
2020/08/11 Python
地球上最先进的胡子和头发修剪器:Bevel
2018/01/23 全球购物
毕业生班级鉴定评语
2015/01/04 职场文书
厉行节约工作总结
2015/08/12 职场文书
Python 处理表格进行成绩排序的操作代码
2021/07/26 Python