构建系统
概述
ncc 使用自举(bootstrapping)策略:用 ncc 自己来编译自己。构建脚本 scripts/build.js 调用 ncc 的 API 逐个编译源文件,输出到 dist/ncc/。
构建入口
构建流程
各构建目标
CLI (src/cli.js)
CLI 将 ./index.js 标记为 external,因为核心引擎是单独编译的。运行时 CLI 的 require("./index.js") 会加载同目录下的 index.js。
核心引擎 (src/index.js)
核心引擎不设置 externals,所有依赖(webpack、terser、memory-fs 等)都被打包进去。
已知的合法资源输出:locales/(来自某些依赖的 i18n 文件)、worker.js、index1.js、minify.js。
Loaders
每个 Loader 单独编译为一个文件:
Source Map Support
将 source-map-support 包编译为独立文件,运行时按需加载。
非编译文件(直接复制)
以下文件不经过 Webpack 编译,直接复制到 dist/:
V8 缓存产物
每个编译目标同时生成:
.js— 主文件(实际是 V8 缓存加载器).js.cache— V8 编译后的字节码.js.cache.js— 原始源码(供 V8 缓存过期时使用)
资源检查
构建过程会检查意外的资源输出。已知的合法资源被白名单过滤,新增的意外资源会打印警告(但不阻断构建)。
TypeScript 类型文件
TypeScript 的 .d.ts 库文件被复制到 dist/,供 ts-loader 在编译用户 TypeScript 代码时使用。
缓存策略
- 默认缓存目录:
<项目根>/.cache --no-cache参数禁用缓存- 缓存以 ncc 版本为 key,版本升级自动失效
- 在
prepublishOnly中强制无缓存构建确保发布产物的确定性