为什么读取tsconfig.json用readConfigFile而非直接require?
CRA读取tsconfig使用官方API而非直接require的原因
主要有4个核心考量:
- 处理非标准JSON语法
TypeScript官方允许tsconfig.json中使用//单行注释、/* */多行注释,以及末尾逗号这些标准JSON不支持的语法。Node.js内置的require()加载JSON文件时底层走标准JSON.parse,只要tsconfig里包含注释就会直接抛出语法错误,而ts.readConfigFile是TS官方提供的读取API,原生兼容这些拓展语法。
你测试时没出问题只是恰好你的tsconfig没用到这些语法,一旦项目里加了注释直接require的方案就会崩溃。 - 支持tsconfig的extends继承逻辑
tsconfig支持通过extends字段继承第三方共享配置(比如@tsconfig/react-app、团队内部统一的TS配置包),直接require只能读取当前tsconfig.json的本地内容,不会递归加载继承的配置、合并配置项,最终拿到的是不完整的配置。用TS官方API读取才能完整处理继承逻辑,拿到最终生效的全量配置。 - 对齐项目本地TypeScript版本的解析逻辑
代码里先通过resolve.sync从项目本地的node_modules查找typescript依赖,再用找到的本地TS实例的API读取配置,是为了避免CRA内置的TS版本和项目本地安装的TS版本不一致导致的配置解析差异。不同TS版本对tsconfig的字段支持、解析规则可能存在区别,用项目本地的TS实例处理配置是最准确的,不会出现版本兼容问题。 - jsconfig没有特殊解析需求
jsconfig.json没有官方定义的拓展语法、继承规则,就是标准JSON格式,所以直接用require读取完全没问题,CRA也就没有必要做额外处理。
内容的提问来源于stack exchange,提问作者jwkoo
相关产品推荐
相关产品推荐

