web-dev-qa-db-fra.com

Webpack n'excluant pas node_modules

J'utilise webpack pour un framework Node que je construis (bien que je devrais probablement utiliser gulp, certes). Lorsque j'inclus le module EJS, Webpack l'inclut dans la source compilée, même si je lui dis explicitement d'exclure le répertoire 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"] }'
            }
        ]
    }
};

Comme vous pouvez le constater, j'ai un test pour les fichiers JS et je lui dis d'exclure node_modules; pourquoi ignore-t-il mon exclusion?

71
ndugger

Dans votre fichier de configuration, il semble que vous ne fassiez que node_modules être analysé avec babel-loader, mais pas , groupé.

Pour exclure node_modules et les bibliothèques de noeuds natifs du regroupement, vous devez:

  1. Ajoutez target: 'node' à votre webpack.config.js. Cela va exclure les modules de nœud natif (chemin, fs, etc.) de la fusion.
  2. Utilisez webpack-node-externals afin d’exclure d’autres node_modules.

Donc, votre fichier de configuration de résultat devrait ressembler à:

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

Si vous rencontrez ce problème avec TypeScript, vous devrez peut-être ajouter skipLibCheck: true dans votre fichier tsconfig.json.

11
mattnedrich

Essayez d'utiliser le chemin absolu:

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

WebPack 1.x :

Cela m'arrivait parce que j'avais spécifié mon propre resolve.extensions mais je n'ai pas réussi à inclure l'extension vide '':

resolve: {
  extensions: ['.js', '.jsx']
},

Depuis le (n'est plus disponible!) Documents Webpack :

La définition de cette option remplacera la valeur par défaut, ce qui signifie que Webpack n'essaiera plus de résoudre les modules à l'aide des extensions par défaut. Si vous souhaitez que les modules requis avec leur extension (par exemple require ('./ somefile.ext')) soient correctement résolus, vous devez inclure une chaîne vide dans votre tableau. De même, si vous souhaitez que les modules requis sans extensions (par exemple, require ("underscore")) soient résolus en fichiers portant l'extension ".js", vous devez inclure ".js" dans votre tableau.

L'ajout de l'extension vide a résolu les erreurs:

resolve: {
  extensions: ['', '.js', '.jsx']
},
0
Seth