Webpack ohne node_modules nicht ausschließen

82

Ich verwende Webpack für ein Node-Framework, das ich erstelle (obwohl ich zugegebenermaßen wahrscheinlich gulp verwenden sollte). Wenn ich das EJS-Modul einbinde, nimmt Webpack es in die kompilierte Quelle auf, obwohl ich es ausdrücklich anweise, das Verzeichnis node_modules auszuschließen.

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

Wie Sie sehen können, habe ich einen Test für JS-Dateien und fordere ihn auf, node_modules auszuschließen. Warum ignoriert es meinen Ausschluss?

ndugger
quelle

Antworten:

172

Aus Ihrer Konfigurationsdatei geht hervor, dass Sie nur node_modulesdas Parsen ausschließen babel-loader, aber nicht das Bündeln.

Um node_modulesnative Knotenbibliotheken von der Bündelung auszuschließen , müssen Sie:

  1. Fügen Sie target: 'node'Ihrem hinzu webpack.config.js. Dadurch werden native Knotenmodule (Pfad, fs usw.) von der Bündelung ausgeschlossen.
  2. Verwenden Sie Webpack-Node-Externals , um andere auszuschließen node_modules.

Ihre Ergebniskonfigurationsdatei sollte also folgendermaßen aussehen:

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 
    ...
};
Lyosef
quelle
5
Gibt es etwas Ähnliches im Browser? (dh Ziel: 'Browser')
Andrea.cabral
Ich versuche zu verstehen, was exclude: /node_modules/tut. Könnten Sie näher darauf eingehen? Was könnte passieren, wenn wir es weglassen würden?
Šime Vidas
Es ist eine Regex. Wenn Sie es weglassen, werden node_modules enthalten sein
meredrica
Fantastische Antwort und Fähigkeit.
Geek Stocks
2
@ ŠimeVidas es wird das Verzeichnis node_modulesvom Überfahren ausschließen babel-loader, aber es wird es nicht aus dem Bundle ausschließen
mlg87
15

Wenn Sie bei der Verwendung von TypeScript auf dieses Problem gestoßen sind, müssen Sie möglicherweise skipLibCheck: trueIhre tsconfig.jsonDatei hinzufügen .

mattnedrich
quelle
7

Versuchen Sie, den absoluten Pfad zu verwenden:

exclude:path.resolve(__dirname, "node_modules")
Alan
quelle
Können Sie uns zeigen, wie das Projekt aufgebaut ist? Die Dateistruktur
Alan
-1

Versuchen Sie diese folgende Lösung:

exclude:path.resolve(__dirname, "node_modules")
Sina Dorostkar
quelle
1
Willkommen bei StackOverflow. Es wäre besser, wenn Sie zusätzlich zu den anderen Antworten einen zusätzlichen Wert angeben würden. In diesem Fall bietet Ihre Antwort keinen zusätzlichen Wert, da ein anderer (Alan) Benutzer diese Lösung bereits vor 5 Jahren veröffentlicht hat. Sie sollten darüber abstimmen, sobald Sie genug Ruf haben
Oleg Valter
-2

Das hat bei mir funktioniert:

ausschließen: [/ bower_components /, / node_modules /]

module.loaders

Eine Reihe automatisch angewendeter Lader.

Jeder Artikel kann folgende Eigenschaften haben:

Test: Eine Bedingung, die erfüllt sein muss

ausschließen: Eine Bedingung, die nicht erfüllt sein darf

include: Eine Bedingung, die erfüllt sein muss

Loader: Eine Zeichenfolge von "!" getrennte Lader

Loader: Ein Array von Loadern als Zeichenfolge

Eine Bedingung kann ein RegExp, ein absoluter Pfadstart oder ein Array von diesen sein, kombiniert mit "und".

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

Frecks
quelle