背景

我司前端项目框架主要是 vue,多个项目聚集在同一个仓库下,共用公共组件、页面、工具函数等。基于以上前提,我们需要对不同的项目分别进行打包,并解决单页应用强制刷新引起的问题,所以没有使用 vue-cli 来创建,而是使用 webpack 重新编写了一套打包流程。

随着代码量的增长(百万行级),加之电脑硬件性能不高等因素,我感觉项目初次启动时间越来越慢,目前大概在一分半到两分钟之间。某次编译启动时间如下:

泄特!这大大降低了开发体验。

找方案

网络上有很多关于 webpack 构建时间优化的文章,随便一搜就是一堆,这里就不一一列出来了。总结下来,可以由一下几个方面入手:

  • vue、vuex等不轻易更改的库,使用外部链接
  • 文件缓存
  • 多核并发编译

在一切开始之前,我更推荐先阅读以下官方文档:

方案实施

我基本上是按照上面的思路进行的,截取部分代码以作参考:

const config = {
externals: { // 下面这些库使用外部链接,不会被打包
'vue': 'Vue',
'vue-router': 'VueRouter',
'vuex': 'Vuex',
'buffer': 'undefined', // js-base64 require('buffer')
}, module: {
rules: [
{ // 对 vue 文件,使用 cache-loader 进行缓存
test: /\.vue$/,
loader: 'vue-loader',
options: {
cacheDirectory: path.resolve(__dirname, '../node_modules/.cache/vue-loader'),
cacheIdentifier: 'cache-loader:{version} {process.env.NODE_ENV}'
}
},
{ // 对 .js 文件,开启 babel-loader 自带的缓存
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader?cacheDirectory=true',
},
]
// 其他规则
}
}

经过这两步简单的操作,把原本 100s 左右的构建时间,缩短成 30s 左右。

当然,还可以使用 happyPack 或是 thread-loader 进一步压榨机器性能。然而配置略微复杂,且目前已够用,以后有需要在加吧。

其中不得不提一下 vue 规则中的 cacheDirectory,按照上面编写的路径,打包完成后,我没有在 node_modules/.cache 文件夹下找到 vue-loader 这个缓存文件夹,以及 babel-loader 缓存文件夹。但如果更改 vue 规则中 cacheDirectory 的路径,譬如说项目根目录下,打包完成后,会在跟目录下创建 vue-loader 这个文件夹,同时,在 node_modules/.cache/ 文件夹下也会生成 vue-loader 和 babel-loader 文件夹。存疑

如何减少 webpack 构建 vue 项目的编译时间的更多相关文章

  1. webpack构建vue项目(配置篇)

    最近公司要求用vue重构项目,还涉及到模块化开发,于是乎,我专门花了几天的时间研究了一下webpack这个目前来看比较热门的模块加载兼打包工具,发现上手并不是很容易,现将总结的一些有关配置的心得分享出 ...

  2. 利用webpack构建vue项目

    快速搭建vue项目 一,确认自己有无搭建好node以及npm环境,这些是前提,具体安装方法可参考https://nodejs.org/en/. 二,开始构建项目. 第1步:新建一个文件夹,随意命名. ...

  3. 用Webpack构建Vue项目

    开始之前,需要安装node环境.(安装过程在此就不啰嗦了)   1.创建基本结构 首先我们要创建一个空文件夹(我这里叫todos,你可以随便命名)作为项目的根目录. 创建一个没有任何依赖关系的pack ...

  4. 提高 webpack 构建 Vue 项目的速度

    前言 最近有人给我的 Vue2 后台管理系统解决方案 提了 issue ,说执行 npm run build 构建项目的时候极其慢,然后就引起我的注意了.在项目中,引入了比较多的第三方库,导致项目大, ...

  5. webpack构建vue项目(再谈配置)

    webpack配置起来确实麻烦,这不,之前用刚配好了vue1+的版本,结果在(部分)安卓机上测试,发现存在开启热加载(dev-server)的情况下不能识别vue语法的问题,试了很多方法,都没能很好的 ...

  6. webpack构建Vue项目引入jQ时发生“'$' is defined but never used”的处理

    今天公司需要新建个数据后台,就按照查到的方法构建了Vue框架的项目,引入jQ.bootstrap时,按照在线方法配置,发现 main.js 里的引用jQ一直显示红标,没多想,在按照网上配置完后,npm ...

  7. vue,一路走来(1)--构建vue项目

    2016年12月--2017年5月,接触前端框架vue,一路走来,觉得有必要把遇到的问题记录下来. 那时,vux用的是1.0的vue,然而vue2.0已经出来了,于是我结合了mint-ui一起来做项目 ...

  8. vue-cli快速构建vue项目模板

    vue-cli 是vue.js的脚手架,用于自动生成vue.js模板工程的. 1.使用npm安装vue-cli 需要先装好vue 和 webpack(前提是已经安装了nodejs,否则连npm都用不了 ...

  9. 自动化工具构建vue项目

    其实之前对vue的话也有过一段时间的学习,博客园也是写了5篇vue的学习笔记.但是一直是通过CDN的方式在html文件头部引入vue.js,然后实例化vue对象绑定Dom,写组件写方法.就算是在实际项 ...

随机推荐

  1. salesforce零基础学习(九十四)classic下pagelayout引入的vf page弹出内容更新此page layout

    我们在classic环境中,有时针对page layout不能实现的地方,可以引入 一个vf page去增强标准的 page layout 功能,有时可能要求这个 vf page的部分修改需要更新此 ...

  2. Spring Boot 实战 入门

    目前没有系统学习过 Spring 框架,参与工作时,直接参与到了 Spring Boot 项目的开发.目前还比较菜,所以,你要是和我一样,不妨也跳过 Spring 框架的学习,直接学习 Sring B ...

  3. 如何设计提高服务API的安全性(二)API密钥方式详解

    在上文已经讲述了基础介绍,这篇文章详细讲解API密钥方式. 利用何种加密方式呢? 经过上面加密算法的理解,单向加密不仅性能高,而且有压缩性,即长度一致,有效减少网络传输过程中的字节大小.适合我们这种调 ...

  4. JDK安装—JAVA

    下载JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 关于版本选择需要注意的问题: 如果eclip ...

  5. SpringCloud学习第三章-springcloud 父项目创建

    父项目 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...

  6. flask项目结构

    project/ app/ # 整个程序的包目录 static/ # 静态资源文件 js/ # JS脚本 css/ # 样式表 img/ # 图片 favicon.ico # 网站图标 templat ...

  7. Linux shell if条件判断1

    shell 逻辑控制语句:            分支判断结构        if        case     循环结构         for         while         unt ...

  8. Linux shell之重定向输入,输出

    shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户.这种对话方式可以是交互的方式(从键盘输入命令 ...

  9. Mysql数据库之备份还原(mysqldump,LVM快照,select备份,xtrabackup)

    备份类型: 热备份:读写不受影响 温备份:仅可执行读备份 冷备份:离线备份,读写均不能执行,关机备份 物理备份和逻辑备份 物理备份:复制数据文件,速度快. 逻辑备份:将数据导出之文本文件中,必要时候, ...

  10. QElapsedTimer定时器记录程序执行时间

    QElapedTimer类提供了一种快速计算运行时间的方法,从Qt4.7引入. QElapsedTimer类通常用于快速计算两个事件之间经过了多少时间.它的API与QTime相似,因此可以将正在使用的 ...