详解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实现仿Windows关机效果
Mar 10 Javascript
javascript sudoku 数独智力游戏生成代码
Mar 27 Javascript
JS 控制小数位数的实现代码
Aug 02 Javascript
JS将秒换成时分秒实现代码
Sep 03 Javascript
实现51Map地图接口(示例代码)
Nov 22 Javascript
基于socket.io+express实现多房间聊天
Mar 17 Javascript
jquery 获取select数组与name数组长度的实现代码
Jun 20 Javascript
canvas时钟效果
Feb 16 Javascript
基于BootStrap multiselect.js实现的下拉框联动效果
Jul 28 Javascript
基于vue 实现token验证的实例代码
Dec 14 Javascript
layui 实现加载动画以及非真实加载进度的方法
Sep 23 Javascript
非常漂亮的js烟花效果
Mar 10 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 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
php实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
JS的数组迭代方法
2015/02/05 Javascript
包含中国城市的javascript对象实例
2015/08/03 Javascript
探索Javascript中this的奥秘
2016/12/11 Javascript
Mac下使用charles遇到的问题以及解决办法
2017/01/10 Javascript
nodejs实现发出蜂鸣声音(系统报警声)的方法
2017/01/18 NodeJs
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
nodejs集成sqlite使用示例
2017/06/05 NodeJs
详解Vuex中mapState的具体用法
2017/09/28 Javascript
轻松理解vue的双向数据绑定问题
2017/10/30 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】
2019/08/15 Javascript
详解基于原生JS验证表单组件xy-form
2019/08/20 Javascript
js实现数字滚动特效
2019/12/16 Javascript
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
python实现提取百度搜索结果的方法
2015/05/19 Python
详谈python http长连接客户端
2017/06/12 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
Django框架请求生命周期实现原理
2020/11/13 Python
使用Html5多媒体实现微信语音功能
2019/07/26 HTML / CSS
岗位廉洁从业承诺书
2014/03/28 职场文书
2014优秀党员事迹材料
2014/08/14 职场文书
假释思想汇报范文
2014/10/11 职场文书
2016年暑期见闻作文
2015/11/25 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers
win10系统xps文件怎么打开?win10打开xps文件的两种操作方法
2022/07/23 数码科技