首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 重塑“类型思维”
02 | 类型基础(1):强类型与弱类型
03 | 类型基础(2):动态类型与静态类型
04 | 编写你的第一个TypeScript程序
05 | 基本类型
06 | 枚举类型
07 | 接口(1):对象类型接口
08 | 接口(2):函数类型接口
09 | 函数相关知识点梳理
10 | 类(1):继承和成员修饰符
11 | 类(2):抽象类与多态
12 | 类与接口的关系
13 | 泛型(1):泛型函数与泛型接口
14 | 泛型(2):泛型类与泛型约束
15 | 类型检查机制(1):类型推断
16 | 类型检查机制(2):类型兼容性
17 | 类型检查机制(3):类型保护
18 | 高级类型(1):交叉类型与联合类型
19 | 高级类型(2):索引类型
20 | 高级类型(3):映射类型
21 | 高级类型(4):条件类型
22 | ES6与CommonJS的模块系统
23 | 使用命名空间
24 | 理解声明合并
25 | 如何编写声明文件
26 | 配置tsconfig.json(1):文件选项
27 | 配置tsconfig.json(2):编译选项
28 | 配置tsconfig.json(3):工程引用
29 | 编译工具:从ts-loader到Babel
30 | 代码检查工具:从TSLint到ESLint
31 | 使用Jest进行单元测试
32 | 创建项目
33 | 组件与类型(1):函数组件与类组件
34 | 组件与类型(2):高阶组件与Hooks
35 | 事件处理与数据请求
36 | 列表渲染与路由
37 | Redux与类型
38 | 搭建服务端开发环境
39 | 列表的CRUD
40 | 导出Excel
41 | 搭建Vue开发环境
42 | 组件封装
43 | 组件发布
44 | 共存策略
45 | 宽松策略
46 | 严格策略
当前位置:
首页>>
技术小册>>
TypeScript开发实战
小册名称:TypeScript开发实战
### 28 | 配置`tsconfig.json`(3):工程引用 在TypeScript项目中,随着项目规模的扩大,代码库的复杂性和维护难度也会显著增加。为了有效地管理这些大型项目,TypeScript提供了一项强大的功能——**工程引用(Project References)**。通过利用工程引用,我们可以将大型项目拆分成多个较小的、更易于管理的子项目(也称为引用项目或子包)。这些子项目可以独立编译,提高了编译效率,同时也支持增量编译,即只重新编译更改过的部分,进一步提升了开发效率。 #### 一、工程引用的基础概念 工程引用是TypeScript 2.7及以后版本中引入的一个特性,它允许你将一个大型项目拆分成多个`tsconfig.json`配置文件管理的子项目。每个子项目都可以独立编译,并且它们之间可以相互依赖。当一个子项目被另一个子项目引用时,TypeScript会智能地处理这些依赖关系,确保编译顺序的正确性,并只重新编译受影响的子项目。 #### 二、为什么要使用工程引用 1. **提高编译速度**:通过并行编译多个独立的子项目,可以显著减少大型项目的编译时间。 2. **增量编译**:仅重新编译修改过的子项目及其依赖项,而不是整个项目。 3. **更好的代码组织**:促进代码模块化,使得代码库更加清晰、易于管理。 4. **增强类型检查**:TypeScript能够利用工程引用之间的依赖关系,提供更精确的类型检查。 #### 三、如何配置工程引用 ##### 1. 创建子项目 首先,你需要在项目中创建多个子目录,每个子目录代表一个子项目。每个子项目都应该有自己的`tsconfig.json`文件。 ```bash my-project/ │ ├── packages/ │ ├── lib-a/ │ │ ├── src/ │ │ │ ├── index.ts │ │ ├── tsconfig.json │ │ │ ├── lib-b/ │ │ ├── src/ │ │ │ ├── index.ts │ │ ├── tsconfig.json │ │ │ └── app/ │ ├── src/ │ │ ├── index.ts │ ├── tsconfig.json │ └── tsconfig.base.json ``` ##### 2. 配置`tsconfig.base.json` 为了避免在每个子项目的`tsconfig.json`中重复配置相同的编译选项,可以创建一个基础配置文件`tsconfig.base.json`,并在各个子项目的`tsconfig.json`中通过`extends`属性继承这些基础配置。 ```json // tsconfig.base.json { "compilerOptions": { "target": "es5", "module": "commonjs", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true } } ``` ##### 3. 配置子项目的`tsconfig.json` 每个子项目的`tsconfig.json`需要配置为工程引用项目,并指定其输出目录和依赖关系。 ```json // packages/lib-a/tsconfig.json { "extends": "../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist", "composite": true, // 启用工程引用 "declaration": true, // 生成声明文件 "declarationMap": true // 生成声明文件的映射文件,便于调试 }, "include": ["src/**/*"], "references": [] // 当前项目无直接依赖,留空 } // packages/lib-b/tsconfig.json,假设它依赖于lib-a { "extends": "../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist", "composite": true, "declaration": true, "declarationMap": true }, "include": ["src/**/*"], "references": [ { "path": "../lib-a" } // 指定对lib-a的依赖 ] } // packages/app/tsconfig.json,假设它依赖于lib-a和lib-b { "extends": "../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist", "composite": false, // 通常最终应用层不需要设为composite "moduleResolution": "node", "baseUrl": ".", "paths": { "*": ["node_modules/*", "packages/*/dist/*"] // 解析模块时查找的路径 } }, "include": ["src/**/*"], "references": [ { "path": "../lib-a" }, { "path": "../lib-b" } ] } ``` 注意:在最终的应用层(如`packages/app`),通常不需要将`composite`设置为`true`,因为它不是作为被引用的库存在,而是直接编译成可执行文件或网页的。 ##### 4. 编译项目 使用TypeScript的命令行工具`tsc`,并指定根项目的`tsconfig.json`(如果有的话)或任意一个子项目的`tsconfig.json`进行编译。TypeScript会自动识别并处理工程引用关系。 ```bash tsc -b packages/app/tsconfig.json ``` 或者使用`-b`选项不带任何参数,TypeScript会查找当前目录及其子目录下所有配置了工程引用的`tsconfig.json`文件进行编译。 ```bash tsc -b ``` #### 四、工程引用的高级用法 ##### 1. 增量构建与缓存 TypeScript在编译时会利用缓存来加速后续的编译过程。当使用工程引用时,TypeScript会智能地识别哪些子项目被修改过,并仅重新编译这些项目及其依赖项。 ##### 2. 依赖管理 通过`references`字段明确指定子项目之间的依赖关系,使得项目结构更加清晰,也便于团队成员理解和维护。 ##### 3. 模块化部署 每个子项目都可以独立编译成npm包或其他格式的分发包,便于在不同项目间复用和共享代码。 #### 五、结语 工程引用是TypeScript为大型项目提供的一项非常有用的特性,它不仅能够提高编译效率,还能帮助开发者更好地组织和管理代码。通过合理配置`tsconfig.json`,你可以轻松地将大型项目拆分成多个易于管理的子项目,并在它们之间建立清晰的依赖关系。希望本章内容能够帮助你更好地理解和应用TypeScript的工程引用功能,从而提升你的开发效率和项目质量。
上一篇:
27 | 配置tsconfig.json(2):编译选项
下一篇:
29 | 编译工具:从ts-loader到Babel
该分类下的相关小册推荐:
剑指TypeScript
TypeScript 全面进阶指南
TypeScript入门指南