TypeScript project references 怎么用

你有没有过这样的经历:做一个中大型项目时,代码越写越乱,新增功能像牵一发而动全身的积木,改一处要跑遍十几个文件找依赖,部署时还要手动把所有代码打包到一起,稍不留神就漏了某个模块,要么报错要么功能残缺?其实,这种“大工程的混乱”,很多时候能靠TypeScript的一个小工具搞定——它就是常被忽略的TypeScript Project References(项目引用)。

什么是TypeScript项目引用?

简单说,它就是把一个大的TS项目,拆成多个独立的“小项目”,就像把一个大书架分成几个小格子,每个格子放一类书,还能标清楚“这个格子的书,要靠另一个格子的书才能读”。这样一来,每个小格子(子项目)都是独立的,改其中一个的代码,不会乱碰别的,找依赖也不用翻遍整个大书架。

TypeScript project references 怎么用

举个生活化的例子:假设你要做一个全家桶的“家庭管理工具”,拆成三个小功能模块:

财务模块(管收支、记账)

日程模块(管约会、家务)

主应用模块(把前两个模块拼起来给家人用)

以前你可能把所有代码放一起,现在用项目引用,就能把这三个模块各做成一个子项目,主应用模块“引用”财务和日程模块,需要用它们的功能时,直接调用就行,不用把所有代码揉成一团。

怎么用TypeScript项目引用?

用起来分三步走,都是改配置文件,完全不用写复杂代码,新手也能上手。

第一步:把大项目拆成子项目,每个子项目放一个单独的tsconfig.json。

每个子项目的tsconfig.json里,除了常规的TS配置(比如编译目标、检查规则),要加一个composite: true,告诉TS“这是一个可被其他项目引用的子项目”。

比如财务模块的tsconfig.json,核心内容就是:

`json

{

"compilerOptions": {

"composite": true, // 必加,标记为可引用子项目

"outDir": "./dist-finance", // 编译后输出到专属文件夹,避免和其他模块混

"rootDir": "./src" // 源代码目录

},

"include": ["src/**/*"] // 要编译的文件

}

`

日程模块的tsconfig.json和它几乎一样,只要把outDir改成./dist-schedule就行。

第二步:给主应用加tsconfig.json,引用需要的子项目。

主应用是整合所有模块的,它的tsconfig.json里,除了自己的常规配置,要加references数组,把要用的子项目列出来。

比如主应用的tsconfig.json核心内容:

`json

{

"compilerOptions": {

"outDir": "./dist-main",

"rootDir": "./src"

},

"references": [ // 这里写要引用的子项目

{ "path": "../finance" }, // 财务模块的路径

{ "path": "../schedule" } // 日程模块的路径

]

}

`

第三步:编译的时候,用TS的--build命令,它会自动按引用关系编译所有子项目,不用手动挨个跑。

直接在主项目根目录执行tsc --build,TS会先编译财务、日程子项目,再编译主应用,完美解决依赖顺序问题,再也不会因为漏编译子模块而报错。

用项目引用的好处是什么?

除了开头说的“代码不混乱”,还有两个实际好处:一是编译更快,改某个子项目时,tsc --build只会重新编译修改的子项目,不会动其他模块,比编译整个大项目省时间;二是代码边界清晰,每个子项目只能用自己的文件,引用的子模块只能用公开的接口,避免了跨模块乱调用的脏代码。

如果你的TS项目超过1万行,或者需要拆分功能模块,不妨试试这个小工具——它就像给混乱的大项目加了个清晰的目录,让开发更省心。

上一篇 JavaScript 如何修改元素样式