Webpack2 中的 NamedModulesPlugin 与 HashedModuleIdsPlugin
要讨论Webpack 2中新增的这两个plugin的功能,还要先从使用Webpack打包的项目的前端资源缓存方案说起。
通常在使用了Webpack的项目中我们会使用CommonsChunkPlugin来将所有依赖的第三方包打包到一个名为vender的chunk中。与此同时,为了避免每次更改项目代码时导致vender chunk的chunkHash改变,我们还会单独生成一个manifest chunk。
举个例子,假设我们有一个项目,项目中入口文件为index.js。其内容如下:
import add from './src/add';
import leftPad from 'left-pad';
import jsonp from 'jsonp';
add(1, 2);
通常我们的webpack.config.js文件就会有类似如下的配置:
const path = require('path');
const webpack = require('webpack');
module.exports = {
entry: {
'app': './index.js',
'vender': ['left-pad', 'jsonp']
},
output: {
filename: '[name].[chunkHash].js',
path: path.resolve(__dirname, 'build')
},
resolve: {
extensions: ['.js']
},
module: {
...
},
plugins:[
new webpack.optimize.CommonsChunkPlugin({
name: ['vender', 'manifest'],
minChunks: Infinity,
})
]
};
这时,通过Webpack打包,会生成三个文件:

假设我们修改了./src/add.js文件,重新打包,会得到:

可以看到只有app和manifest这两个chunk的chunkHash改变了,而vender的chunkHash和之前保持了一致。这就使得vender可以被缓存在客户端,从而减少客户端的下载量。
但如果是新添加一个文件呢?
假设我们在项目中新加了一个文件./src/add2.js。此时index.js的内容如下:
import add from './src/add';
import add2 from './src/add2';
import leftPad from 'left-pad';
import jsonp from 'jsonp';
add(1, 2);
add2(1);
此时再次构建,会得到如下的输出:

这就和我们期望的行为不一致了,因为我们并没有修改依赖的第三方包,但是vender chunk的chunkHash也发生了更改。
导致这个结果的原因在于,由于引入了一个新模块,使得打包过程中部分模块的模块ID发生了改变。而模块ID的改变,直接导致了包含这些模块的chunk内容改变,进而导致chunkHash的改变。
注意看下图:

蓝色框中的模块ID为3的模块就是我们新加的模块。由于它被插在了ID为3的位置,导致后续所有模块的ID都发生了更改。
既然找到了问题的原因,那么解决方案也就很明了了。那就是找到一种和顺序无关的模块ID命名方式。最容易想到的就是基于文件名或者文件内容的哈希值这两种方案了。其实也就是今天要说的NamedModulesPlugin与HashedModuleIdsPlugin的功能。
比如,我们在项目中启用HashedModuleIdsPlugin:
plugins:[
new webpack.optimize.CommonsChunkPlugin({
name: ['vender', 'manifest'],
minChunks: Infinity,
}),
new webpack.HashedModuleIdsPlugin()
]
此时,再次构建项目得到:

可以看到各个模块的ID已经变成一小段哈希值。这时,在项目中添加./src/add2.js。重新构建,得到输出:

可以看出,两次构建之间,vender chunk的chunkhash以及各模块的模块ID都保持了一致。从而达到了最佳的缓存效果。
使用NamedModulesPlugin效果类似,此处不再演示。本文涉及的所有代码都可以在github上找到。
Webpack2 中的 NamedModulesPlugin 与 HashedModuleIdsPlugin的更多相关文章
- Webpack 2 视频教程 011 - Webpack2 中加载 CSS 的相关配置与实战
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...
- webpack2归纳总结
本文github仓库:https://github.com/Rynxiao/webpack2-learn 从v1迁移到v2 1. 配置类型 在webpack1的时候,主要是通过导出单个object来进 ...
- webpack1.x 升级到 webpack2.x 英文文档翻译
近日项目要升级到webpack2.2,原来使用的webpack版本是1.12,在升级项目的同时,翻译一下官方的升级文档,去掉了一些不常用的配置 resolve.root, resolve.fallba ...
- omi-cli新版发布-升级webpack2和支持sass生成组件局部CSS
写在前面 omi-cli是Omi的命令行工具.在v0.1.X以及之前版本中,生成出来的项目脚手架 是基于webpack1的.由于: webpack1不支持tree-shaking,webpack2 支 ...
- 原创超清的 Webpack2 视频教程
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...
- Webpack2 升级指南和特性摘要(转)
Webpack2 升级指南和特性摘要 resolve.root, resolve.fallback, resolve.modulesDirectories 上述三个选项将被合并为一个标准配置项:res ...
- Webpack2 视频教程
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」.Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本 ...
- webpack2 详解
1.安装 npm install webpack -g npm install webpack -save-dev 2.编辑配置文件 // 引入 path var path=require('path ...
- webpack2.0 基本使用
webpack是一款前端模块打包工具, 它的出现是由于现代web开发越来越复杂,如果还是像原来那样把所有的js代码都写到一个文件中,维护非常困难.而解决复杂化的方法通常是分而治之,就是把复杂化的东西进 ...
随机推荐
- 面向对象【day08】:异常处理(六)
本节内容 1.概述 2.异常梳理 3.异常梳理流程图 4.异常大全 5.自定义异常 一.概述 异常处理是当程序出错了,但是我们又不想让用户看到这个错误,而且我在写程序的时候已经预料到了它可以出现这样的 ...
- SpringBoot笔记十六:ElasticSearch
目录 ElasticSearch官方文档 ElasticSearch安装 ElasticSearch简介 ElasticSearch操作数据,RESTful风格 存储 检查是否存在 删除 查询 更新 ...
- VScode-Common-Shortcut
Keyboard shortcuts for windows Keyboard Shortcut For Windows General Shortcut Commands Ctrl + Shift ...
- MySQL中innodb_flush_log_at_trx_commit的设置
innodb_flush_log_at_trx_commit=0,在提交事务时,InnoDB不会立即触发将缓存日志写到磁盘文件的操作,而是每秒触发一次缓存日志回写磁盘操作,并调用操作系统fsync刷新 ...
- Entity Framework Code First 学习日记(1)精
我最近几天正在学习Entity Framework Code First.我打算分享一系列的学习笔记,今天是第一部分: 为什么要使用Code First: 近 年来,随着domain driven d ...
- Spark SQL基本概念与基本用法
1. Spark SQL概述 1.1 什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了两个编程抽象分别叫做DataFrame和DataSet,它们用于作为 ...
- java 调用 python 脚本
有时候在java项目里,需要执行Python脚本以下几种方式: 1.直接执行Python脚本代码 引用 org.python包 创建一个 python解释器,貌似这种方式不可以导入第三方库,模块... ...
- 我手机上常用的app和常访问的网站
====常用======Opera Mini browser 浏览器(版本26.0.2254.117241以上) 老版本7.7最最经典, 但该版本在新的安卓手机上总有部分区域显示空白. 现在的 Ope ...
- 破解修改 Electron 软件 | 游戏
Electron 是 Github 发布跨平台桌面应用开发工具,支持 Web 技术开发桌面应用开发,其本身是基于 C++ 开发的,GUI 核心来自于 Chrome,而 JavaScript 引擎使用 ...
- 【D3D】Directx12运行报错&win10无法添加【图形工具】
“我欢欣雀跃地打开<3D programming with Directx12>,准备接受D3D的洗礼,然后就卡在了 chapter 0 .”——Liez 100%纯小白的chapter ...