# @discord/markdown-react-native 中文文档

规范地址：https://npmcn.com/package/%40discord/markdown-react-native/

版本：0\.14\.0
npm 元数据更新时间：2026-11-04T16:54:16.633Z
中文译文更新时间：2026-11-12T11:09:37.703Z
软件包许可：MIT

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

原始 npm 页面：https://www.npmjs.com/package/%40discord/markdown-react-native
原文对照：https://npmcn.com/package/%40discord/markdown-react-native/?lang=original

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

- 包体积（解压后）：129 MB，33 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：1 个
- peer 依赖：react-native \>=0\.77
- 首次发布：2026-07-14T21:54:58.174Z
- 最新版本发布：2026-11-04T16:54:16.442Z
- 近 30 天下载量：197079（2026-10-13 至 2026-11-11，npm 官方下载统计）
- 已发布版本数：16（近 12 个月 16 个）

## 中文简介

解析 Discord Markdown 的回放原生( JSI) 绑定

## 安装

```sh
npm install @discord/markdown-react-native
```

也可以使用：`pnpm add @discord/markdown-react-native`、`yarn add @discord/markdown-react-native`、`bun add @discord/markdown-react-native`

## README

# 标记下- 反应- 内在

Discord Markdown parser 的回放原生绑定器(`@discord/markdown-react-native`, (中文(简体) ), 以纯 C++ TurboModule 执行。 Rust parser 被编译为本地图书馆 (单位:千美元)[`ffi/c`](https://npmcn.com/package/ffi/c))并链接到一个单一的 C++ 模块 (单位:千美元)[`cpp/NativeDiscordMarkdown.cpp`](https://npmcn.com/package/%40discord/markdown-react-native/cpp/NativeDiscordMarkdown.cpp)两个平台共享; 没有每个呼叫桥的流量 也没有特定平台的解码 同一个图书馆是 也可以从 [克特林和斯威夫特](https://npmcn.com/package/%40discord/markdown-react-native/#readme-native-usage-kotlin-and-swift)。 。 。 .

需要新架构(反应原住民0.77+).

## 使用量

```js
import { Syntax, parse } from "@discord/markdown-react-native";

const blocks = parse("# Hello **world**");
// [{ type: "heading", value: { level: 1, content: [...] } }]

// Optionally pick the syntax to parse, as an OR of `Syntax` bits (`Syntax.ALL` by default):
const restricted = parse("**bold** _italic_", Syntax.BOLD);
const noMentions = parse("@everyone **hi**", Syntax.ALL & ~Syntax.MENTIONS);

// Optionally cap how much work a parse may do:
const bounded = parse(untrustedContent, null, 50_000);
```

`parse` 在 JS 线程上同步运行并返回相同的 AST (单位:千美元)`Block[]` 从 [`@discord/markdown-types`](https://npmcn.com/package/%40discord/types))作为束束,所以渲染代码 可在网络和本地共享。 雪花ID和时间戳值为 `BigInt`s,还有 匹配原装订.

由于解析会阻碍JS线,第三个论点值得了解: 帕塞尔的燃料预算, 限制工作 一个对抗性的投入可以导致。 {\\fn微軟雅黑\\bord1\\shad0\\1cHC8C8C8\\b0} 默认长度为信件长度, 空余空间, 因此大多数呼叫者应该使用 。 内容 将预算抛出 `parser ran out of fuel` 而不产生部分AST——预算 设置太低 拒绝合法内容, 所以在收紧它之前先测量你自己 .

对于丰富的文本, `parseLossless(content, flags?, fuel?)` 返回无损失树:节点 降级意味着什么 象征着每个性格 `content` 顺序,下至 分隔器、逃生器、标记和线尾,因此加入 `text` 把它还给我. 每个节点和标志都有一个 `span` 在UTF-16代码单位中,所以 `content.slice(span.start, span.end)` 是其文本。 这些类型是: `LosslessNode` 还有朋友 `@discord/markdown-types`。 。 。 .

## 当地使用(科特林和斯威夫特)

安装软件包也会给应用程序本身的本地代码一个直接线条到 parser, 有 没有JS的运行时间。 每个平台都有一个小包装器 覆盖同样的涡轮摩多仪 使用 :

```kotlin
import com.discord.markdown.DiscordMarkdown

val ast: String = DiscordMarkdown.parse("# Hello **world**")
val restricted = DiscordMarkdown.parse("**bold** _italic_", flags = DiscordMarkdown.Syntax.BOLD)
```

```swift
import DiscordMarkdown

let ast: String = try DiscordMarkdownParser.parse("# Hello **world**")
let restricted = try DiscordMarkdownParser.parse("**bold** _italic_", syntax: .bold)
```

两者将AST作为JSON弦还原,其形状与JS相同,除了64位整数. 这些是完全精确的JSON数字 `{"$bigint": "…"}` 对象。 雪花没有签名,可能会超过 `Long.MAX_VALUE`这样 解码为 `UInt64` (斯维夫特的) `JSONDecoder`)或(或) `ULong` (kotlinx.serialization) (英语). 时间戳 签名:将其解码为 `Int64` 编号 : `Long`Android的内置 `org.json` 还不够,因为 它读取任何整数过去 `Long.MAX_VALUE` 作为 `Double`双方采用与联署材料相同的任择燃料预算 `parse`失败投出 `DiscordMarkdownException` (科特林语)或 `DiscordMarkdownError` (摇摆), 携带解析器的消息。 电话是同步的,没有状态,所以安全 任何线索.

`parseLossless` (科特林语)和 `DiscordMarkdownParser.parseLossless` (斯威克特)还原无损失 树与 JSON 相同。 它的跨度计有UTF-16代码单位,所以它们会索引一个克特林 `String` 或者说 `Spannable` 直接,在斯威夫特是一个 `NSRange` 输入内容为 `NSString`。 。 。 .

包装活在 [`android/src/main/java/com/discord/markdown/DiscordMarkdown.kt`](https://npmcn.com/package/%40discord/markdown-react-native/android/src/main/java/com/discord/markdown/DiscordMarkdown.kt) (超过JNI的入境点) [`ffi/jni`](https://npmcn.com/package/ffi/jni)和 [`ios/DiscordMarkdownParser.swift`](https://npmcn.com/package/%40discord/markdown-react-native/ios/DiscordMarkdownParser.swift) (通过CABI,通过 `DiscordMarkdownC` x框架中的模块映射。 他们把货装在原生货包里 它们只提供给链接它的目标:例如,iOS应用程序扩展不能使用 他们没有反应原生舱.

## 如何运作

-   [`src/NativeDiscordMarkdown.ts`](https://npmcn.com/package/%40discord/markdown-react-native/src/NativeDiscordMarkdown.ts) 是涡轮模具谱; 代码( 通过 `codegenConfig` 内 [`package.json`](https://npmcn.com/package/%40discord/markdown-react-native/package.json)生成 键入 C++ 碱类 `NativeDiscordMarkdownCxxSpec`。 。 。 .
-   [`cpp/NativeDiscordMarkdown.cpp`](https://npmcn.com/package/%40discord/markdown-react-native/cpp/NativeDiscordMarkdown.cpp) 通过 调用 Rust parser 的 C ABI (`dmd_parse` 财务报告和审定财务报表 `dmd_parse_lossless`) (中文(简体) ). `parseToAstString` 财务报告和审定财务报表 `parseLosslessToAstString` 是同步 JSI 方法——没有桥,没有ASync hop.
-   注册是申报性的,不需要更改应用程序:
    -   **机器人**数字 : [`react-native.config.cjs`](https://npmcn.com/package/%40discord/markdown-react-native/react-native.config.cjs) 点自动链接于 [`android/CMakeLists.txt`](https://npmcn.com/package/%40discord/markdown-react-native/android/CMakeLists.txt); 生成 `autolinking.cpp` 即时化模块, C++ 在应用程序的本地构建中编译, 链接 反对Rust 解析器 `libdiscord_markdown_jni.so` (单位:千美元)[`ffi/jni`](https://npmcn.com/package/ffi/jni),哪个 与JNI入境点一起再出口CABI。 Android Gradle 插件包 分享到APK的库, 在那里,克特林包装器加载相同的副本。 这个 Gradle项目在这里运行了代码并建造了克特林包装机(并运行货物,在-repo).
    -   **iOS系统**数字 : `codegenConfig.ios.modulesProvider` 将模块映射到 [`ios/DiscordMarkdownModuleProvider.mm`](https://npmcn.com/package/%40discord/markdown-react-native/ios/DiscordMarkdownModuleProvider.mm)。 。 。 .
-   JS包装器解码退回的JSON. 涡轮摩托通过CABI `js_bigints` 因此64位整数跨越边界为 `{"$bigint": "…"}` 包装 (参见 [`ffi/c/src/bigint.rs`](https://npmcn.com/package/ffi/c/src/bigint.rs)恢复为 `BigInt`s,因为 简单 `JSON.parse` 将使他们变成漂浮的64人。 克特林和斯威夫特的包装纸离开 旗下关闭并获得普通数字.

## 大楼

当地人自己建造了驱动货物 Rust 剖析器预建( R)`android/prebuilt/`, (中文(简体) ), `ios/DiscordMarkdownC.xcframework`),建造于 发布时间.

Android (Gradle 运行 [货物吨克](https://github.com/bbqsrc/cargo-ndk) 打开 `ffi/jni`,用于 `armeabi-v7a`, (中文(简体) ), `arm64-v8a`, (中文(简体) ), `x86`,以及 `x86_64`,或者在 `reactNativeArchitectures`:

```bash
rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android
cargo install cargo-ndk
```

iOS(示例应用程序的 Podfile 运行) [`ios/build-rust.sh`](https://npmcn.com/package/%40discord/markdown-react-native/ios/build-rust.sh),该词也 组装出价的 xcframe; 更改解析器后重运行 :

```bash
rustup target add aarch64-apple-ios aarch64-apple-ios-sim x86_64-apple-ios
```

JS测试(包装和解码层;解剖器及其C ABI,包括燃料) 参数,在 `cargo test -p discord-markdown-c`:

```bash
pnpm test
```

## 示例应用程序

[`example/`](https://npmcn.com/package/%40discord/markdown-react-native/example) 是一个反应原生操场应用程序(工作空间软件包,例如 [`site`](https://npmcn.com/package/site) 用于网络:一个现场标记 ~ AST 视图在本地解析器上, 用于手动 核查和发展。 从回波根:

```bash
pnpm install
cd lib/react-native/example
pnpm android                       # or open example/android in Android Studio
cd ios && bundle exec pod install  # then: pnpm ios, or open MarkdownExample.xcworkspace
```

## 端到端测试

这个 [`e2e_react_native` CI 任务](https://npmcn.com/package/.github/workflows/ci.yaml) 构建示例应用程序 在两个平台上发布——行使代码,自动链接,以及收发后Rust构建—— 然后在Android模拟器和iOS模拟器上驱动 [大师](https://maestro.dev/) (单位:千美元)[`example/.maestro/parse.yaml`](https://npmcn.com/package/%40discord/markdown-react-native/example/.maestro/parse.yaml), (中文(简体) ), 在 AST 上断言该应用程序使: 默认内容解析为标题 全精度 BigInt 提及 id,并打出内容再分录为活. 应用程序 `MainActivity.kt` 财务报告和审定财务报表 `AppDelegate.swift` 也通过 Kotlin 或 Swift 进行圆通内容 发射时包裹,流程检查结果 应用报告。 然后,他们收拾npm 柏油丸 并申明 预先建造的 Rust 文物船在里面。 同一流量在本地运行 `maestro test -e APP_ID=… .maestro/parse.yaml` 对抗任何运行中的模拟器或模拟器.

## 已知的限制

-   **只有新建筑.** 关于旧建筑 `TurboModuleRegistry.getEnforcing` 导入时丢出.
-   **工作室运行时间** (恢复等)是独立的JSI运行时间; `parse` 仅可调用 从主要JS运行时间.

## 常见问题

### @discord/markdown-react-native 是什么？

解析 Discord Markdown 的回放原生\( JSI\) 绑定

### 如何安装 @discord/markdown-react-native？

在项目目录运行 npm install @discord/markdown-react-native，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：react-native（\>=0\.77）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @discord/markdown-react-native 支持 TypeScript 吗？

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

### @discord/markdown-react-native 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @discord/markdown-react-native 可以商用吗？

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

### @discord/markdown-react-native 的下载量有多少？

根据 npm 官方下载统计，@discord/markdown-react-native 在 2026/10/13 – 2026/11/11 这 30 天内被下载 197,079 次，日均约 6,569 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @discord/markdown-react-native 还在维护吗？

最新版本 0\.14\.0 发布于 2026/11/05（7 天前）；至今共发布 16 个版本，其中过去 12 个月发布了 16 个；首次发布于 2026/07/15。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

