正確に何がチャンクに入ったかを示すデバッグオプションまたはプラグインをwebpackで見つけることができないようです。
なぜこれが必要なのですか?コード分割によって文字通りすべてが非常に大きくなり、すべてを1つのファイルに貼り付ける場合に気づきました。 bootstrap webpackのコードはそれほど重要ではないので、これは少し直観的です。縮小化/重複排除の可能性があると思いますが、実際にどのモジュールがチャンク化されているかを知ることはありません。確認のためにいくつかの独立したテストを行うことは非常に困難です。
私のビルドプロセスはgulpを使用しています。それが何か違いがある場合
これを行うプラグインを作成できます。
例えば、
var PrintChunksPlugin = function() {};
PrintChunksPlugin.prototype.apply = function(compiler) {
compiler.plugin('compilation', function(compilation, params) {
compilation.plugin('after-optimize-chunk-assets', function(chunks) {
console.log(chunks.map(function(c) {
return {
id: c.id,
name: c.name,
includes: c.modules.map(function(m) {
return m.request;
})
};
}));
});
});
};
詳細については、このページ http://webpack.github.io/docs/plugins.html を確認してください。フックできるすべての場所のドキュメントが含まれています。 chunks: Chunk[]
またはchunk
で呼び出される適切なフックを見つけると、この中で必要なすべてにアクセスできるようになります。
また、statsオブジェクトには、必要なすべてのpost-build
情報が含まれています。 done
プラグインで利用できます。
すべてのモジュールを表示するために --display-modules
として知られているキーがあるようです:
$ webpack --display-modules
次に、次のような使用済みモジュールのリストを取得します。
Asset Size Chunks Chunk Names
javascripts/webpack/app.js 211 kB 0 [emitted] javascripts/webpack/app
stylesheets/webpack/app.js 4.13 kB 1 [emitted] stylesheets/webpack/app
stylesheets/webpack/app.scss 2.99 kB 1 [emitted] stylesheets/webpack/app
[0] ./app/webpack/js/behaviors/lory-icon-slider.js.coffee 1.1 kB {0} [optional] [built]
[1] ./app/webpack/css/components (\.scss|\.css)$ 160 bytes {1} [built]
[2] ./app/webpack/js/behaviors (\.js|\.js.jsx|\.js.coffee)$ 252 bytes {0} [built]
[3] ./~/pickmeup/css/pickmeup.scss 41 bytes {1} [built]
[4] ./app/webpack/css/app.js 205 bytes {1} [built]
[5] ./app/webpack/js/app.js 250 bytes {0} [built]
[6] ./app/webpack/js/behaviors/pickmeup-fixed-calendar.js 3.47 kB {0} [optional] [built]
[7] ./~/lory.js/dist/jquery.lory.js 25 kB {0} [built]
[8] ./~/pickmeup/js/pickmeup.js 41.4 kB {0} [built]
[9] (webpack)/buildin/global.js 509 bytes {0} [built]
Child extract-text-webpack-plugin:
[0] ./~/css-loader/lib/css-base.js 1.51 kB {0} [built]
[1] ./~/css-loader!./~/sass-loader/lib/loader.js!./~/pickmeup/css/pickmeup.scss 3.23 kB {0} [built]
また、すべてのチャンクを単一のJSONファイルに出力するwebpack4と互換性のあるプラグインもあります。
https://www.npmjs.com/package/chunks-2-json-webpack-plugin
これを使用する方法は次のとおりです。
1)webpack設定ファイルにプラグインをインポートします(もちろん、インストールした後:)-npm i --save-dev chunks-2-json-webpack-plugin
)をプラグインキーの下にインスタンス化します。
const Chunks2JsonPlugin = require('chunks-2-json-webpack-plugin');
const path = require('path');
const publicPath = '/app/';
module.exports = {
entry: './src/index.js',
output: {
filename: '[name].[hash].js',
path: path.resolve(__dirname, 'dist'),
publicPath
},
plugins: [
new Chunks2JsonPlugin({ outputDir: 'dist/', publicPath })
]
};
そして、それだけです。結果として得られるのは、次のようなJSONファイルです。
{
"chunk-vendors": {
"js": ["/app/js/chunk-vendors.fc40696c.js"],
"js.map": ["/app/js/chunk-vendors.fc40696c.js.map"]
},
"app": {
"css": ["/app/css/app.eb829ccc.css"],
"js": ["/app/js/app.dd31cdcb.js"],
"js.map": ["/app/js/app.dd31cdcb.js.map"]
}
}
ここでは、すべてのチャンクが1つのJSONファイルに含まれています。
あなたがリンク自体で見つけることができるより多くの情報。
解決策は、.js.mapファイルを解析するスクリプトを記述することです。これは、チャンクに含まれていたすべてのファイルを識別するために使用できるsources
エントリが含まれているためです。
これは、仕事を完了する小さなgulpスクリプトです。
var debugWebpackMapFile = function (file) {
var cleanupRules = {
// executed in order
'/src/client/javascript/node_modules/': '',
'/src/client/javascript/': 'static/'
};
return new Promise(function (resolve, reject) {
var match = /\/([^\/]+).js.map$/.exec(file);
if (match != null) {
var filename = match[1];
console.log("\n " + filename + "\n =======================\n");
var mapjson = JSON.parse(fs.readFileSync(file));
var dependencies = [];
var sourcefiles = [];
_.each(mapjson.sources, function (srcfile) {
srcfile = srcfile.replace('webpack://source-code', '', srcfile);
var match = /^\/node_modules\/([^\/]+)/.exec(srcfile);
if (match == null) {
match = /^(\/src\/.*\.js)(\?.*)?/.exec(srcfile);
if (match != null) {
// project source file
srcfile = match[1];
_.each(cleanupRules, function (to, from) {
srcfile = srcfile.replace(from, to);
});
// the sources are in random order in the map file,
// so we'll need to sort before displaying anything
sourcefiles.Push(srcfile);
}
}
else {
// dependency
var pkg = match[1];
if (dependencies.indexOf(pkg) == -1) {
dependencies.Push(pkg);
}
}
});
sourcefiles.sort();
_.each(sourcefiles, function (srcfile) {
console.log(" " + srcfile);
});
if (dependencies.length > 0) {
console.log("\n ---- 3rd Party ------------------\n");
dependencies.sort();
_.each(dependencies, function (pkg) {
console.log(" " + pkg);
});
}
}
console.log("\n\n");
resolve();
});
}
gulp.task('js:debug', function (cb) {
var conf = webpackConf.mainjs;
glob(conf.output.path + '/*.map', {}, function (er, files) {
var promises = [];
_.each(files, function (file) {
promises.Push(debugWebpackMapFile(file));
});
Promise.all(promises).lastly(cb);
});
});
独自の構成に合わせてスクリプトを変更する必要があります。
念のため、webpack://source-code
部分は、webpack output
設定のdevtool設定によるものです。
devtoolModuleFilenameTemplate: "webpack://source-code/[resource-path]",
devtoolFallbackModuleFilenameTemplate: "webpack://source-code/[resource-path]?[hash]",
webpack/internal
およびnode_modules
は次の正規化スクリプトからのものです(webpackの「〜」置換機能は好きではありません)。
var normalizeMaps = function (conf, cb) {
glob(conf.output.path + '/*.map', {}, function (er, files) {
var promises = [];
_.each(files, function (file) {
promises.Push(replaceInFile(file, [
[ /\/~/g, '/node_modules' ],
[ /\.\//g, ''],
[ /source-code\/\(webpack\)/g, 'source-code/webpack/internal' ]
]));
});
Promise.all(promises).lastly(cb);
});
};