外部环境 | Externals
外部对象
externals
配置选项提供了「从输出的 bundle 中排除依赖」的方法。相反,所创建的 bundle 依赖于那些存在于用户环境(consumer's environment)中的依赖。此功能通常对 __library 开发人员__来说是最有用的,然而也会有各种各样的应用程序用到它。
用户(consumer)
,在这里是指,引用了「使用 webpack 打包的 library」的所有终端用户的应用程序(end user application)。
externals
string
array
object
function
regex
例如,从 CDN 引入 jQuery,而不是把它打包:
index.html
...
<script src="https://code.jquery.com/jquery-3.1.0.js"
integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk="
crossorigin="anonymous"></script>
...
webpack.config.js
externals: {
jquery: 'jQuery'
}
这样就剥离了那些不需要改动的依赖模块,换句话,下面展示的代码还可以正常运行:
import $ from 'jquery';
$('.my-element').animate(...
具有外部依赖(external dependency)的 bundle 可以在各种模块上下文(module context)中使用,例如 CommonJS, AMD, 全局变量和 ES2015 模块。外部 library 可能是以下任何一种形式:
-
root
:可以通过一个全局变量访问 library(例如,通过 script 标签)。
commonjs
:可以将 library 作为一个 CommonJS 模块访问。
commonjs2
:和上面的类似,但导出的是module.exports.default
.
amd
:类似于commonjs
,但使用 AMD 模块系统。
externals
接受各种语法并以不同的方式解释它们。
string
externals中的jQuery,
表示你的包将需要访问全局形式的jQuery
变量。
array
externals: {
subtract: ['./math', 'subtract']
}
subtract: ['./math', 'subtract']
转换为父子结构,其中 ./math
是父模块,而 bundle 只引用 subtract
变量下的子集。
object
externals : {
react: 'react'
}
// or
externals : {
lodash : {
commonjs: "lodash",
amd: "lodash",
root: "_" // indicates global variable
}
}
// or
externals : {
subtract : {
root: ["math", "subtract"]
}
}
此语法用于描述外部 library 所有可用的访问方式。这里 lodash
这个外部 library 可以在 AMD 和 CommonJS 模块系统中通过 lodash
访问,但在全局变量形式下用 _
访问。subtract
可以通过全局 math
对象下的属性 subtract
访问(例如 window['math']['subtract']
)。
function
定义你自己的函数来控制从webpack中外化的行为可能是有用的。例如,webpack-node-externals 会从 node_modules 中排除所有模块,并向白名单包提供一些选项。
它基本上归结为以下:
externals: [
function(context, request, callback) {
if (/^yourregex$/.test(request)){
return callback(null, 'commonjs ' + request
}
callback(
}
],
'commonjs ' + request
定义了需要被外部模块的类型。
regex
匹配给定正则表达式的每个依赖项都将从输出包中排除。
externals: /^(jquery|\$)$/i
在这种情况下,任何名为jQuery的依赖项,大写或不是或$都将被外化。
有关如何使用此配置的更多信息,请参阅有关如何创建库的文章。