详解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 路由和过滤器使用说明
Aug 02 Javascript
使用JavaScript 实现各种跨域的方法
May 08 Javascript
js中的异常处理try...catch使用介绍
Sep 21 Javascript
js微信分享API
Oct 11 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
Oct 30 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
Jan 06 Javascript
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
Sep 19 Javascript
小程序实现列表删除功能
Oct 30 Javascript
javascript实现小型区块链功能
Apr 03 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
Apr 07 Javascript
jQuery实现飞机大战小游戏
Jul 05 jQuery
详解Vue中的watch和computed
Nov 09 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防范SQL注入的具体方法详解(测试通过)
2014/05/09 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
js控制框架刷新
2008/08/01 Javascript
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
2013/10/23 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
2014/02/04 Javascript
js如何获取object类型里的键值
2014/02/18 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
For循环中分号隔开的3部分的执行顺序探讨
2014/05/27 Javascript
nodejs npm package.json中文文档
2014/09/04 NodeJs
原生JS实现图片左右轮播
2016/12/30 Javascript
详解vue过滤器在v2.0版本用法
2017/06/01 Javascript
常见的浏览器Hack技巧整理
2017/06/29 Javascript
Python实现多线程抓取妹子图
2015/08/08 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
PyQt5每天必学之工具提示功能
2018/04/19 Python
python打造爬虫代理池过程解析
2019/08/15 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
python实现文件+参数发送request的实例代码
2021/01/05 Python
详解CSS3中字体平滑处理和抗锯齿渲染
2017/03/29 HTML / CSS
HTML5拖拽API经典实例详解
2018/04/20 HTML / CSS
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
心理健康课教学反思
2014/02/13 职场文书
机械制造毕业生求职信
2014/03/03 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL
Win11快速关闭所有广告推荐
2022/04/19 数码科技
APP界面设计技巧和注意事项
2022/04/29 杂记