轻松排除 Webpack 中的节点模块
Webpack 允许您定义外部组件 - 不应捆绑的模块。
当为后端捆绑 Webpack 时 - 您通常不想捆绑其node_modules依赖项。该库创建了一个外部函数,node_modules在 Webpack 中捆绑时会忽略该函数。
(受Webpack系列出色的后端应用程序的启发)
npm install webpack-node-externals --save-dev
在你项目中的webpack.config.js中写入以下代码:
const nodeExternals = require('webpack-node-externals');
...
module.exports = {
...
target: 'node', // 为了忽略诸如path、fs等内置模块。
externals: [nodeExternals()], // 以忽略节点\模块文件夹中的所有模块
...
};
就是这样。所有节点模块将不再捆绑,而是保留为require(‘module’).
注意:对于 Webpack 5,替换target: 'node’为externalsPreset对象:
// Webpack 5
const nodeExternals = require('webpack-node-externals');
...
module.exports = {
...
externalsPresets: { node: true }, // 为了忽略诸如path、fs等内置模块。
externals: [nodeExternals()], // 以忽略节点\模块文件夹中的所有模块
...
};
options.importType = function (moduleName) {
return 'amd ' + moduleName;
}
{
modulesFromFile: true,
/*或*/
modulesFromFile: {
fileName: /*要读取的package.json的路径*/,
includeInBundle: [/*包中包含的整个节,即“devDependencies”*/],
excludeFromBundle: [/*从包中显式排除的整个节,即仅“依赖项”*/]
}
}
var nodeExternals = require('webpack-node-externals');
...
module.exports = {
...
target: 'node', // 重要的是不要捆绑像path、fs等内置模块。
externals: [nodeExternals({
//这将包括捆绑包中的“jquery”和“webpack/hot/dev server”,以及“lodash”/*`
allowlist: ['jquery', 'webpack/hot/dev-server', /^lodash/]
})],
...
};
对于大多数用例,应该使用importType和的默认值modulesDir。
{
externals: [
// 每个非相关模块都是外部的
// abc -> require("abc")
/^[a-z\-0-9]+$/
]
}
然而,这将使所有非相关的 requires 处于非捆绑状态,因此它不考虑可能在 webpack 本身中定义的别名。这个库扫描node_modules文件夹,所以它只留下正在使用的实际节点模块的未捆绑。
...
nodeExternals({
// 加载扩展名为的非javascript文件,可能是通过加载程序加载的
allowlist: [/\.(?!(?:jsx?|json)$).{1,5}$/i],
}),
...
为什么捆绑 node_modules 不是一件好事?
翻译不足的地方还请指教