在nitro项目中,nitro build
主要用于生产环境打包,将项目源代码转化为经过优化的、可用于生产的输出,默认会在 .output
目录输出构建后的文件。
参考nitro dev
的执行流程,nitro build
的源文件位于https://github.com/nitrojs/nitro/blob/4b29402c/src/cli/commands/build.ts
, 其核心run
内容如下:
javascript
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();
},
执行流程
- 解析项目根目录
- 创建 Nitro Instance
- 初始化构建环境,主要是扫描handles/routes/hooks/plugins等。
- 静态文件处理
- 根据routes配置生成静态html
- 根据不同的平台生成优化后的代码
- 清理和释放资源。
具体构建工作流
Nitro Build Process:
1. createNitro() → prepare()
2. prepare() → copyPublicAssets()
3. copyPublicAssets() → rollup bundling
4. rollup bundling → writeTypes()
5. writeTypes() → prerender() (optional)
6. prerender() → Output Files
Rollup 还是 Rolldown
在await build(nitro)
中,我们可以看到,在当前阶段,nitro 同时支持rollup
和 rolldown
。
javascript
export async function build(nitro: Nitro) {
switch (nitro.options.builder) {
case "rollup": {
const { rollupBuild } = await import("./rollup/build");
return rollupBuild(nitro);
}
case "rolldown": {
const { rolldownBuild } = await import("./rolldown/build");
return rolldownBuild(nitro);
}
default: {
throw new Error(`Unknown builder: ${nitro.options.builder}`);
}
}
}
Output Structure
执行完毕,通常输出的文件及目录如下:
.output/
├── server/ # Server-side code
│ ├── index.mjs # Entry point
│ ├── chunks/ # Code chunks
├── public/ # Static assets
├── nitro.json # Build information