Nitro
ってどうやって node_modules
内の必要なものだけを .output
に持ってきてるんだろう
目次
nitro
コマンドの build の実装を見ると下記のようになっている
async run({ args }) {
const rootDir = resolve((args.dir || args._dir || ".") as string);
const nitro = await createNitro(
{
rootDir,
dev: false,
minify: args.minify,
preset: args.preset,
},
{
compatibilityDate: args.compatibilityDate as DateString,
}
);
await prepare(nitro);
await copyPublicAssets(nitro);
await prerender(nitro);
await build(nitro);
await nitro.close();
},
つまり prepare
, copyPublicAssets
, preprender
, build
のいずれかのメソッドが目的の実装であろう
ここでは出力先ディレクトリの削除と再作成を行っている
noPublicDir
オプションが有効なら処理をスキップ。
nitro.config.ts で設定した publicAssets
ディレクトリから、必要な asset を出力先ディレクトリにコピー。
で、必要に応じて(compressPublicAssets
が true なら)圧縮も行う。
noPublicDir
オプションが有効なら処理をスキップ。
prerender が有効な route をビルド時に描画する。静的に生成するってこと。
本番向けビルドでは、 buildProduction()
に処理を移譲している。
色々やってるけど、
if (!nitro.options.static) {
nitro.logger.info(
`Building ${nitroServerName(nitro)} (preset: \`${nitro.options.preset}\`, compatibility date: \`${formatCompatibilityDate(nitro.options.compatibilityDate)}\`)`
);
const build = await rollup.rollup(rollupConfig).catch((error) => {
nitro.logger.error(formatRollupError(error));
throw error;
});
await build.write(rollupConfig.output);
}
静的でないときのみに実行するここが怪しい。
rollup でビルドしてるので、 rollupConfig
がどうなってるか見るとよさそう。rollupConfig
は前述の build.ts
で取得している。
https://github.com/nitrojs/nitro/blob/1767019c04a44238fe14e6cce8dacd50595a5092/src/rollup/config.ts
色々 rollup plugin の設定を書いている。
が、package.json の dependencies にある rollup plugin など見ると、そのへんの処理をしているものはなさそう。
"@rollup/plugin-alias": "^5.1.1",
"@rollup/plugin-commonjs": "^28.0.2",
"@rollup/plugin-inject": "^5.0.5",
"@rollup/plugin-json": "^6.1.0",
"@rollup/plugin-node-resolve": "^15.3.1",
"@rollup/plugin-replace": "^6.0.2",
"@rollup/plugin-terser": "^0.4.4",
"@rollup/pluginutils": "^5.1.4",
ということで nitro 内製の rollup plugin がそれっぽい。
…というふうに読み進めて行ってたら、別口で答えを見つけた
Bundle dist/node_modules
· Issue #276 · unjs/unbuild
As an alternative idea, we might extract nitro externals plugin to generate dist/node_modules but it seems a super tricky thing at the moment so i don't think we can plan it early. But i will certainly keep your issue in mind 👍🏼
ということでやっぱり nitro 内製の externals plugin が対象の処理でよさそう。
ここで externals 扱いするか、 inline でバンドルするか決めているらしい。
しかしログを仕込んで動かしてみても、モノレポ内の別パッケージはこの externals plugin まで来ない模様。
ここよりも前の段階で処理されてそうな気がするけど、その変理解するにはまず rollup plugin の仕組みをちゃんと知る必要がありそう…
ということで今回はここまで。