# TS编译器、打包工具

## 主要区别

运行时（Runtime）和编译器（Compiler）是两个不同的概念，它们在软件开发和执行中扮演着不同的角色。

1. **编译器**：
   - 功能：将源代码（如 TypeScript）转换成目标代码（通常是 JavaScript）。
   - 目的：使得源代码能在特定的运行环境（如浏览器或 Node.js）上执行。
   - 例子：TypeScript 的 tsc 编译器、Babel、esbuild、SWC。
2. **运行时**：
   - 功能：提供执行程序所需的环境，这包括了内存管理、I/O、硬件交互等。
   - 目的：运行编译后的代码，使其能够与操作系统和硬件交互。
   - 例子：Node.js（为 JavaScript 代码提供服务器端的运行环境）、浏览器（为 JavaScript 提供客户端的运行环境）。

在某些情况下，一个平台可能同时包含编译器和运行时。例如，一些现代的 JavaScript 运行时（如 Deno）内置了 TypeScript 的支持，这意味着它们可以直接处理 TypeScript 代码，无需事先将其编译为 JavaScript。在这种情况下，运行时中包含了一种“即时编译”的机制，但这并不常见。



## 编译器

1. **tsc (TypeScript Compiler)**
   - 特点：官方编译器，支持所有 TypeScript 特性。
   - 优点：完全兼容 TypeScript，更新及时。
   - 缺点：编译速度相对较慢。
2. **Babel**
   - 特点：通过插件支持 TypeScript，同时兼容 JavaScript。
   - 优点：集成到现有的 JavaScript 项目中容易。
   - 缺点：需要额外的插件来处理 TypeScript 特性，不支持类型检查。
3. **esbuild**
   - 特点：使用 Go 编写的极速打包工具，支持 TypeScript。
   - 优点：速度快，适合大型项目。
   - 缺点：对某些边缘情况的支持不如 tsc。
4. **SWC (Speedy Web Compiler)**
   - 特点：使用 Rust 编写，重视性能。
   - 优点：编译速度快。
   - 缺点：可能不支持 TypeScript 的最新特性。

## 打包工具

1. **Rollup**
   - 特点：更专注于 ES6 模块，通常用于库和工具的打包。
   - 优点：生成的包体积小，Tree Shaking 效果好。
   - 缺点：对复杂的应用程序打包可能不如 Webpack 强大。
2. **Webpack**
   - 特点：功能全面，社区支持强大。
   - 优点：高度可配置，插件众多。
   - 缺点：配置复杂，初学者可能不易上手。

## TS运行时

1. **tsx (esbuild-kit/tsx)**
   - 使用 esbuild 实现，主要用于 Node.js 环境中运行 TypeScript。
   - 优点：**执行速度快，因为 esbuild 是用 Go 编写的，以速度著称。**
   - 缺点：可能在一些复杂的 TypeScript 特性支持上有限。
   - 适用场景：适用于需要快速启动和较简单 TypeScript 项目的场景。
2. **@swc/register (swc-project/register)**
   - 使用 SWC 实现，类似于 Babel 的功能，用于即时编译 TypeScript。
   - **优点：编译速度快，SWC 用 Rust 编写，专注于性能。**
   - 缺点：在某些 TypeScript 特性的支持上可能稍逊于 tsc。
   - 适用场景：大型项目或需要快速编译的场景。
3. **esbuild-runner (folke/esbuild-runner)**
   - 也是基于 esbuild，用于执行 TypeScript 和 JSX 文件。
   - **优点：快速启动和执行，尤其适合开发环境。**
   - 缺点：可能不适合复杂的或依赖重的项目。
   - 适用场景：快速迭代的开发环境。
4. **jiti (unjs/jiti)**
   - 支持即时编译 TypeScript 和 ESModule。
   - 优点：无需预先编译，支持动态导入。
   - 缺点：性能可能不如基于 esbuild 或 SWC 的工具。
   - 适用场景：**需要动态导入和对 ESModule 的支持的场景**。
5. **ts-node (TypeStrong/ts-node)**
   - 官方支持的 TypeScript 运行时。
   - 优点：支持全部 TypeScript 特性，社区支持强大。
   - 缺点：相比于基于 esbuild 或 SWC 的工具，编译和执行速度较慢。
   - 适用场景：对 TypeScript 特性全面支持的项目，尤其是复杂项目。

最佳实践：

- 对于需要快速启动和执行、不太复杂的项目，可以考虑使用基于 esbuild 的 `tsx` 或 `esbuild-runner`。
- 如果项目更侧重于性能，同时可以接受对某些 TypeScript 特性支持上的妥协，可以选择 `@swc/register`、``。
- 对于需要全面的 TypeScript 特性支持和较为复杂的项目，`ts-node` 是一个可靠的选择。
- `jiti` 在需要动态导入和 ESModule 支持的场景中比较有优势。



## Node侧运行时

1. **Node.js**
   - 特点：最流行的 JavaScript 运行时，能够在服务器上运行 JavaScript。
   - 优点：社区强大，模块众多。
   - 缺点：对于计算密集型任务不是最佳选择。
2. **Deno**
   - 特点：安全性为首要考虑的现代 JavaScript/TypeScript 运行时。
   - 优点：内置 TypeScript 支持，安全性更高。
   - 缺点：相比 Node.js，生态系统较小。
3. **浏览器环境**
   - 特点：直接在浏览器中运行 JavaScript/TypeScript。
   - 优点：无需安装额外运行时，即时反馈。
   - 缺点：受限于浏览器的兼容性和性能。