Webpack2中的NamedModulesPlugin与HashedModuleIdsPlugin

栏目: Json · 发布时间: 6年前

内容简介: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打包,会生成三个文件:

Webpack2中的NamedModulesPlugin与HashedModuleIdsPlugin

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

Webpack2中的NamedModulesPlugin与HashedModuleIdsPlugin

可以看到只有 appmanifest 这两个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);

此时再次构建,会得到如下的输出:

Webpack2中的NamedModulesPlugin与HashedModuleIdsPlugin

这就和我们期望的行为不一致了,因为我们并没有修改依赖的第三方包,但是 vender chunk的chunkHash也发生了更改。

导致这个结果的原因在于, 由于引入了一个新模块,使得打包过程中部分模块的模块ID发生了改变。 而模块ID的改变,直接导致了包含这些模块的chunk内容改变,进而导致chunkHash的改变。

注意看下图:

Webpack2中的NamedModulesPlugin与HashedModuleIdsPlugin

蓝色框中的模块ID为3的模块就是我们新加的模块。由于它被插在了ID为3的位置,导致后续所有模块的ID都发生了更改。

既然找到了问题的原因,那么解决方案也就很明了了。那就是 找到一种和顺序无关的模块ID命名方式。 最容易想到的就是基于文件名或者文件内容的哈希值这两种方案了。其实也就是今天要说的NamedModulesPlugin与HashedModuleIdsPlugin的功能。

比如,我们在项目中启用HashedModuleIdsPlugin:

plugins:[
        new webpack.optimize.CommonsChunkPlugin({
            name: ['vender', 'manifest'],
            minChunks: Infinity,
        }),
        new webpack.HashedModuleIdsPlugin()
  ]

此时,再次构建项目得到:

Webpack2中的NamedModulesPlugin与HashedModuleIdsPlugin

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

Webpack2中的NamedModulesPlugin与HashedModuleIdsPlugin

可以看出,两次构建之间, vender chunk的chunkhash以及各模块的模块ID都保持了一致。从而达到了最佳的缓存效果。

使用 NamedModulesPlugin 效果类似,此处不再演示。本文涉及的所有代码都可以在 github 上找到。


以上所述就是小编给大家介绍的《Webpack2中的NamedModulesPlugin与HashedModuleIdsPlugin》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

图解密码技术(第3版)

图解密码技术(第3版)

[日] 结城浩 / 周自恒 / 人民邮电出版社 / 2016-6 / 89.00元

本书以图配文的形式,详细讲解了6种最重要的密码技术:对称密码、公钥密码、单向散列函数、消息认证码、数字签名和伪随机数生成器。 第1部分讲述了密码技术的历史沿革、对称密码、分组密码模式(包括ECB、CBC、CFB、OFB、CTR)、公钥、混合密码系统。第2部分重点介绍了认证方面的内容,涉及单向散列函数、消息认证码、数字签名、证书等。第3部分讲述了密钥、随机数、PGP、SSL/TLS 以及密码技......一起来看看 《图解密码技术(第3版)》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具