Webpack不排除node_modules

我使用的是我正在构build的Node框架的webpack(虽然我应该可能会使用gulp,不可否认)。 当我包含EJS模块时,webpack将它包含在编译后的源代码中,即使我明确地告诉它不包含node_modules dir。

module.exports = { context: __dirname, target: 'node', // ... output: { libraryTarget: 'commonjs' // ... }, module: { loaders: [ { test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader?{ "stage": 0, "optional": ["runtime"] }' } ] } }; 

正如你所看到的,我有一个JS文件testing,并告诉它排除node_modules; 为什么忽略我的排除?

从你的configuration文件看来,你只是排除了node_modulesbabel-loaderparsing, 而不是被绑定。

为了从绑定中排除node_modules和本地节点库,您需要:

  1. 添加target: 'node'到你的webpack.config.js 。 这将排除本地节点模块 (path,fs等)被捆绑。
  2. 使用webpack-node-externals为了排除其他node_modules

所以你的结果configuration文件应该如下所示:

 var nodeExternals = require('webpack-node-externals'); ... module.exports = { ... target: 'node', // in order to ignore built-in modules like path, fs, etc. externals: [nodeExternals()], // in order to ignore all modules in node_modules folder ... }; 

尝试使用绝对path:

 exclude:path.resolve(__dirname, "node_modules") 

如果在使用TypeScript时遇到此问题,则可能需要在tsconfig.json文件中添加skipLibCheck: true

这发生在我身上,因为我已经指定了我自己的resolve.extensions但没有包含空的扩展名''

 resolve: { extensions: ['.js', '.jsx'] }, 

从webpack文档 :

设置此选项将覆盖默认值,这意味着webpack将不再尝试使用默认扩展名来parsing模块。 如果你想要扩展所需的模块(例如require('./ somefile.ext'))被正确parsing,你必须在你的数组中包含一个空string。 同样的,如果你希望没有扩展名的模块(例如require('underscore'))被parsing为带有“.js”扩展名的文件,你必须在你的数组中包含“.js”。

添加空的扩展名解决了错误:

 resolve: { extensions: ['', '.js', '.jsx'] },