Webpack不排除node_modules


83

我正在将webpack用于要构建的Node框架(尽管我应该应该使用gulp)。当我包含EJS模块时,即使我明确告诉它要排除node_modules目录,Webpack也会将其包含在已编译的源代码中。

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

如您所见,我对JS文件进行了测试,并告诉它排除了node_modules。为什么忽略我的排除?

Answers:


180

从您的配置文件中,似乎您仅node_modules是被解析为babel-loader而不是被捆绑为一。

为了node_modules从捆绑中排除本机节点库,您需要:

  1. 添加target: 'node'到您的中webpack.config.js。这将排除捆绑本机节点模块(路径,fs等)。
  2. 使用webpack-node-externals来排除other node_modules

因此,您的结果配置文件应如下所示:

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 
    ...
};

7
浏览器上有类似的东西吗?(即目标:“浏览器”)
Andrea.cabral

我试图了解是什么exclude: /node_modules/。你能详细说明吗?如果我们将其遗忘会怎样?
席梅·维达斯

这是一个正则表达式。如果不考虑的话,将包含
node_modules

神奇的答案和能力。
极客股票

2
@ŠimeVidas它将把node_modules目录排除在babel-loader运行目录之外,但不会从目录束中排除它
mlg87 '18

16

如果您在使用时打字稿跑进这个问题,你可能需要添加skipLibCheck: true在你的tsconfig.json文件中。


7

尝试使用绝对路径:

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

您能告诉我们项目的结构吗?文件结构
艾伦

-1

请尝试以下解决方案:

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

4
欢迎使用StackOverflow。如果您在其他答案之上还提供了其他价值,那将更好。在这种情况下,您的答案没有其他价值,因为另一位(Alan)用户已经在5年前发布了该解决方案。拥有足够声誉后,您应该投票赞成
Oleg Valter

-2

这为我工作:

排除:[/ bower_components /,/ node_modules /]

模块加载器

一系列自动应用的加载程序。

每个项目都可以具有以下属性:

测试:必须满足的条件

排除:不得满足的条件

包括:必须满足的条件

loader:字符串“!” 分开的装载机

装载程序:字符串形式的装载程序数组

条件可以是RegExp,绝对路径起点,也可以是其中一个与“ and”组合的数组。

参见http://webpack.github.io/docs/configuration.html#module-loaders

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.