Webpack 不排除 node_modules

IT技术 javascript webpack
2021-03-17 12:56:46

我正在将 webpack 用于我正在构建的 Node 框架(尽管我可能应该使用 gulp,无可否认)。当我包含 EJS module时,webpack 会将它包含在编译源中,即使我明确告诉它排除 node_modules 目录。

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;为什么它忽略了我的排除?

5个回答

从您的配置文件中,您似乎只是排除node_modules了被解析babel-loader而不是被捆绑。

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

  1. 添加target: 'node'到您的webpack.config.js. 这会将 NodeJs 定义为包应该运行的环境。对于 webpack,它改变了在打包过程中使用的块加载行为、可用的外部module和生成的代码样式(即require()用于 NodeJs)。

  2. 设定externalPresetsnodetrue从 Webpack@5 开始,此配置将排除本地节点module(路径、fs 等)的捆绑。

  3. 使用webpack-node-externals以排除其他node_modules.

所以你的结果配置文件应该是这样的:

var nodeExternals = require('webpack-node-externals');
...
module.exports = {
    ...
    target: 'node', // use require() & use NodeJs CommonJS style
    externals: [nodeExternals()], // in order to ignore all modules in node_modules folder
    externalsPresets: {
        node: true // in order to ignore built-in modules like path, fs, etc. 
    },
    ...
};
浏览器上有类似的东西吗?(即目标:'浏览器')
2021-04-23 12:56:46
这是一个正则表达式。如果您省略它,则将包含 node_modules
2021-05-08 12:56:46
我试图了解是什么exclude: /node_modules/你能详细说明一下吗?如果我们不考虑它会发生什么?
2021-05-09 12:56:46
@ŠimeVidas 它将排除node_modulesdirbabel-loader运行它,但它不会将它从包中排除
2021-05-14 12:56:46
很棒的答案和能力。
2021-05-19 12:56:46

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

你,我的朋友,是救命稻草
2021-05-05 12:56:46

尝试使用绝对路径:

exclude:path.resolve(__dirname, "node_modules")
你能告诉我们这个项目是如何构建的吗?文件结构
2021-04-24 12:56:46
为什么要这样做? /node_modules/将匹配节点module中的任何可能路径,不是吗?
2021-05-18 12:56:46

这对我有用:

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

module加载器

一系列自动应用的加载器。

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

测试:必须满足的条件

exclude:不能满足的条件

包括:必须满足的条件

loader:一串“!” 分离装载机

loaders: 加载器数组作为字符串

条件可以是一个正则表达式、一个绝对路径起点,或者是其中一个与“和”组合的数组。

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

试试下面的解决方案:

exclude:path.resolve(__dirname, "node_modules")
欢迎使用 StackOverflow。如果您在其他答案之上提供额外的value会更好。在这种情况下,您的答案不会提供额外的value,因为另一个(艾伦)用户 5 年前已经发布了该解决方案。一旦你有足够的声望,你应该投票
2021-05-11 12:56:46