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 继承详解(二)
Jul 13 Javascript
JavaScript数组常用操作技巧汇总
Nov 17 Javascript
javascript实现动态加载CSS
Jan 26 Javascript
jqueryUI里拖拽排序示例分析
Feb 26 Javascript
jQuery插件实现适用于移动端的地址选择器
Feb 18 Javascript
快速解决js开发下拉框中blur与click冲突
Oct 10 Javascript
详解如何在Vue2中实现组件props双向绑定
Mar 29 Javascript
微信小程序仿朋友圈发布动态功能
Jul 15 Javascript
vue 巧用过渡效果(小结)
Sep 22 Javascript
基于JavaScript实现一个简单的Vue
Sep 26 Javascript
微信小程序中如何使用flyio封装网络请求
Jul 03 Javascript
jquery实现图片放大镜效果
Dec 23 jQuery
一个因@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/01 无线电
php 输入输出流详解及示例代码
2016/08/25 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
jQuery each()方法的使用方法
2010/03/18 Javascript
js 居中漂浮广告
2010/03/21 Javascript
jquery自定义滚动条插件示例分享
2014/02/21 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
2015/08/25 Javascript
浅析jQuery Mobile的初始化事件
2015/12/03 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
JS作用域深度解析
2016/12/29 Javascript
Angular之指令Directive用法详解
2017/03/01 Javascript
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
JS正则表达式验证端口范围(0-65535)
2020/01/06 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
2020/08/06 Javascript
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
Python ValueError: invalid literal for int() with base 10 实用解决方法
2015/06/21 Python
python远程连接服务器MySQL数据库
2018/07/02 Python
Django实现文件上传下载
2019/10/06 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
Python流程控制常用工具详解
2020/02/24 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
Python中过滤字符串列表的方法
2020/12/22 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
PHP两种查询函数array/row的区别
2013/06/03 面试题
大学生应聘推荐信范文
2013/11/19 职场文书
美发活动策划书
2014/01/14 职场文书
迅雷Cued工作心得体会
2014/01/27 职场文书
奥利奥广告词
2014/03/20 职场文书
2014年世界艾滋病日演讲稿
2014/11/28 职场文书
2015年推普周活动方案
2015/05/06 职场文书
2016继续教育研修日志
2015/11/13 职场文书
解决numpy数组互换两行及赋值的问题
2021/04/17 Python