DllPlugin

DllPluginDllReferencePlugin 插件提供了一种拆分 bundle 的方式,可以显著提高构建时间性能。“DLL” 是 “Dynamic-link library”(动态链接库)的缩写,最初由微软引入。

DllPlugin

此插件用于一个独立的 webpack 配置中,专门用于创建一个仅包含 DLL 的 bundle。它会创建一个 manifest.json 文件,该文件由 DllReferencePlugin 用于映射依赖。

  • context (可选): manifest 文件中请求的上下文 (默认为 webpack 上下文)。
  • format (boolean = false): 如果为 true,manifest JSON 文件 (输出) 将被格式化。
  • name: 暴露的 DLL 函数的名称 (TemplatePaths: [fullhash], [chunkhash], [contenthash], & [name] )
  • path: manifest JSON 文件 (输出) 的绝对路径
  • entryOnly (boolean = true): 如果为 true,将只暴露入口点。
  • type: DLL bundle 的类型。
new webpack.DllPlugin(options);

创建一个 manifest.json 文件,并写入给定 path。它包含从 require 和 import 请求到模块 ID 的映射。它被 DllReferencePlugin 使用。

将此插件与 output.library 选项结合使用,以暴露(即,放入全局作用域)DLL 函数。

DllReferencePlugin

此插件用于主 webpack 配置中,它引用仅包含 DLL 的 bundle(s) 以按需加载预构建的依赖。

  • context: (绝对路径) manifest (或 content 属性) 中请求的上下文。
  • extensions: 用于解析 DLL bundle 中模块的扩展名(仅在使用 'scope' 时使用)。
  • manifest : 一个包含 contentname 的对象,或者一个指向编译时要加载的 JSON manifest 文件的绝对路径字符串。
  • content (可选): 从请求到模块 ID 的映射 (默认为 manifest.content)。
  • name (可选): DLL 暴露的标识符 (默认为 manifest.name) (另请参阅 externals)。
  • scope (可选): 用于访问 DLL 内容的前缀。
  • sourceType (可选): DLL 的暴露方式 (libraryTarget)。
new webpack.DllReferencePlugin(options);

引用一个 DLL manifest 文件,将依赖名称映射到模块 ID,然后根据需要使用内部的 __webpack_require__ 函数来引用它们。

模式

此插件可用于两种不同的模式:作用域模式 (scoped)映射模式 (mapped)

作用域模式 (Scoped Mode)

DLL 的内容可通过模块前缀访问。例如,当 scope = 'xyz' 时,DLL 中的文件 abc 可以通过 require('xyz/abc') 访问。

映射模式 (Mapped Mode)

DLL 的内容被映射到当前目录。如果一个被引用的文件(解析后)与 DLL 中的文件匹配,那么将使用 DLL 中的文件。

因为这发生在解析 DLL bundle 中的每个文件之后,所以对于 DLL bundle 的使用者,必须提供相同的路径。例如,如果 DLL 包含 lodash 和文件 abc,那么 require('lodash')require('./abc') 将会从 DLL 中使用,而不是将它们构建到主 bundle 中。

用法

webpack.vendor.config.js

const path = require('path');

new webpack.DllPlugin({
  context: __dirname,
  name: '[name]_[fullhash]',
  path: path.join(__dirname, 'manifest.json'),
});

webpack.app.config.js

new webpack.DllReferencePlugin({
  context: __dirname,
  manifest: require('./manifest.json'),
  scope: 'xyz',
  sourceType: 'commonjs2',
});

示例

VendorUser

两个独立的示例文件夹。演示了作用域 (scope) 和上下文 (context)。

参考

源码

测试

延伸阅读

9 贡献者

aretecodesokraopiepjsimon04skipjackbyzykEugeneHlushkoEslamHikosnitin315