# sucrase 中文文档

规范地址：https://npmcn.com/package/sucrase/

版本：3\.35\.1
npm 元数据更新时间：2025-11-19T17:10:52.039Z
中文译文更新时间：2026-11-05T16:34:02.703Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/sucrase
原文对照：https://npmcn.com/package/sucrase/?lang=original
项目主页：https://github.com/alangpierce/sucrase#readme
源码仓库：https://github.com/alangpierce/sucrase

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：1.1 MB，190 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- Node.js 要求：\>=16 \|\| 14 \>=14\.17
- 运行依赖：7 个
- 首次发布：2017-10-03T17:24:40.455Z
- 最新版本发布：2025-11-19T17:10:51.830Z
- 近 30 天下载量：184085697（2026-10-05 至 2026-11-03，npm 官方下载统计）
- 已发布版本数：83（近 12 个月 1 个）

## 中文简介

超快替代 Babel 当你可以瞄准现代JS运行时

## 安装

```sh
npm install sucrase
```

也可以使用：`pnpm add sucrase`、`yarn add sucrase`、`bun add sucrase`

## README

# 苏克蕾丝

[![Build Status](https://github.com/alangpierce/sucrase/workflows/All%20tests/badge.svg)](https://github.com/alangpierce/sucrase/actions) [![npm version](https://img.shields.io/npm/v/sucrase.svg)](https://www.npmjs.com/package/sucrase) [![Install Size](https://packagephobia.now.sh/badge?p=sucrase)](https://packagephobia.now.sh/result?p=sucrase) [![MIT License](https://img.shields.io/npm/l/express.svg?maxAge=2592000)](https://npmcn.com/package/sucrase/LICENSE) [![Join the chat at https://gitter.im/sucrasejs](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/sucrasejs/Lobby)

## [试试看](https://sucrase.io/)

## 快速使用

```bash
yarn add --dev sucrase  # Or npm install --save-dev sucrase
node -r sucrase/register main.ts
```

使用 [ts-节点](https://github.com/TypeStrong/ts-node) 一体化:

```bash
yarn add --dev sucrase ts-node typescript
./node_modules/.bin/ts-node --transpiler sucrase/ts-node-plugin main.ts
```

## 项目概览

Sucrase是Babel的替代品,允许超快发展建设. 而不是汇编大量联署材料特征,以便能够在互联网上工作 探索者 Sucrase 假设您正在使用最近浏览器或最近开发 节点(Node.js)版本,因此它专注于编译非标准语言扩展: JSX, TypeScript, and Flow. 互联网档案馆的存檔,存档日期2013-12-21., 互联网档案馆的存檔,存档日期2013-12-21. 因为范围较小,苏克蕾丝可以逃走 其建筑性能更强,但不太能扩展 可维护。 Sucrase的解析器来自 Babel的解析器(所以Sucrase是 亏欠了Babel,没有它不可能) 把它修剪成一个 babel解决的焦点子集。 如果符合你的用法,希望是苏克雷斯 可以加快你的发展经验!

**苏克瑞斯被广泛测试.** 它能成功构建 页:1 [轮椅](https://benchling.com/) 前端代码, [宝贝](https://github.com/babel/babel), (中文(简体) ), [反应](https://github.com/facebook/react), (中文(简体) ), [TSLint 图像](https://github.com/palantir/tslint), (中文(简体) ), [阿波罗客户端](https://github.com/apollographql/apollo-client),以及 [脱奶](https://github.com/decaffeinate/decaffeinate) 随着所有测试的通过, 大约100万行代码总计.

**苏克雷斯大约比巴贝尔快了20x.** 这里有一个测量方法 Sucrase与其他工具比较 在编译 Jest 代码库3次, 共约360k行代码 :

```text
            Time            Speed
Sucrase     0.57 seconds    636975 lines per second
swc         1.19 seconds    304526 lines per second
esbuild     1.45 seconds    248692 lines per second
TypeScript  8.98 seconds    40240 lines per second
Babel       9.18 seconds    39366 lines per second
```

详情:2022年7月测量出. 工具以单行模式运行,不取暖. 见 [基准代码](https://github.com/alangpierce/sucrase/blob/main/benchmark/benchmark.ts) 关于方法和说明.

## 变换

Sucrase中的主要配置选项是一系列变形名. 这些 可进行变换:

-   **日记**: 启用JSX语法. 默认情况下,JSX改为: `React.createClass`, (中文(简体) ), 但可予以保留或改为 `_jsx()` 通过设置 `jsxRuntime` 选项. 还加上 `createReactClass` 显示名称和 JSX 上下文信息.
-   **类型标记**: 将类型脚本代码编译为 JavaScript, 删除类型 说明和处理功能,如enums. 不检查类型 。 苏克蕾丝 独立转换每个文件,所以您应该启用 `isolatedModules` TypeScript 旗帜, 使类型检查器无法使用像 : `const enum`s,需要交叉文件编译. Sucrase 选项 `keepUnusedImports` 可用于禁用所有自动取出与TS类似的进出口 `verbatimModuleSyntax`。 。 。 .
-   **流动**: 删除流程类型注释。 不检查类型 .
-   **进口**: 转变ES模块(`import`编号 :`export`)改为普通JS (单位:千美元)`require`编号 :`module.exports`)使用与 Babel 和 TypeScript 相同的方法 与 `--esModuleInterop`如果 `preserveDynamicImport` 指定在 Sucrase 中 选项,然后动态 `import` 表达方式是单独表达的,特别是 在节点中用于装入只使用无害环境管理的库。 若为 `preserveDynamicImport` 没有 指定, `import` 表达式被转换成承诺式调用 `require`。 。 。 .
-   **反应加载器**: 执行等同 `react-hot-loader/babel` 转换 [反应加载器](https://github.com/gaearon/react-hot-loader) 项目。 这样可以实现高级热重装使用大小写,例如编辑 约束方法.
-   **欢笑**目标数: [欢笑](https://jestjs.io/) 方法调用高于导入的 一样的方式 [辣椒加热剂](https://github.com/facebook/jest/tree/master/packages/babel-plugin-jest-hoist)。 。 。 . 不验证转交给 `jest.mock`但同样的规则仍然适用.

当 `imports` 变换是 _没有_ 规定(即在针对无害环境管理时) `injectCreateRequireForImportRequire` 可指定转换 TS 选项 `import foo = require("foo");` 以一种与 [类型脚本 4.7 行为](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#commonjs-interoperability) 与 `module: nodenext`。 。 。 .

这些更新的JS功能在默认情况下被改变:

-   [可选链条](https://github.com/tc39/proposal-optional-chaining)数字 : `a?.b`
-   [裸体结缔](https://github.com/tc39/proposal-nullish-coalescing)数字 : `a ?? b`
-   [类字段](https://github.com/tc39/proposal-class-fields)数字 : `class C { x = 1; }`。 。 。 . 包括静态字段,但不包括 `#x` 私人领域语法.
-   [数字分隔符](https://github.com/tc39/proposal-numeric-separator)数字 : `const n = 1_234;`
-   [可选渔获绑定](https://github.com/tc39/proposal-optional-catch-binding)数字 : `try { doThing(); } catch { }`。 。 。 .

如果您的目标运行时间支持这些功能, 您可以指定 `disableESTransforms: true` 因此,苏克雷斯保留了语法而不是 试图改变它。 注意转接和标准类字段的行为 略有不同;见 [TypeScript 3.7 发布注释](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#the-usedefineforclassfields-flag-and-the-declare-property-modifier) 详细情况。 如果您使用 TypeScript, 您可以启用 TypeScript 选项 `useDefineForClassFields` 以允许检查与这些差异有关的出错.

### 不支持的语法

所有上述JS语法都会"通过",需要支持 由你的JS运行时间。 例如:

-   装饰者,私人领域, `throw` 表达式,生成箭头函数, 财务报告和审定财务报表 `do` 表达式在浏览器和节点中都是不支持的(截至此) sucrase并没有试图把它们转写出来.
-   对象休息/ 扩展、 同步函数和同步延展器都是最近出现的 功能应该很好,但如果使用旧的 网络包装等工具的版本. BigInt和较新的正则特性可能或不会 工作,基于你的工具.

### JSX 选项

默认情况下,JSX被编译为在开发模式下反应函数. 这可能是 配置了一些选项 :

-   **jsx运行时**: 指定变换模式的字符串,可以是三个值之一:
    -   `"classic"` (默认) : 最初JSX的变换 `React.createElement` 默认. 要配置非反应使用大小写,请指定:
        -   **jsx普拉格马**: 元素创建函数,默认为 `React.createElement`。 。 。 .
        -   **jsx 断裂板**: 碎片组件,默认为 `React.Fragment`。 。 。 .
    -   `"automatic"`编号: [新的JSX转型](https://reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html) 由 React 17 引入,它呼唤 `jsx` 函数和自动添加导入语句. 要配置非反应使用大小写,请指定:
        -   **jsxIm 导入源**: 自动生成的导入语句的软件包名称,默认为 `react`。 。 。 .
    -   `"preserve"`:不要变换JSX,而是在输出码中作为-是放出.
-   **生产**: 如果 `true`,使用函数的生产版本,但不包括调试 资料。 在使用自动变换的生产模式时, 这个 _必须_ 为: 设置为正,以避免错误 `jsxDEV` 失踪了.

### 遗产 共同JS 接口

可使用两个遗留模式 `imports` 变换 :

-   **启用LegacyType脚本Module Interop**: 使用默认类型脚本方法 改为 commonJS 接口,而不是假设类型脚本 `--esModuleInterop` 启用了旗帜。 例如,如果 CJS 模块输出一个函数,则遗留 TypeScript 接口需要您写入 `import * as add from './add';`, (中文(简体) ), 而 Babel、Webpack、Node.js 和 TypeScript 则使用 `--esModuleInterop` 需求 您要写 `import add from './add';`如本报告所述 [文档](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#support-for-import-d-from-cjs-form-commonjs-modules-with---esmoduleinterop), (中文(简体) ), typeScript 团队建议您总是使用 `--esModuleInterop`。 。 。 .
-   **启用 LegacyBabel5 模块接口**: 使用 Babel 5 方法处理普通JS 交互, 这样您就可以运行 `require('./MyModule')` 改为 `require('./MyModule').default`类似 [bel-plugin-add-module-exports (中文(简体) )](https://github.com/59naga/babel-plugin-add-module-exports)。 。 。 .

## 使用量

### 工具集成

-   [网络软件包](https://github.com/alangpierce/sucrase/tree/main/integrations/webpack-loader)
-   [古尔普](https://github.com/alangpierce/sucrase/tree/main/integrations/gulp-plugin)
-   [欢乐](https://github.com/alangpierce/sucrase/tree/main/integrations/jest-plugin)
-   [滚动](https://github.com/rollup/plugins/tree/master/packages/sucrase)
-   [花椰菜](https://github.com/stefanpenner/broccoli-sucrase)

### 节点使用

最有力的方法是使用Sucrase插件 [ts-节点](https://github.com/TypeStrong/ts-node), (中文(简体) ), 它具有各种节点集成方式,并且通过 `tsconfig.json`数字 :

```bash
ts-node --transpiler sucrase/ts-node-plugin
```

对于没有针对无害环境管理的项目,Sucrase还需要与某些项目挂钩 以几种方式访问的合理默认:

-   从代码 : `require("sucrase/register");`
-   当引用节点时: `node -r sucrase/register main.ts`
-   作为单独的二进制 : `sucrase-node main.ts`

选项可以通过一个 `SUCRASE_OPTIONS` 环境 变量持有 JSON 串选项.

### 向联合来文编写项目

简单来说 Sucrase有个 `sucrase` 反射出你的CLI图像 输出目录的目录结构 :

```bash
sucrase ./srcDir -d ./outDir --transforms typescript,imports
```

### 代码的使用

对于任何先进的使用案例,Sucrase可以直接从JS调用:

```js
import {transform} from "sucrase";
const compiledCode = transform(code, {transforms: ["typescript", "imports"]}).code;
```

## 苏克雷斯不是

Sucrase是用来帮助最常见的案件,但它的目的不是 几乎拥有巴贝尔的范围和多功能。 一些具体例子:

-   Sucrase 不检查您的代码错误 。 Sucrase的合同是,如果你 给出有效的代码,它将产生有效的JS代码. 如果你给它无效 代码,它可能会产生无效代码, 它可能会产生有效的代码,或者它可能会 给出一个错误。 总是使用带有插件或打字器的Sucrase, 比较多 适合检查错误.
-   Sucrase 无法插件 。 根据目前的建筑结构,改造需要 明确书写相互合作,因此,每个附加 改造需要大量的额外工作.
-   Sucrase 不适合原型语言扩展和即将到来的语言 特性。 其较快的架构使得新的转型更难写 和更加脆弱.
-   Sucrase永远不会为IE等旧浏览器产生代码. 向下编译代码 对ES5来说 比Sucrase需要的改变要复杂得多 来.
-   Sucrase对于实施即将到来的联署材料特征犹豫不决,尽管其中一些特征 出于务实的理由,执行是有意义的。 其主要重点是语言 jSX, TypeScript, Flow) 永远不会得到JS支持的扩展 运行时间.
-   和 Babel 一样, Sucrase 不是一个排入检查器, 必须处理每个文件 隔离 例如,类型脚本 `const enum`s 被视为正常 `enum`而不是在文档中排入.
-   在生产中使用Sucrase之前,你应该仔细考虑. 苏克丽丝是 在很多情况下, Babel 或 tsc 将会更多 适合生产建筑.

见 [项目愿景](https://npmcn.com/package/sucrase/docs/PROJECT_VISION.md) 详细信息 苏克雷斯背后的哲学.

## 动机

随着JavaScript执行的成熟,越来越合理 禁用 Babel 变形器,特别是在开发中 当你知道自己是 瞄准现代运行时间。 你可能会希望你能简化和加速 最终使Babel完全瘫痪,但这是不可能的 如果你使用的是JSX,TypeScript或Flow等非标准语言扩展. 可惜巴贝尔的变形 并没有加速速度 你可能会期待。 为了理解,让我们来看看巴贝尔是如何工作的:

1.  将输入源代码切入到符号流中.
2.  把信使流分析成AST.
3.  步行 AST 计算每个变量的范围信息.
4.  将所有变换插件应用在一个单曲面上,从而产生一个新的AST.
5.  打印生成的 AST .

拆卸插件时只有第4步会更快, 所以总有固定的成本 以运行 Babel, 不管启用了多少个变换 .

Sucrase绕过大多数这些步骤,像这样工作:

1.  使用三分叉将输入源代码切入到符号流中 贝贝尔解析器。 这个叉子不会产生完整的 AST,但仍 生成为后期专门设计的有意义的符号元数据 变相.
2.  扫描符号,像计算所有初步信息一样 进出口名称.
3.  通过通过符号和数字来运行转换 仔细寻找和替换行动,如替换 `<Foo` 与 `React.createElement(Foo`。 。 。 .

因为Sucrase在较低级别工作,使用自定义解析器 这比巴贝快得多.

## 捐款

无论是错误报告、公关、文件、测试,还是 还有什么! 请仔细看看 [贡献指南](https://npmcn.com/package/sucrase/CONTRIBUTING.md) 学习如何开始.

## 许可证和归属

Sucrase拥有麻省理工学院的执照. Sucrase的一大部分是基于一个叉子 [Babel 解析器](https://github.com/babel/babel/tree/main/packages/babel-parser), (中文(简体) ), 还有麻省理工学院的执照.

## 为什么叫这个名字?

Sucrase是一种能加工出糖的酶. 明白吗?

## 常见问题

### sucrase 是什么？

超快替代 Babel 当你可以瞄准现代JS运行时

### 如何安装 sucrase？

在项目目录运行 npm install sucrase，或使用 pnpm add / yarn add / bun add。它还提供命令行工具 sucrase、sucrase-node，可以用 npx sucrase 直接运行。

### sucrase 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### sucrase 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### sucrase 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=16 \|\| 14 \>=14\.17。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### sucrase 可以商用吗？

sucrase 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### sucrase 的下载量有多少？

根据 npm 官方下载统计，sucrase 在 2026/10/05 – 2026/11/03 这 30 天内被下载 184,085,697 次，日均约 6,136,190 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### sucrase 还在维护吗？

最新版本 3\.35\.1 发布于 2025/11/20（11 个月前）；至今共发布 83 个版本，其中过去 12 个月发布了 1 个；首次发布于 2017/10/04。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

