← 返回目录

第八章:工具链与构建

打造高效的 TypeScript 开发工作流

1. tsconfig.json 进阶

超越基础配置,掌握影响项目结构和编译行为的关键选项。

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "lib": ["ES2022"],
    "outDir": "dist",
    "rootDir": "src",
    "strict": true,
    "incremental": true,
    "tsBuildInfoFile": "./dist/.tsbuildinfo",

    "paths": {
      "@/*": ["./src/*"],
      "@utils/*": ["./src/utils/*"]
    },
    "baseUrl": ".",

    "exactOptionalPropertyTypes": true,
    "noUncheckedIndexedAccess": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}

paths 路径别名

@/utils/... 替代 ../../../utils/...

incremental 增量编译

缓存编译信息,大项目再次编译速度提升 50%+

noUncheckedIndexedAccess

数组/对象索引访问返回 T | undefined,更安全

target vs lib

target 控制输出语法等级,lib 控制可用的类型声明

2. ESLint

ESLint 配合 typescript-eslint 可以在编码阶段捕获潜在问题。推荐使用 Flat Config 新格式。

npm install -D eslint @eslint/js typescript-eslint
// eslint.config.js
import eslint from "@eslint/js";
import tseslint from "typescript-eslint";

export default tseslint.config(
    eslint.configs.recommended,
    ...tseslint.configs.recommended,
    {
        rules: {
            "@typescript-eslint/no-unused-vars": ["error", {
                argsIgnorePattern: "^_",
            }],
            "@typescript-eslint/explicit-function-return-type": "warn",
            "@typescript-eslint/no-explicit-any": "error",
            "no-console": ["warn", { allow: ["warn", "error"] }],
        },
    },
    {
        ignores: ["dist/", "node_modules/"],
    }
);
npx eslint .          # 检查所有文件
npx eslint --fix .    # 自动修复可修复的问题

3. Prettier

Prettier 负责代码格式化——统一风格,结束无谓的格式之争。

npm install -D prettier eslint-config-prettier
// .prettierrc
{
  "semi": true,
  "singleQuote": false,
  "tabWidth": 4,
  "trailingComma": "all",
  "printWidth": 100,
  "arrowParens": "always"
}

在 ESLint 配置中加入 eslint-config-prettier,关闭与 Prettier 冲突的规则:

// eslint.config.js 中追加
import prettier from "eslint-config-prettier";

export default tseslint.config(
    // ...其他配置
    prettier, // 放在最后,覆盖冲突规则
);

编辑器设置 Format on Save,即可在保存时自动格式化。

4. 构建工具对比

tsc

官方

TypeScript 编译器。类型检查 + 转译。速度一般,但是唯一能做完整类型检查的工具。

推荐用途:CI 中做类型检查

esbuild

极快

Go 编写,打包速度比 webpack 快 10-100 倍。不做类型检查,仅转译和打包。

推荐用途:库打包、快速构建

swc

Rust

Rust 编写的转译器,速度接近 esbuild。Next.js 默认使用 swc。

推荐用途:替代 Babel 的快速转译

Vite

全能

开发环境用原生 ESM 实现秒级热更新,生产环境用 Rollup 打包。

推荐用途:前端项目开发 + 构建

推荐组合:开发阶段用 tsc --noEmit 做类型检查 + esbuildVite 做打包/运行。类似 Java 的"编译检查(javac)+ 构建工具(Maven/Gradle)"分离。

5. npm 包发布

发布 TypeScript 包时,需要同时提供编译后的 JS 和类型声明文件。

// package.json 关键字段
{
  "name": "my-ts-lib",
  "version": "1.0.0",
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
  "exports": {
    ".": {
      "import": "./dist/index.mjs",
      "require": "./dist/index.cjs",
      "types": "./dist/index.d.ts"
    }
  },
  "files": ["dist"],
  "scripts": {
    "build": "tsc",
    "prepublishOnly": "npm run build"
  }
}
npm login
npm publish     # 发布到 npm registry

files 字段指定发布包含的文件,比 .npmignore 更直观——白名单优于黑名单。

6. Docker 部署

多阶段构建:第一阶段编译 TypeScript,第二阶段只保留运行时需要的 JS 文件,大幅减小镜像体积。

# Dockerfile
# ===== 构建阶段 =====
FROM node:20-alpine AS builder
WORKDIR /app

COPY package*.json ./
RUN npm ci

COPY tsconfig.json ./
COPY src/ ./src/
RUN npm run build

# ===== 生产阶段 =====
FROM node:20-alpine AS production
WORKDIR /app

COPY package*.json ./
RUN npm ci --omit=dev

COPY --from=builder /app/dist ./dist

ENV NODE_ENV=production
EXPOSE 3000

USER node
CMD ["node", "dist/index.js"]
# 构建并运行
docker build -t my-ts-app .
docker run -p 3000:3000 --env-file .env my-ts-app

多阶段构建的好处

  • 生产镜像不包含 TypeScript 源码和 devDependencies
  • 镜像体积可从 ~800MB 降到 ~150MB
  • 使用 USER node 运行,避免以 root 身份执行

📝 本章要点 & 教程完结

tsconfig 决定项目质量

开启 strict + 额外严格选项,越早越好

ESLint + Prettier 黄金搭档

ESLint 管逻辑质量,Prettier 管格式统一

tsc 检查 + esbuild 打包

类型安全和构建速度兼得

Docker 多阶段构建

编译与运行分离,镜像精简安全

🎉

恭喜完成全部教程!

你已经掌握了 TypeScript 从基础语法到项目部署的完整知识链。

下一步学习建议:

  • 用 TypeScript 实现一个完整的 REST API 项目
  • 探索 NestJS 或 tRPC 等进阶框架
  • 学习 TypeScript 高级类型体操(类型编程)
  • 参与开源项目,阅读优秀的 TS 代码