CLI 模块
文件位置
src/cli.js — 命令行接口的完整实现。
概述
CLI 是 ncc 的主要用户界面,通过 ncc <cmd> <opts> 调用。它负责参数解析、命令路由、输出文件写入和构建摘要渲染。
入口逻辑
关键设计:CLI 支持两种模式:
- 直接执行:作为命令行工具运行
- API 模式:被
require()时导出runCmd函数(用于测试)
api 标志影响子进程的 stdio 配置(API 模式用 pipe,直接模式用 inherit)。
命令结构
参数解析
使用 arg 库进行严格模式解析(permissive: false):
命令路由
build 命令流程
编译阶段
eval("require.resolve") 的使用是为了防止 ncc 在编译自身时尝试解析这个 require 调用。
输出阶段(handler 函数)
- 清理输出目录:删除现有的
.js和.cjs文件 - 写入主文件:
outDir/index.js(如有 shebang 则设置 0o777 权限) - 写入 Source Map:
outDir/index.js.map - 写入资源文件:遍历 assets 对象,创建目录并写入
- 创建符号链接:遍历 symlinks 对象
- 渲染构建摘要:文件大小、构建时间
- 写入 stats:如有
--stats-out选项
构建摘要
renderSummary 函数(src/cli.js:65-121)按文件大小排序显示所有输出文件,主文件 index.js 插入到适当的排序位置。
run 命令流程
- 生成临时目录:基于输入路径 SHA-256 哈希在
os.tmpdir()中创建 - 如目录已存在则清理
- 复用
build逻辑(通过 fallthrough)编译代码 - 额外步骤:
- 查找最近的
node_modules并创建符号链接到临时目录 - 使用
child_process.fork()执行编译产物 - 监听退出信号,退出时清理临时目录
- 查找最近的
Watch 模式
在 build 命令中使用 --watch:
注意:run 命令不支持 --watch(会报错退出)。
错误处理
ncc 使用自定义错误对象区分用户错误和内部错误:
nccError = true:只显示 message(用户错误,不需要堆栈)silent = true:完全静默退出(子进程非零退出码)