如何在 Monorepo 设置中使用 TypeScript

monorepo 设置允许您在单个存储库中管理多个包或项目。使用 TypeScript,此设置对于跨不同包共享类型、接口甚至实用程序特别有用。本指南将引导您了解如何在 monorepo 环境中设置 TypeScript。

1. 设置 Monorepo

要设置 monorepo,您​​可以使用 npm 工作区或 yarn 工作区等工具。这些工具可让您管理同一存储库中的多个软件包,并轻松跨项目共享代码。

1.1 初始化 Monorepo

首先,为您的 monorepo 创建一个新文件夹,并使用 npmyarn 初始化它。

mkdir my-monorepo
cd my-monorepo
npm init -y

然后,在你的 package.json 中配置工作区:

{
  "name": "my-monorepo",
  "version": "1.0.0",
  "private": true,
  "workspaces": [
    "packages/*"
  ]
}

此设置告诉 npm 或 yarn,所有包都将位于 packages 文件夹中。

2. 将包添加到 Monorepo

在您的 monorepo 中创建两个包。在此示例中,我们将为可重用代码创建一个 shared 包,并为前端应用程序创建一个 web-app 包。

mkdir -p packages/shared
mkdir -p packages/web-app

在每个包内部,初始化一个 package.json

cd packages/shared
npm init -y

cd ../web-app
npm init -y

3. 将 TypeScript 添加到 Monorepo

接下来,我们将设置 TypeScript。在 monorepo 的根目录下安装 TypeScript 和必要的依赖项:

npm install typescript --save-dev

创建根级 tsconfig.json 来定义整个 monorepo 的 TypeScript 配置:

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "*": ["packages/*/src"]
    },
    "composite": true,
    "declaration": true,
    "outDir": "dist",
    "rootDir": ".",
    "skipLibCheck": true,
    "module": "ESNext",
    "target": "ES6",
    "moduleResolution": "node"
  },
  "include": ["packages/*"]
}

这里的关键是 paths 选项,它允许 TypeScript 理解来自 monorepo 中不同包的导入。

4. 在每个包中配置 TypeScript

每个包都需要自己的 tsconfig.json 才能在 monorepo 中正常工作。以下是 shared 包的示例配置:

{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    "rootDir": "src",
    "outDir": "dist"
  },
  "include": ["src"]
}

对于 web-app 包:

{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    "rootDir": "src",
    "outDir": "dist"
  },
  "include": ["src"]
}

现在,可以在每个包中使用 TypeScript,并且从根目录 tsconfig.json 共享配置。

5. 将 TypeScript 代码添加到包中

让我们向这两个包中添加一些示例 TypeScript 代码。在 shared 包中,创建一个 src 文件夹并添加一个 TypeScript 文件:

mkdir -p packages/shared/src
touch packages/shared/src/index.ts

index.ts 中,导出一个简单的函数:

export const greet = (name: string): string => {
  return `Hello, ${name}!`;
}

web-app 包中,创建一个 src 文件夹和一个 index.ts 文件:

mkdir -p packages/web-app/src
touch packages/web-app/src/index.ts

现在,导入共享函数:

import { greet } from 'shared';

console.log(greet('TypeScript Monorepo'));

6. 构建 Monorepo

要编译 monorepo 中的所有 TypeScript 代码,我们需要使用 TypeScript 编译器。在 monorepo 的根目录中,运行:

npx tsc --build

此命令将按照各自的 tsconfig.json 文件编译所有包。

结论

在本指南中,我们介绍了如何在 monorepo 中设置和使用 TypeScript。通过在 monorepo 结构中组织代码,您可以轻松地在多个软件包之间共享代码,从而使您的开发过程更加高效。借助 TypeScript 的强类型和项目引用,此设置非常适合大型应用程序或共享库。