1. ホーム
  2. javascript

[解決済み] Webpack が node_module を除外しない。

2022-02-17 15:43:03

質問

Nodeフレームワークを構築するためにwebpackを使っています(本当は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を除外するように指示しました; なぜ、私の除外を無視するのでしょうか?

解決方法は?

設定ファイルを見る限りでは、以下のものだけを除外しているようです。 node_modules でパースされないようにする。 babel-loader , ただし をバンドルしています。

を除外するために node_modules とネイティブノードライブラリをバンドル対象から外す必要があります。

  1. 追加 target: 'node' を、あなたの webpack.config.js . これにより、バンドルが実行される環境としてNodeJsが定義されます。webpack では、チャンク読み込みの動作、利用可能な外部モジュール、生成されるコードのスタイルが変更されます。 require() NodeJsの場合)バンドル時に使用されます。

  2. を設定します。 externalPresetsnode から true . Webpack@5では、この構成は次のようになります。 ネイティブノードモジュールを除外する (path、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. 
    },
    ...
};