详解webpack编译速度提升之DllPlugin


Posted in Javascript onFebruary 05, 2019

一、前言

The DllPlugin and DllReferencePlugin provide means to split bundles in a way that can drastically improve build time performance.

DllPlugin 结合 DllRefrencePlugin 插件的运用,对将要产出的bundle文件进行拆解打包,可以很彻底地加快webpack的打包速度,从而在开发过程中极大地缩减构建时间。

二、构建效果

结论先行: 使用 DllPluginDllRefrencePlugin 进行构建,可以缩减50%~70%的构建时间。

参考Demo: dllplugin-demo

2.1 使用DllPlugin前的构建速度

详解webpack编译速度提升之DllPlugin 

入口文件 main.js 引入了一个 jQuery

文件,图示打包耗时2.3s。

2.2 使用DllPlugin后的构建速度

详解webpack编译速度提升之DllPlugin 

使用插件后,打包耗时0.6s,单次对比,缩减时长达到73%! 2.3 如何验证DLLPlugin已经生效

对比上面两张图打包的模块列表,图二有一行不一样的输出:

[0] delegated ./src/components/jquery.js from dll-reference vendor_57c12dcd8d9774596525 42 bytes {0} [built]

这说明,此次的打包过程,没有重新打包 jQuery 模块,而是直接从 vendor_57c12dcd8d9774596525 中代理了。

三、Get Started

DllPlugin作用示意图:

详解webpack编译速度提升之DllPlugin 

3.1 配置webpack.dll.config.js打包静态公共资源

3.1.1 定义webpack.dll.config.js

为了减小篇幅,只帖关键配置内容,详细访问 dllplugin-demo :

// webpack.dll.config.js
module.exports = {
  entry: {
    // 定义程序中打包公共文件的入口文件vendor.js
    vendor: [path.resolve(src, 'js', 'vendor.js')],
  },
  
  plugins: [
    new webpack.DllPlugin({
      // manifest缓存文件的请求上下文(默认为webpack执行环境上下文)
      context: process.cwd(),
      
      // manifest.json文件的输出位置
      path: path.join(src, 'js', 'dll', '[name]-manifest.json'),
      
      // 定义打包的公共vendor文件对外暴露的函数名
      name: '[name]_[hash]'
    })
  ]
}

3.1.2 声明静态公共资源

在配置好 webpack.dll.config.js 文件之后,在 vendor.js 中声明项目程序中所引用的静态公共资源。

// vendor.js
// 引入自定义在项目目录中的公共资源(可以在配置中声明alias映射关系)
import 'jquery';

// or 引入npm包资源
// import 'Vue';

3.1.3 打包静态公共资源

// cross-env模块需要另外安装
cross-env NODE_ENV=production webpack --config webpack.dll.config.js --colors --display-modules

根据 webpack.dll.config.js ,会在指定位置生成 vendor.dll.js 文件。

3.2 配置webpack.config.js打包入口文件

生成静态公共资源 vendor.dll.js 之后,下一步就要在入口文件中关联引用,这项工作则是由 DllRefrencePlugin 完成的。

3.2.1 在webpack.config.js中关联引用

// webpack.config.js
module.exports = {
  entry: {
    // 项目入口文件
    'app':path.resolve(src, 'js', 'main.js')
  },
  plugins: [
    // dllPlugin关联配置
    new webpack.DllReferencePlugin({
      // 跟dll.config里面DllPlugin的context一致
      context: process.cwd(), 
      
      // dll过程生成的manifest文件
      manifest: require(path.join(src, 'js', "dll", "vendor-manifest.json"))
    })
  ]
}

3.2.2 项目入口文件中引用静态公共资源

// main.js
// 引入的公共模块如果在vendor中有被引用过,那么编译的时候直接使用静态文件vendor.dll.js
import $ from 'jquery';
console.log($)

// import Vue from "Vue";
// console.log(Vue)

引入方式没有什么不同的,跟平时正常引入即可。

3.2.3 项目模板中引用公共静态资源

最后一步,在模板中注入 vendor.dll.js

<!-- index.html -->
<script type="text/javascript" src="/src/js/dll/vendor.dll.js"></script>

如此,在接下来的本地开发(dev过程)和线上构建过程,将不再重复静态公共资源的构建,极大地缩减我们的构建时间。

结语

以上为webpack(Version 4)使用过程中的小小总结,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery ajax 检测用户注册时用户名是否存在
Nov 03 Javascript
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
Apr 15 Javascript
JS判断对象是否存在的10种方法总结
Dec 23 Javascript
js和css写一个可以自动隐藏的悬浮框
Mar 05 Javascript
jquery实现简单的全选和反选功能
Jan 02 Javascript
javascript类型系统 Window对象学习笔记
Jan 07 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
Sep 19 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
Jan 04 Javascript
使用JS 插件qrcode.js生成二维码功能
Feb 20 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
Apr 03 jQuery
HTML5+JS+JQuery+ECharts实现异步加载问题
Dec 16 jQuery
vue动画效果实现方法示例
Mar 18 Javascript
基于Webpack4和React hooks搭建项目的方法
Feb 05 #Javascript
利用Dectorator分模块存储Vuex状态的实现
Feb 05 #Javascript
小程序页面动态配置实现方法
Feb 05 #Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
Feb 02 #Javascript
AngularJS实现的自定义过滤器简单示例
Feb 02 #Javascript
vue实现的树形结构加多选框示例
Feb 02 #Javascript
javascript中floor使用方法总结
Feb 02 #Javascript
You might like
PHP制作图型计数器的例子
2006/10/09 PHP
PHP中is_file不能替代file_exists的理由
2014/03/04 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
PHPstorm启用自动换行的方法详解(IDE)
2020/09/17 PHP
Mootools 1.2教程 同时进行多个形变动画
2009/09/15 Javascript
js自定义事件代码说明
2011/01/31 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
js使用心得分享
2015/01/13 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
js实现顶部可折叠的菜单工具栏效果实例
2015/05/09 Javascript
JS中dom0级事件和dom2级事件的区别介绍
2016/05/05 Javascript
jQuery插件 Jqplot图表实例
2016/06/18 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
JS表格组件BootstrapTable行内编辑解决方案x-editable
2016/09/01 Javascript
微信小程序前端源码逻辑和工作流
2016/09/25 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
vue2.0 + element UI 中 el-table 数据导出Excel的方法
2018/03/02 Javascript
基于js实现逐步显示文字输出代码实例
2020/04/02 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
Python正规则表达式学习指南
2016/08/02 Python
Python分治法定义与应用实例详解
2017/07/28 Python
Python3 加密(hashlib和hmac)模块的实现
2017/11/23 Python
python分块读取大数据,避免内存不足的方法
2018/12/10 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
详解Scrapy Redis入门实战
2020/11/18 Python
苹果美国官方商城:Apple美国
2016/08/24 全球购物
电大自我鉴定
2013/10/27 职场文书
测绘工程专业个人自我评价
2013/12/01 职场文书
个人公开承诺书
2014/03/28 职场文书
新员工试用期自我鉴定
2014/04/17 职场文书
2015年企业新年寄语
2014/12/08 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
详解Python类和对象内容
2021/06/22 Python