详解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 相关文章推荐
js如何取消事件冒泡
Sep 23 Javascript
鼠标经过tr时,改变tr当前背景颜色
Jan 13 Javascript
jquery动态添加删除一行数据示例
Jun 12 Javascript
node.js中的fs.readFile方法使用说明
Dec 15 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
Nov 29 Javascript
jQuery解析json格式数据简单实例
Jan 22 Javascript
VueJs监听window.resize方法示例
Jan 17 Javascript
基于element-ui的rules中正则表达式
Sep 04 Javascript
jQuery实现的老虎机跑动效果示例
Dec 29 jQuery
微信小程序收货地址API兼容低版本解决方法
May 18 Javascript
vue-router之实现导航切换过渡动画效果
Oct 31 Javascript
Jquery Datatables的使用详解
Jan 30 jQuery
基于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
phpfans留言版用到的install.php
2007/01/04 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
Zend Framework+smarty用法实例详解
2016/03/19 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
centos 7.2下搭建LNMP环境教程
2016/11/20 PHP
使用phpQuery获取数组的实例
2017/03/13 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
jquery 利用show和hidden实现级联菜单示例代码
2013/08/09 Javascript
jquery鼠标停止移动事件
2013/12/21 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
JS不完全国际化&amp;本地化手册 之 理论篇
2016/09/27 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
2017/02/22 Javascript
基于VUE实现的九宫格抽奖功能
2018/09/30 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
详解vue的数据劫持以及操作数组的坑
2019/04/18 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
2019/06/11 Javascript
小程序分享链接onShareAppMessage的具体用法
2020/05/22 Javascript
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
python模块之time模块(实例讲解)
2017/09/13 Python
Django组件content-type使用方法详解
2019/07/19 Python
python线程的几种创建方式详解
2019/08/29 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
Python守护进程实现过程详解
2020/02/10 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
New Balance德国官方网站:购买鞋子和服装
2019/08/31 全球购物
瑞典香水、须后水和美容产品购物网站:Parfym-Klick.se
2019/12/29 全球购物
.NET面试问题集
2015/12/08 面试题
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
远程教育心得体会
2014/01/03 职场文书
优秀管理者获奖感言
2014/02/17 职场文书
2014村务公开实施方案
2014/02/25 职场文书
党员创先争优心得体会
2014/09/11 职场文书
会计人员演讲稿
2014/09/11 职场文书
校园文化艺术节宣传标语
2014/10/09 职场文书
大学学生会主席竞选稿
2015/11/19 职场文书
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript