TypeScript 集成
文件位置
src/typescript.js— TypeScript 编译器版本发现与加载src/loaders/ts-loader.js— TypeScript Loader 包装
TypeScript 版本解析策略
解析优先级
TYPESCRIPT_LOOKUP_PATH环境变量:最高优先级,允许完全自定义typescriptLookupPath(来自__NCC_OPTS):默认为入口文件的resolve路径process.cwd() + '/':回退到当前工作目录- ncc 内置 TypeScript:如果以上路径都找不到 TypeScript,使用 ncc 自己打包的版本
实现机制
使用 Node.js 内部的 Module._nodeModulePaths() 生成模块搜索路径,然后通过虚拟 Module 实例的 require() 进行加载。这绕过了 ncc 自身的模块解析(因为 typescript.js 在构建时是原样复制到 dist/ 的,不经过 Webpack 编译)。
ts-loader 集成
配置
编译器选项覆盖
用户 tsconfig 中的 compilerOptions 通过展开运算符合并,但上面的强制值会覆盖用户设置。
--transpile-only 模式
当使用 -t / --transpile-only 选项时:
- ts-loader 跳过类型检查,只做语法转换
- 构建速度显著提升
- 类型错误不会阻断构建
- 嵌套资源构建(assetBuilds)自动启用此模式以节省 CPU
TypeScript 错误报告
默认模式下(非 transpileOnly),TypeScript 类型错误会通过 Webpack 的错误收集机制冒泡:
错误信息包含文件名和行列号,格式如:file.ts(3,16): error TS2322: ...
TSConfig Paths 支持
如果 tsconfig 中定义了 paths(路径别名),ncc 会:
- 注册
TsconfigPathsPlugin使 Webpack 理解这些别名 - 创建
matchPath函数用于自定义解析
如果 tsconfig 的 compilerOptions.allowJs 为 true,TsconfigPathsPlugin 会扩展到所有支持的扩展名。
构建时的 TypeScript 打包
在 scripts/build.js 中,ts-loader 被单独编译为一个 bundle:
这个 bundle 包含 ts-loader 本身,但不包含 TypeScript 编译器(通过 compiler 选项指向外部的 typescript.js)。TypeScript 库的 .d.ts 类型文件通过 copy 命令单独复制到 dist/ncc/loaders/typescript/lib/。