---
url: /docs/guide/usage/minifier/codegen.md
---
# 代码生成

`codegen` 选项控制 Oxc 压缩器如何输出代码。

## 空白压缩

Oxc 压缩器默认移除空白。将 `codegen.removeWhitespace` 设置为 `false` 可保留格式化后的输出。

注释默认会被移除。使用 `codegen.legalComments` 可控制是否保留合法注释、将其移动到文件末尾或提取出来。

## ASCII 转义

将 `codegen.asciiOnly` 设置为 `true`，可转义字符串字面量、未标记模板字面量、正则表达式字面量和标识符名称中的非 ASCII 字符。该选项默认为 `false`，无论是否压缩空白均可使用。

### Node.js

```js
import { minifySync } from "oxc-minify";

const result = minifySync("input.js", "export let π = '☕';", {
  codegen: {
    asciiOnly: true,
    removeWhitespace: false,
  },
});

console.log(result.code);
```

输出：

```text
export let \u03C0 = "\u2615";
```

异步的 `minify` 函数接受相同的选项。

### Rust

生成代码时，在 `oxc_codegen::CodegenOptions` 上设置 `ascii_only`：

```rust
use oxc_codegen::{Codegen, CodegenOptions};

let output = Codegen::new()
    .with_options(CodegenOptions {
        ascii_only: true,
        ..CodegenOptions::default()
    })
    .build(&program);
```

### 转义与限制

不超过 U+FFFF 的字符使用 `\uXXXX` 转义。更高的码点使用 `\u{...}` 转义，这需要 ES2015 或更高版本。此选项不会生成兼容 ES5 的输出。

对于更高的码点，正则表达式会改用转义的 UTF-16 代理对。转义正则表达式会改变其可观察的 `RegExp.prototype.source` 值。

部分输出仍可能包含非 ASCII 字符：

* 标记模板字面量文本会被保留，因为 `String.raw` 等标签函数可以观察其原始内容。
* JSX 名称、JSX 文本和 JSX 属性字符串会被保留。
* Hashbang 以及保留的注释（包括合法注释）会被保留。

标记模板和 JSX 内的 JavaScript 表达式会按正常方式转义。
