# 前端工程化

## 背景

前端开发的历程一直充满了创新和快速的变化。最初，前端开发仅仅涉及到编写一些简单的 HTML 和 JavaScript，这些代码通常在浏览器中直接执行，没有特别的构建步骤。然而，随着 web 技术的不断发展和复杂度的提高，前端开发开始变得越来越复杂。这就是为什么我们开始看到了各种前端工程化工具的出现。

### Grunt

**Grunt** 是这个变化的开端。它于2012年发布，是一个 JavaScript 任务运行器，可以自动化你的开发流程。你可以编写一些配置，告诉 Grunt 执行哪些任务，如压缩 JavaScript 或 CSS，检查代码质量等。这大大提高了开发的效率，使开发者可以专注于代码的编写，而不用担心重复性的工作。

### Gulp

然后，**Gulp** 在2013年发布，提出了一种基于流的构建系统，这使得构建过程更高效，也更易于理解。与 Grunt 相比，Gulp 的配置更简洁，开发者可以直观地看到文件如何被处理和转换。

随着 JavaScript 应用的不断扩大和复杂，需要处理更多的模块和依赖关系。这就是 **Browserify** 和 **RequireJS** 出现的原因，它们允许你在浏览器中使用 CommonJS 或 AMD 规范的模块。然而，这些工具的问题是构建速度较慢，尤其是在大型项目中。

### Webpack

**Webpack** 的出现解决了这个问题。Webpack 是一个模块打包器，它把所有的资源（如 JavaScript、CSS、图片等）视为模块，通过分析模块之间的依赖关系，生成优化的代码。Webpack 的出现，使前端开发进入了一个新的阶段，不仅提高了构建的速度，还提供了许多强大的功能，如代码分割、懒加载等。

### Rollup&Parcel

然后是 **Rollup** 和 **Parcel**，这两个工具分别在2015年和2017年发布。Rollup 更专注于库和框架的打包，它通过 tree shaking 去除无用代码，生成更小、更高效的包。Parcel 则是一种零配置的打包工具，它自动处理你的资源和依赖，无需进行复杂的配置。

### Vite

最近，我们看到了一些新的构建工具，如 **Vite** 和 **Snowpack**，它们利用了 ES Modules 的特性，实现了快速的冷启动和即时的热更新。这些工具尤其适合现代的前端开发，因为它们提供了非常好的开发体验，几乎没有等待时间。

### Turbopack

Turbopack是一个针对JavaScript和TypeScript进行优化的增量打包工具，由webpack和Next.js(opens in a new tab)在Vercel(opens in a new tab)开发的**Rust**语言编写。Turbopack性能出色的秘密有两个方面：高度优化的机器代码和低级别的增量计算引擎，使得缓存可以达到单个函数级别。一旦Turbopack完成了一个任务，它就不会再次执行相同任务。



### 常见问题

**为什么会出现前端工程化的工具？**

前端工程化的工具的出现，主要是<u>由于 web 技术的发展和应用的复杂度增加</u>。

现在的 web 应用包含了大量的代码和资源，这就需要一个工具来管理这些资源，处理模块之间的依赖关系，优化代码的大小和性能。

此外，这些工具还可以帮助开发者提高生产力，自动化重复的任务，如编译、压缩、测试等。

总结起来就是：

- 模块依赖关系
- 代码需要压缩（优化大小），提升性能
- 编译（JS：解决ESM，Commonjs规范问题，CSS预编译语言SASS、Less等）
- 其他需求：测试等



**为什么如今的前端需要这些工程化的工具？**

现代的前端开发者需要这些工具，是因为 web 应用变得越来越复杂。

我们需要处理更多的模块和依赖，优化代码的性能，同时还要提供良好的开发体验。

这些工具可以帮助我们达到这些目标，使我们能够更有效地开发和部署 web 应用。



## 前端开发规范

ECMAScript语言的非规范性概述：

ECMAScript是一种面向对象的编程语言，用于在宿主环境中执行计算和操作计算对象。在此定义的ECMAScript并不打算成为具备自给自足计算能力的语言；事实上，在本规范中没有提供外部数据输入或计算结果输出的相关规定。相反，预期一个ECMAScript程序所处的计算环境将不仅提供本规范中描述的对象和其他功能，还会提供某些特定于环境的对象。这些特定于环境的对象超出了本规范讨论范围之外，只需指示它们可能提供可从ECMAScript程序访问和调用的某些属性和函数即可。

**最初设计ECMAScript作为脚本语言使用，但现已广泛应用作为通用编程语言**。脚本语言是一种用于操作、定制和自动化现有系统功能的编程语言。在这样的系统中，通过用户界面已经可以使用有用功能，并且脚本语言是将该功能暴露给程序控制权利机制。因此，现有系统被称为提供了一组宿主环境下存在着各种对象和设施，并完善了脚本语言能力。脚本语言旨在供专业和非专业程序员使用。

ECMAScript最初被设计为Web脚本语言，用于在浏览器中激活网页并作为基于Web的客户端-服务器架构的一部分执行服务器计算。现在，ECMAScript用于提供各种宿主环境下的核心脚本功能。因此，除了特定宿主环境之外，在本文档中还对核心语言进行了规范。

随着ECMAScript的使用范围扩大，它已经超越了简单的脚本编程，并且现在被广泛应用于许多不同环境和规模下的全方位编程任务。随着ECMAScript使用范围的扩展，其提供的功能和设施也得到了增加。如今，ECMAScript已成为一个完整而强大的通用编程语言。

引用：https://tc39.es/ecma262/#sec-overview

### **ECMAScript 规范（ES规范）**

ECMAScript 是 JavaScript 语言的标准，由 ECMA 国际组织制定。这个规范在 JavaScript 语言的发展中起到了重要的作用。

  - **ES5**：ES5 是 JavaScript 的一个重要里程碑，它在 2009 年发布，引入了许多重要的特性，比如 "strict mode"（严格模式）、更高级的数组方法（如 map、reduce、filter 等）、以及 JSON 对象的支持。

  - **ES6/ES2015**：这个版本在 2015 年发布，是 JavaScript 语言的一次大规模更新。它引入了许多新的语法和特性，包括 let 和 const 声明、箭头函数、Promise、模块化（import/export）、类、解构赋值、模板字符串等。

  - **ES7/ES2016 - ES12/ES2021**：从 ES2016 开始，ECMA 国际组织决定每年发布一次规范的更新。这些更新引入了一些新的特性，但没有 ES6 那么大的变动。比如 ES2017 引入了 async/await，ES2020 引入了可选链（optional chaining）和 nullish coalescing operator（空值合并运算符）等。

    ```
    user?.name 
    
    let a = user || defaultValue //  0, '', NaN, null && undefined
    // null && undefined
    user ?? defauteValue
    
    ```

    

### **JavaScript 模块化规范**

 JavaScript 的模块化规范主要有 CommonJS、AMD、UMD 和 ESM。

  - **CommonJS**：CommonJS 是 Node.js 中使用的模块化规范，其核心是 require 和 module.exports。这种规范支持同步加载模块，适合服务端环境，但不适合在浏览器中使用。

  - **AMD（Asynchronous Module Definition）**：AMD 是异步模块定义的规范，它定义了一个 API 来支持异步加载和管理模块。RequireJS 是该规范的主要实现。

  - **UMD（Universal Module Definition）**：UMD 是通用模块定义的规范，它的目的是兼容 CommonJS 和 AMD 规范，使模块可以在各种环境中运行。

  - **ESM（ES Module）**：ESM 是 ES6 引入的模块化规范，它的核心是 import 和 export 关键字。ESM 支持静态导入和导出，使得模块加载更优化，也支持异步加载。浏览器和最新版本的 Node.js 都原生支持 ESM。



### 常见问题

**模块化规范与ES规范的关系性是什么？**

在 ES6/ES2015 规范之前，JavaScript 并没有官方的模块系统。在这种情况下，CommonJS 和 AMD 这样的模块规范应运而生，它们分别在服务器和浏览器环境下为 JavaScript 提供了模块化的解决方案。然而，这些解决方案并不是 JavaScript 语言本身的一部分，而是通过库或者运行时环境来实现的。

随着 JavaScript 语言的发展和应用的复杂度增加，模块化成为了越来越重要的特性。因此，在 ES6/ES2015 规范中，ECMA 组织引入了原生的模块系统，也就是我们所说的 ESM。

ESM 的引入，使得 JavaScript 开发者可以使用 import 和 export 关键字来引入和导出模块，而无需依赖任何第三方库。ESM 提供的是静态的模块结构，这使得工具可以进行更优化的代码分析，例如 tree-shaking（用于消除无用代码）。

值得注意的是，虽然 ESM 是 ECMAScript 规范的一部分，但在浏览器和 Node.js 环境中，对 ESM 的支持是逐步实现的。

尤其在 Node.js 中，长期以来 CommonJS 仍是主要的模块系统。直到近年，Node.js 才开始增加对 ESM 的支持。而在浏览器中，现代浏览器已经广泛支持 ESM，但对于旧版浏览器，仍然需要通过工具如 Babel 或 webpack 将 ESM 转换为能被这些浏览器理解的代码。



## 打包工具对比

### npmtrends

![image-20230729105641297](https://static.www.toimc.com/blog/picgo/2023/07/29/image-20230729105641297-51f612.webp)



### 分类及特点比较

| 工具      | 特点                                                         | 适用场景                                         | 典型项目示例                                                 |
| --------- | ------------------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------------------ |
| Webpack   | 高度可配置性和丰富的插件生态，能处理各种类型的文件，支持热更新和代码优化。**构建速度可能较慢**。 | 复杂的大型项目，或者需要高度定制构建过程的项目。 | 一个大型的 React 或 Vue 应用，有多种文件类型需要处理，需要复杂的加载器和插件进行处理。 |
| Rollup    | 支持 ES6 的模块化，可以通过 tree-shaking 去除无用代码，生成更小、更高效的包。 | 构建库或框架。                                   | 一个 JavaScript 库，如 Lodash 或 Vue，需要打包成一个单一的文件，去除无用代码。 |
| Gulp      | 自动化构建工具，可以处理各种构建任务，如压缩、编译、单元测试等。 | 需要自动化处理多种任务的项目。                   | 一个需要处理多种构建任务（如编译 Sass，压缩图片，运行测试等）的项目。 |
| Vite      | 利用 ES6 的模块化特性，实现快速的冷启动和实时热更新，可以与 Vue、React、Preact 等框架无缝配合。 | 快速开发和迭代的现代前端项目。                   | 一个 Vue 或 React 的单页应用，需要快速的开发体验和热模块替换。 |
| Turbopack | 一个使用 Rust 语言编写的增量打包工具，专门为 JavaScript 和 TypeScript 进行优化 | ESM或者TS开发场景                                | 一个React开发的部署到Vercel上的单页应用，需要快速部署及打包。 |



## TypeScript运行时比较

- [tsx](https://github.com/esbuild-kit/tsx)
- [@swc/register](https://github.com/swc-project/register)
- [esbuild-runner](https://github.com/folke/esbuild-runner)
- [jiti](https://github.com/unjs/jiti)
- [ts-node](https://github.com/TypeStrong/ts-node)

### npmtrends

![image-20230729105905544](https://static.www.toimc.com/blog/picgo/2023/07/29/image-20230729105905544-ac82e4.webp)



## 分类比较

https://github.com/privatenumber/ts-runtime-comparison

|              | [tsx](https://github.com/esbuild-kit/tsx)                    | [@swc/register](https://github.com/swc-project/register)     | [esbuild-runner](https://github.com/folke/esbuild-runner)    | [jiti](https://github.com/unjs/jiti)                         | [sucrase](https://github.com/alangpierce/sucrase)            | [ts-node](https://github.com/TypeStrong/ts-node)             | [tsm](https://github.com/lukeed/tsm)                         |
| ------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| npm下载量    | [![img](https://camo.githubusercontent.com/8e87dbdf0d0083096701f666383f2c3d992a49212dc01874912ad950baa805e0/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f7473783f6c6162656c)](https://www.npmjs.com/package/tsx) | [![img](https://camo.githubusercontent.com/b1e948e4f4039b94e4083faeba4c9243a593096cb507ecdf4aa7ff818e3fc71f/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f407377632f72656769737465723f6c6162656c)](https://www.npmjs.com/package/@swc/register) | [![img](https://camo.githubusercontent.com/db650f3d61504e75257a9a2fbe221bb1e6469e7116f49fb60c61722719ee72c2/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f65736275696c642d72756e6e65723f6c6162656c)](https://www.npmjs.com/package/esbuild-runner) | [![img](https://camo.githubusercontent.com/baefb378528dd0299251f12397535e2b639f3b60d24473a18eff4270c822824f/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f6a6974693f6c6162656c)](https://www.npmjs.com/package/jiti) | [![img](https://camo.githubusercontent.com/e9ba0c4a3862758f09961b1c8eb7d98f17d319b00a7e08181f68813affc8293e/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f737563726173653f6c6162656c)](https://www.npmjs.com/package/sucrase) | [![img](https://camo.githubusercontent.com/8c8a059b1cd8f0664c6a6a83a28fda11ca3f1f62b3fb74ae7afac2ba234f5175/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f74732d6e6f64653f6c6162656c)](https://www.npmjs.com/package/ts-node) | [![img](https://camo.githubusercontent.com/215817d33796c8d06aeb0ad857b474cdfa7bb43c18968dd55837d9da461f8d86/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f74736d3f6c6162656c)](https://www.npmjs.com/package/tsm) |
| 安装大小     | [![img](https://camo.githubusercontent.com/3e05a346af0b2864413eb10a06856338176228d139281a3e62863ff8c8fd2077/68747470733a2f2f62616467656e2e6e65742f7061636b61676570686f6269612f696e7374616c6c2f7473783f636f6c6f723d626c7565266c6162656c)](https://packagephobia.com/result?p=tsx) | [![img](https://camo.githubusercontent.com/40f787be521f6a4060976e1de924027ac00f0bb7e478235d604c8a77b8b9934f/68747470733a2f2f62616467656e2e6e65742f7061636b61676570686f6269612f696e7374616c6c2f407377632f72656769737465723f636f6c6f723d626c7565266c6162656c)](https://packagephobia.com/result?p=@swc/register) | [![img](https://camo.githubusercontent.com/32e914201115f78c1df54fc00927ae7244cd1f6ef9d75834c21fdcaba9069441/68747470733a2f2f62616467656e2e6e65742f7061636b61676570686f6269612f696e7374616c6c2f65736275696c642d72756e6e65723f636f6c6f723d626c7565266c6162656c)](https://packagephobia.com/result?p=esbuild-runner) | [![img](https://camo.githubusercontent.com/472636e7e39a5765b69f7badec15bbc6a13cd93ccb997ddb6a5c7ccb2e11430f/68747470733a2f2f62616467656e2e6e65742f7061636b61676570686f6269612f696e7374616c6c2f6a6974693f636f6c6f723d626c7565266c6162656c)](https://packagephobia.com/result?p=jiti) | [![img](https://camo.githubusercontent.com/80d4fab6fd71776b7a3225118eecebcbb41851545eb6a32bba8fe6497c24dde0/68747470733a2f2f62616467656e2e6e65742f7061636b61676570686f6269612f696e7374616c6c2f737563726173653f636f6c6f723d626c7565266c6162656c)](https://packagephobia.com/result?p=sucrase) | [![img](https://camo.githubusercontent.com/d2de64bdfe7b6be09ace2fd64671cadf6c7d3e3670cad93f1c036ed1b9bc92cc/68747470733a2f2f62616467656e2e6e65742f7061636b61676570686f6269612f696e7374616c6c2f74732d6e6f64653f636f6c6f723d626c7565266c6162656c)](https://packagephobia.com/result?p=ts-node) | [![img](https://camo.githubusercontent.com/2dd66c64677ac18eb43eb1dd72327d7461854aa33a0f1fda73677b3875760cba/68747470733a2f2f62616467656e2e6e65742f7061636b61676570686f6269612f696e7374616c6c2f74736d3f636f6c6f723d626c7565266c6162656c)](https://packagephobia.com/result?p=tsm) |
| Github星     | [![img](https://camo.githubusercontent.com/80c91e70f7e6979203619f96f7a92421277e13d8b34c16df6ce07dd0f0e95fa9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f65736275696c642d6b69742f7473783f636f6c6f723d67726179266c6162656c)](https://github.com/esbuild-kit/tsx/stargazers) | [![img](https://camo.githubusercontent.com/a4fa8fcb45f2a7b1a7855194108ce2d2253b33b92b482369efaa13570188db9d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f7377632d70726f6a6563742f72656769737465723f636f6c6f723d67726179266c6162656c)](https://github.com/swc-project/register/stargazers) | [![img](https://camo.githubusercontent.com/46a599bb19270e2651e6255838336128b4be2de7c861b233a52a787321c2e7b0/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f666f6c6b652f65736275696c642d72756e6e65723f636f6c6f723d67726179266c6162656c)](https://github.com/folke/esbuild-runner/stargazers) | [![img](https://camo.githubusercontent.com/c39358236ac7746eff3eb1f361914a2b37682f52d3a71eb45f62ac926e49ab0c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f756e6a732f6a6974693f636f6c6f723d67726179266c6162656c)](https://github.com/unjs/jiti/stargazers) | [![img](https://camo.githubusercontent.com/0e9b418d4f7e441b300e66f677588f7b6d3a68c9f55490c980d75c1679d39232/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f616c616e677069657263652f737563726173653f636f6c6f723d67726179266c6162656c)](https://github.com/alangpierce/sucrase/stargazers) | [![img](https://camo.githubusercontent.com/d1324ae114cc074825649241c2324b0e2a7b73358bc92fdb9f707040ba54b204/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f547970655374726f6e672f74732d6e6f64653f636f6c6f723d67726179266c6162656c)](https://github.com/TypeStrong/ts-node/stargazers) | [![img](https://camo.githubusercontent.com/420b255cedeeb3db1528df88c57c2bf6e5010db6a16f0ebfeca1aaae1c634b06/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6c756b6565642f74736d3f636f6c6f723d67726179266c6162656c)](https://github.com/lukeed/tsm/stargazers) |
| 开放Issues   | [![img](https://camo.githubusercontent.com/a1516bbe29d712bbcfae508e2a3207aa3440ee6b217ac6b3d77b969d3d206786/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d7261772f65736275696c642d6b69742f7473783f636f6c6f723d6f72616e6765266c6162656c)](https://github.com/esbuild-kit/tsx/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) | [![img](https://camo.githubusercontent.com/3a8aa05e7f49564b9ca43bdb18bcb5b59449828ec17b1ee37d6157ab00d1d4db/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d7261772f7377632d70726f6a6563742f72656769737465723f636f6c6f723d6f72616e6765266c6162656c)](https://github.com/swc-project/register/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) | [![img](https://camo.githubusercontent.com/67cf9af5368803478b14a2d23a95e5c03e58903beb85a5dca9cdd23a57171d49/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d7261772f666f6c6b652f65736275696c642d72756e6e65723f636f6c6f723d6f72616e6765266c6162656c)](https://github.com/folke/esbuild-runner/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) | [![img](https://camo.githubusercontent.com/cdb83fe204c3a8981e467786c429d1ffd819fc703a26505c43099d7dc30e29e3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d7261772f756e6a732f6a6974693f636f6c6f723d6f72616e6765266c6162656c)](https://github.com/unjs/jiti/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) | [![img](https://camo.githubusercontent.com/86e63061e8d814e3594c2655d79682ae7a5ff2891455fa08270d4a23378fb8f8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d7261772f616c616e677069657263652f737563726173653f636f6c6f723d6f72616e6765266c6162656c)](https://github.com/alangpierce/sucrase/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) | [![img](https://camo.githubusercontent.com/ad7132358bb9e5ca0594dc1ed51be9888148100271ffb9598b2bd16eab2bf959/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d7261772f547970655374726f6e672f74732d6e6f64653f636f6c6f723d6f72616e6765266c6162656c)](https://github.com/TypeStrong/ts-node/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) | [![img](https://camo.githubusercontent.com/96e4356b71daa4cd19c28d84bf0cebb72d396192a06610c66085703472427e6d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d7261772f6c756b6565642f74736d3f636f6c6f723d6f72616e6765266c6162656c)](https://github.com/lukeed/tsm/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) |
| 关闭Issues   | [![img](https://camo.githubusercontent.com/d07f826c9a2e5ab5807f130a7b962195381cf6c025bd58a98ff70c7db044de80/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d636c6f7365642d7261772f65736275696c642d6b69742f7473783f636f6c6f723d626c7565266c6162656c)](https://github.com/esbuild-kit/tsx/issues?q=is%3Aissue+is%3Aclosed+sort%3Aupdated-desc) | [![img](https://camo.githubusercontent.com/431daddfc9741cef54d9dd022869cedcba23c543cbe469c87514eab9e5525002/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d636c6f7365642d7261772f7377632d70726f6a6563742f72656769737465723f636f6c6f723d626c7565266c6162656c)](https://github.com/swc-project/register/issues?q=is%3Aissue+is%3Aclosed+sort%3Aupdated-desc) | [![img](https://camo.githubusercontent.com/551e59ddca340c011d594796942bfe340c52ca3b9c0c561c1f2111d69b960093/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d636c6f7365642d7261772f666f6c6b652f65736275696c642d72756e6e65723f636f6c6f723d626c7565266c6162656c)](https://github.com/folke/esbuild-runner/issues?q=is%3Aissue+is%3Aclosed+sort%3Aupdated-desc) | [![img](https://camo.githubusercontent.com/ed090b37299566b56925408fcdce5850331514160a08aa8270e2d1fbcfae3931/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d636c6f7365642d7261772f756e6a732f6a6974693f636f6c6f723d626c7565266c6162656c)](https://github.com/unjs/jiti/issues?q=is%3Aissue+is%3Aclosed+sort%3Aupdated-desc) | [![img](https://camo.githubusercontent.com/a9af6349169e9bf61c89f69a5ee2bb5d6cf73f7ef619bcd4ab1f2dc1806b90ac/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d636c6f7365642d7261772f616c616e677069657263652f737563726173653f636f6c6f723d626c7565266c6162656c)](https://github.com/alangpierce/sucrase/issues?q=is%3Aissue+is%3Aclosed+sort%3Aupdated-desc) | [![img](https://camo.githubusercontent.com/0d4bc1439e25ca3fc81e25fdebc36e8e0a57577abb79c2327e90c300922e3552/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d636c6f7365642d7261772f547970655374726f6e672f74732d6e6f64653f636f6c6f723d626c7565266c6162656c)](https://github.com/TypeStrong/ts-node/issues?q=is%3Aissue+is%3Aclosed+sort%3Aupdated-desc) | [![img](https://camo.githubusercontent.com/674ef3402b4e5bed3afcb2f95a0f2581d055c99b3ab43c6234cd044f413c5db2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d636c6f7365642d7261772f6c756b6565642f74736d3f636f6c6f723d626c7565266c6162656c)](https://github.com/lukeed/tsm/issues?q=is%3Aissue+is%3Aclosed+sort%3Aupdated-desc) |
| 最后一次提交 | [![img](https://camo.githubusercontent.com/86fc43053df13326a9821c3caff06347f1c11bea9114bdb8632274e56d845b8d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f65736275696c642d6b69742f7473783f6c6162656c)](https://camo.githubusercontent.com/86fc43053df13326a9821c3caff06347f1c11bea9114bdb8632274e56d845b8d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f65736275696c642d6b69742f7473783f6c6162656c) | [![img](https://camo.githubusercontent.com/0b61512f0dac287c43b64c958abcbc7192c093161ef474922906bda781bf9c3d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f7377632d70726f6a6563742f72656769737465723f6c6162656c)](https://camo.githubusercontent.com/0b61512f0dac287c43b64c958abcbc7192c093161ef474922906bda781bf9c3d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f7377632d70726f6a6563742f72656769737465723f6c6162656c) | [![img](https://camo.githubusercontent.com/e0f1fe1f5d2d78f2112e1c5dd0a3622dce17c55248552d317b20d76c118fabba/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f666f6c6b652f65736275696c642d72756e6e65723f6c6162656c)](https://camo.githubusercontent.com/e0f1fe1f5d2d78f2112e1c5dd0a3622dce17c55248552d317b20d76c118fabba/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f666f6c6b652f65736275696c642d72756e6e65723f6c6162656c) | [![img](https://camo.githubusercontent.com/ef901dc5d40ab53ce78ef771df6b07b40fe204770e8df2e221572a76cfdab808/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f756e6a732f6a6974693f6c6162656c)](https://camo.githubusercontent.com/ef901dc5d40ab53ce78ef771df6b07b40fe204770e8df2e221572a76cfdab808/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f756e6a732f6a6974693f6c6162656c) | [![img](https://camo.githubusercontent.com/80f648dc3f7e8525bb1a1a07579d9423e2cf6d2e43e24587580869d36fefc7cd/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f616c616e677069657263652f737563726173653f6c6162656c)](https://camo.githubusercontent.com/80f648dc3f7e8525bb1a1a07579d9423e2cf6d2e43e24587580869d36fefc7cd/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f616c616e677069657263652f737563726173653f6c6162656c) | [![img](https://camo.githubusercontent.com/c4dd58b9efaa2fbb4e2ac410c6915ec4ac3e1a91afd69e3acff021af5f5cf41f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f547970655374726f6e672f74732d6e6f64653f6c6162656c)](https://camo.githubusercontent.com/c4dd58b9efaa2fbb4e2ac410c6915ec4ac3e1a91afd69e3acff021af5f5cf41f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f547970655374726f6e672f74732d6e6f64653f6c6162656c) | [![img](https://camo.githubusercontent.com/128551118798590038e55f13fc4cecdc181dc06f48f51cf8097721ec5380597d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6c756b6565642f74736d3f6c6162656c)](https://camo.githubusercontent.com/128551118798590038e55f13fc4cecdc181dc06f48f51cf8097721ec5380597d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6c756b6565642f74736d3f6c6162656c) |