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_modules
被babel-loader
parsing, 而不是被绑定。
为了从绑定中排除node_modules
和本地节点库,您需要:
- 添加
target: 'node'
到你的webpack.config.js
。 这将排除本地节点模块 (path,fs等)被捆绑。 - 使用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'] },