Webpack2中的NamedModulesPlugin与HashedModuleIdsPlugin

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

内容简介: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》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

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

Letting Go of the Words

Letting Go of the Words

Janice (Ginny) Redish / Morgan Kaufmann / 2007-06-11 / USD 49.95

"Redish has done her homework and created a thorough overview of the issues in writing for the Web. Ironically, I must recommend that you read her every word so that you can find out why your customer......一起来看看 《Letting Go of the Words》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具