简单谈谈CommonsChunkPlugin抽取公共模块


Posted in Javascript onDecember 31, 2017

引言

webpack插件CommonsChunkPlugin的主要作用是抽取webpack项目入口chunk的公共部分,具体的用法就不做过多介绍,不太了解可以参考webpack官网介绍;

该插件是webpack项目常用的一个优化功能,几乎在每个webpack项目中都会用到。使用该插件带来的好处:

提升webpack打包速度和项目体积:将webpack入口的chunk文件中所有公共的代码提取出来,减少代码体积;同时提升webpack打包速度。

利用缓存机制:依赖的公共模块文件一般很少更改或者不会更改,这样独立模块文件提取出可以长期缓存。

但是在项目中,若插件打开方式不正确的话,上面的第二点其实是无法实现,因为这种情况下:

没有被修改过的公有代码或库代码打包出的Entry Chunk,会随着其他业务代码的变化而变化,导致页面上的长缓存机制失效。

那么,下面就来开启CommonsChunkPlugin正确的打开方式。

CommonsChunkPlugin不正确用法

假如将我们项目的公共库如react、react-dom、react-router与业务代码隔离,将其提取为vendor chunk,webpack配置如下:

const webpack = require("webpack");
const path = require('path');
module.exports = {
 entry: {
 app: "./app.js",
 vendor: ["react","react-dom", "redux", "react-redux", "react-router-redux"]
 },
 output: {
 path: path.resolve(__dirname, 'output'),
 filename: "[name].[chunkhash].js"
 },
 plugins: [
 new webpack.optimize.CommonsChunkPlugin({names: ["vendor"]})
 ]
};

上面将项目一些基础库打包成一个名为vendor的chunk中,并将业务相关的代码打包到一个名为app的chunk中;

webpack打包编译后的结果如下:

简单谈谈CommonsChunkPlugin抽取公共模块

我们对其中的业务代码app.js进行修改后,重新编译结果如下:

简单谈谈CommonsChunkPlugin抽取公共模块

可以发现,在CommonsChunkPlugin这种配置下,当业务代码app发生变化,而库代码也跟着变化,vender的chunkhash也跟着变化,这样vendor的引用的名称跟着变化,导致浏览器端的长缓存机制失效。

引起问题的原因

引起webpack每次打包编译时vendor跟着变化的原因:

webpack每次build的时候都会生成一些运行时代码。当只有一个文件时,运行时代码直接塞到这个文件中。当有多个文件时,运行时代码会被提取到公共文件中,也就是上面CommonsChunkPlugin配置的vendor chunk中。

webpack每次编译时产生的运行时代码,包括全局webpackJsonp方法的定义和维护模块依赖关系,具体可以参考这里的commons.js。

所以,上面webpack的CommonsChunkPlugin配置中,每次编译时这些代码都会打包到vendor中,导致每次vendor的chunkhash每次都会变化。

那么,我们可以在对vendor chunk进行配置,抽取其中的公共代码,即webpack运行时代码,这样就可以将项目依赖的基础库模块与业务模块隔离开来,因为不会对这些文件进行修改,所以这些文件可达到长缓存的作用。具体配置如下:

module.exports = {
 entry: {
 app: "./app.js",
 vendor: ["react","react-dom", "redux", "react-redux", "react-router-redux"]
 },
 ....
 plugins: [
 new webpack.optimize.CommonsChunkPlugin({names: ["vendor"]}),
 new webpack.optimize.CommonsChunkPlugin({
 name: 'manifest',
 chunks: ['vendor']
 })
 ]
};

这样,即使修改业务app代码,项目依赖的基础库vendor chunk也不会发生变化;只是抽取的manifest chunk每次还会变化,但是这个文件体积非常小,相比vendor来说这种方式的收益更大。如下图:

简单谈谈CommonsChunkPlugin抽取公共模块

修改app代码后的打包编译结果如下,可以看到vendor的chunkhash没有变化

简单谈谈CommonsChunkPlugin抽取公共模块

在webpack中配置CommonsChunkPlugin时需要注意一点:

配置webpack的output项时,其filename和chunkFilename必须使用chunkhash。不要使用hash,否则即使按照上面的配置也不能达到预期的效果。至于hash与chunkhash的区别,可参考github的回答

以上这篇简单谈谈CommonsChunkPlugin抽取公共模块就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js常见表单应用技巧
Jan 09 Javascript
js 替换
Feb 19 Javascript
纯js实现的论坛常用的运行代码的效果
Jul 15 Javascript
基于JQUERY的两个ListBox子项互相调整的实现代码
May 07 Javascript
JavaScript Ajax编程 应用篇
Jul 02 Javascript
AngularJS删除路由中的#符号的方法
Sep 20 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
Jun 22 jQuery
JavaScrpt中如何使用 cookie 设置查看与删除功能
Jul 09 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
Mar 15 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
Jun 22 Javascript
小程序实现留言板
Nov 02 Javascript
JS实现动态添加外部js、css到head标签的方法
Jun 05 Javascript
AngularJS基于MVC的复杂操作实例讲解
Dec 31 #Javascript
jQuery实现页码跳转式动态数据分页
Dec 31 #jQuery
React数据传递之组件内部通信的方法
Dec 31 #Javascript
javascript 通过键名获取键盘的keyCode方法
Dec 31 #Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
Dec 29 #Javascript
Angular实现的内置过滤器orderBy排序与模糊查询功能示例
Dec 29 #Javascript
Angular实现的敏感文字自动过滤与提示功能示例
Dec 29 #Javascript
You might like
第一个无线电台是由谁发明的
2021/03/01 无线电
关于crontab的使用详解
2013/06/24 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
详解提高使用Java反射的效率方法
2019/04/29 PHP
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
Extjs单独定义各组件的实例代码
2013/06/25 Javascript
Jquery实现的角色左右选择特效
2014/05/21 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
jQuery简单实现验证邮箱格式
2015/07/15 Javascript
js操作浏览器的参数方法
2017/01/21 Javascript
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
Angular7创建项目、组件、服务以及服务的使用
2019/02/19 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
[02:33]DOTA2英雄基础教程 司夜刺客
2013/12/04 DOTA
Python常用的日期时间处理方法示例
2015/02/08 Python
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
对python pandas 画移动平均线的方法详解
2018/11/28 Python
Python寻找两个有序数组的中位数实例详解
2018/12/05 Python
Python中@property的理解和使用示例
2019/06/11 Python
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
2020/01/14 Python
Python使用正则表达式实现爬虫数据抽取
2020/08/17 Python
如何基于Python爬虫爬取美团酒店信息
2020/11/03 Python
奥地利手表、香水、化妆品和珠宝购物网站:Brasty.at
2021/01/17 全球购物
什么是TCP/IP
2014/07/27 面试题
大学生职业生涯规划方案
2014/01/03 职场文书
前台文员个人求职信范文
2014/01/05 职场文书
车祸赔偿收入证明
2014/01/09 职场文书
元旦获奖感言
2014/03/08 职场文书
法定授权委托证明书
2014/09/27 职场文书
党政领导班子四风问题对照检查材料思想汇报
2014/10/02 职场文书
导游词欢迎词
2015/02/02 职场文书
服务员岗位职责范本
2015/04/09 职场文书
《叶问2》观后感
2015/06/15 职场文书