详解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 相关文章推荐
参考:关于Javascript中实现暂停的几篇文章
Mar 04 Javascript
Checbox的操作含已选、未选及判断代码
Nov 07 Javascript
jQuery实现不断闪烁文字的方法
May 15 Javascript
js实现跨域的方法实例详解
Jun 24 Javascript
javascript实现根据3原色制作颜色选择器的方法
Jul 17 Javascript
基于jQuery实现仿百度首页选项卡切换效果
May 29 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
Jun 21 Javascript
JavaScript中子对象访问父对象的方式详解
Sep 01 Javascript
详解vue2.0组件通信各种情况总结与实例分析
Mar 22 Javascript
在百度搜索结果中去除掉一些网站的资料(通过js控制不让显示)
May 02 Javascript
Avalonjs双向数据绑定与监听的实例代码
Jun 23 Javascript
创建Vue项目以及引入Iview的方法示例
Dec 03 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数据文件缓存类汇总
2014/12/05 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
九种js弹出对话框的方法总结
2013/03/12 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
JQuery调用绑定click事件的3种写法
2015/03/28 Javascript
JavaScript获取表单内所有元素值的方法
2015/04/02 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
简单实现兼容各大浏览器的js复制内容到剪切板
2015/09/09 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
基于casperjs和resemble.js实现一个像素对比服务详解
2018/01/10 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
微信小程序实现文字从右向左无限滚动
2020/11/18 Javascript
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
在react-antd中弹出层form内容传递给父组件的操作
2020/10/24 Javascript
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
python 自动提交和抓取网页
2009/07/13 Python
PyQt5 窗口切换与自定义对话框的实例
2019/06/20 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
Python爬虫实例——爬取美团美食数据
2020/07/15 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
CAT鞋加拿大官网:CAT Footwear加拿大
2020/08/05 全球购物
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
医学护理毕业生自荐信
2013/11/07 职场文书
骨干教师培训方案
2014/05/06 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
小学生推普周国旗下讲话稿
2014/09/21 职场文书
绿色校园广播稿
2014/10/13 职场文书
匿名信格式范文
2015/05/27 职场文书
婚庆答谢词大全
2015/09/29 职场文书
无线电通信名词解释
2022/02/18 无线电