Webpack не исключая node_modules


85

Я использую webpack для фреймворка Node, который я создаю (хотя, по общему признанию, мне, вероятно, следует использовать gulp). Когда я включаю модуль EJS, 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; почему он игнорирует мое исключение?

Ответы:


183

Судя по вашему конфигурационному файлу, вы исключаете его только node_modulesиз анализа babel-loader, но не из пакета.

Чтобы исключить node_modulesи собственные библиотеки узлов из связывания, вам необходимо:

  1. Добавьте target: 'node'в свой webpack.config.js. Это исключит встроенные модули узлов (path, fs и т. Д.) Из пакета.
  2. Используйте webpack-node-externals , чтобы исключить другие 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

Фантастический ответ и возможности.
Geek Stocks

2
@ ŠimeVidas, он исключит каталог node_modulesиз babel-loaderпрогона, но не исключит его из пакета
mlg87

16

Если вы столкнулись с этой проблемой при использовании TypeScript, вам может потребоваться добавить skipLibCheck: trueв свой tsconfig.jsonфайл.


7

Попробуйте использовать абсолютный путь:

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

Вы можете показать нам, как устроен проект? Файловая структура
Алан

-1

попробуйте это решение ниже:

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

6
Добро пожаловать в StackOverflow. Было бы лучше, если бы вы указали дополнительную ценность поверх других ответов. В этом случае ваш ответ не дает дополнительной ценности, поскольку другой пользователь (Алан) уже опубликовал это решение 5 лет назад. Вы должны проголосовать, как только наберетесь достаточной репутации
Олег Вальтер

-2

Это сработало для меня:

исключить: [/ bower_components /, / node_modules /]

module.loaders

Массив автоматически применяемых загрузчиков.

Каждый элемент может иметь следующие свойства:

тест: условие, которое должно быть выполнено

исключить: условие, которое не должно выполняться

включают: условие, которое должно быть выполнено

загрузчик: строка "!" раздельные погрузчики

loaders: массив загрузчиков в виде строки

Условием может быть RegExp, начало абсолютного пути или массив одного из них в сочетании с «и».

См. Http://webpack.github.io/docs/configuration.html#module-loaders.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.