工具模块
文件位置
src/utils/ — 包含 4 个辅助工具模块。
get-package-base.js
功能:从文件绝对路径中提取包的根目录。
算法:
- 找到路径中最后一个
node_modules段 - 验证其前后都有路径分隔符
- 提取包名(支持
@scope/name格式) - 返回从路径开头到包名结束的子串
示例:
/project/node_modules/express/lib/router.js→/project/node_modules/express/project/node_modules/@babel/core/index.js→/project/node_modules/@babel/core
pkgNameRegEx 也作为命名导出暴露,供其他模块使用。
has-type-module.js
功能:判断给定路径是否位于 "type": "module" 的包边界内。
算法:
- 从给定路径开始,逐级向上遍历目录
- 在每个目录尝试读取
package.json - 如果找到,检查其
type字段是否为"module" - 如果
package.json不存在(ENOENT),继续向上 - 到达文件系统根目录时停止
使用场景:
src/index.js:决定默认的 ESM/CJS 输出模式src/cli.js:计算输出文件扩展名
注意:eval('resolve') 的使用是为了防止 ncc 在编译自身时处理这个 require.resolve 路径。
ncc-cache-dir.js
功能:确定 Webpack 文件系统缓存的存储路径。
路径计算:
- 基础目录:
$XDG_CACHE_HOME(如设置)或~/.cache - 项目隔离:使用
process.cwd()的 SHA-1 哈希 - 最终路径:
<base>/ncc/<sha1>
设计意图:每个项目(通过工作目录区分)有独立的缓存空间。不同项目的缓存不会互相干扰。
使用场景:
src/index.js:作为 Webpackcache.cacheDirectory的默认值src/cli.js:cache dir/cache clean/cache size命令
shebang.js
功能:匹配文件开头的 shebang 行。
正则说明:
^#!— 必须在文件开头[^\n\r]*— shebang 内容(不含换行)[\r\n]— 以换行符结尾
使用场景:
src/index.js:99:读取入口文件时检测 shebangsrc/cli.js:296:写入输出文件时设置可执行权限src/cli.js:6:被 require 并使用
如果输入有 shebang,输出文件会设置 0o777 权限(可执行),否则为 0o666。