Bytemd@Bytemd/react详解(编辑器实现基础AST、插件、跨框架)

ByteMD Markdown编辑器详细解释&修改编辑器默认样式(高度300px)

AST树详解
在这里插入图片描述
[ByteMD 插件系统详解(https://blog.csdn.net/m0_55049655/article/details/148811248?spm=1001.2014.3001.5501)
在这里插入图片描述
Sevelet编写的Bytemd如何适配到React中
在这里插入图片描述


⚡️1️⃣ 背景概述

ByteMD 是一套构建 Markdown 编辑器的体系:

  • ⚡️ ByteMarkdown:底层 Markdown 解析器和插件框架。
  • ⚡️ ByteMD React:对 ByteMarkdown 的 React 封装层,提供更易用的组件。

简单说:

  • ByteMarkdown = Markdown 的“大脑”。
  • ByteMD React = Markdown 大脑 + 可交互的 “UI 外壳”。

⚡️2️⃣ 底层构成

🔥 2.1 ByteMarkdown

ByteMarkdown 承载 Markdown 解析及插件体系,基于 unified 架构。

关键概念

  • unified:一套构建 Markdown 转换器和插件的生态。
  • remark / rehype:Markdown 到 HTML 的标准处理器。
  • ByteMarkdown 插件:针对 Markdown AST (MDAST) 或 HTML AST (HAST) 做扩展。

底层结构

ByteMarkdown
├─ Parser      ← 用 remark-parse 将 Markdown 转换为 MDAST
├─ Plugins     ← 扩展 Markdown 节点处理 (MDAST -> HAST)
├─ Compiler    ← 将 HAST 转换为最终 HTML 或 React 节点

⚡️3️⃣ ByteMD React 构成

ByteMD React 在 ByteMarkdown 架构之上构建:

  • 用 React 将 Markdown 渲染为组件。
  • 增加 Markdown 编辑器、同步预览、UI 扩展等能力。
  • 完成 Markdown 到 React 节点之间的“桥接”。

底层结构

ByteMD React
├─ Editor        <-- Markdown 编辑器 (CodeMirror/Monaco/其他文本编辑器)
├─ Parser (ByteMarkdown) <-- Markdown -> AST
├─ Renderer       <-- AST -> React Element
├─ Plugins        <-- 可插拔 Markdown 插件 (如代码高亮、GFM 支持、TOC 生成等)

⚡️4️⃣ 架构对比

模块职责
ByteMarkdownMarkdown AST 管理、插件、通用 Markdown 功能
ByteMD React在 React 框架中封装 ByteMarkdown,提供可交互组件和状态管理

⚡️5️⃣ 完整工作流程示意

👤 Markdown 原文
ByteMD Editor (React)
ByteMarkdown Parser
(remark)
MDAST 抽象语法树
ByteMarkdown Plugins
(GFM, Emoji, Math...)
HAST 抽象语法树
ByteMD Renderer
(React 元素)
最终 React Markdown 组件展示

⚡️6️⃣ 底层设计思想总结

ByteMarkdown:

  • 聚焦 Markdown 抽象和插件。
  • 完全解耦渲染层。
  • 可复用到 React、Vue、Svelte 等多个框架。

ByteMD React:

  • 完成 Markdown 到 React 节点之间的最后一公里。
  • 增加交互能力 (编辑器、状态管理)。
  • 在实际应用层屏蔽 Markdown AST 的复杂性。

⚡️7️⃣ 对面试官介绍参考说法

我完全了解 ByteMD 的结构设计:ByteMarkdown 侧重 Markdown 的解析和插件能力,构建 MDAST/HAST 流程;ByteMD React 则是针对 React 应用场景,将 Markdown AST 完美转为 React 节点,并提供丰富的插件和 UI 扩展能力。
简而言之,ByteMarkdown 是“大脑”,ByteMD React 是“身体和皮肤”。这种设计使 Markdown 编辑器体系易于拓展和跨平台应用。


很好!以下是 ByteMarkdownByteMD React 各自的代码示例和对比,让你彻底明白它们之间是如何协作的。


⚡️1️⃣ ByteMarkdown 示例代码

ByteMarkdown 本身是构建 Markdown 到 AST → HAST 的引擎,通常你在插件开发时直面它。

// ✅ 用 ByteMarkdown 构建 Markdown 解析器
import { createProcessor } from 'bytemd';
import gfm from '@bytemd/plugin-gfm';
import highlight from '@bytemd/plugin-highlight';const processor = createProcessor({plugins: [gfm(), highlight()],
});// 输入 Markdown 源文本
const markdown = `# 标题\n\n\`\`\`js\nconst a = 1;\n\`\`\``;const result = await processor.process(markdown);// ✅ result 即是构建好的 HAST 节点
console.log(result);

⚡️ 在这个层面,你操作 Markdown AST/HAST,更偏向构建器和插件开发。


⚡️2️⃣ ByteMD React 示例代码

ByteMD React 在应用层调用,构建可交互 Markdown 编辑器和渲染器。

// ✅ 在 React 项目中使用
import React, { useState } from 'react';
import { Editor, Viewer } from '@bytemd/react';
import gfm from '@bytemd/plugin-gfm';
import highlight from '@bytemd/plugin-highlight';
import 'bytemd/dist/index.css';
import 'highlight.js/styles/github.css';const plugins = [gfm(), highlight()];export default function App() {const [value, setValue] = useState('# Hello **ByteMD**!');return (<div className="app"><Editorvalue={value}plugins={plugins}onChange={(v) => setValue(v)}/><div className="preview"><Viewer value={value} plugins={plugins} /></div></div>);
}

⚡️ 在这个层面,你只需要管理 Markdown 源文本和插件,ByteMD 完成 Markdown → React 节点的构建。


⚡️3️⃣ 简单对比总结

对比项ByteMarkdownByteMD React
定位Markdown 解析器、插件管理器完整 Markdown 编辑器 + 渲染器
用途用于构建 Markdown 到 AST/HAST 的能力用于构建实际 Markdown UI (Editor/Viewer)
可扩展性构建器、插件层面修改 Markdown 节点在 React 层快速调用,插件简单配置
用例场景Markdown 构建、脚手架、插件开发Markdown 编辑器、文档场景

⚡️4️⃣ 完整结构示意

Markdown 输入源文本
ByteMarkdown:
Markdown->MDAST->HAST
插件应用阶段
ByteMD React:
Editor + Viewer
用 React 渲染 HAST
最终 React 渲染页面

⚡️5️⃣ 向面试官介绍参考说法

ByteMarkdown 是 Markdown 架构中的核心构建器,专注 Markdown 到 AST/HAST 的构建和插件管理。
ByteMD React 则是对 ByteMarkdown 的封装,专注为前端提供易集成、可配置、可编辑的 Markdown 组件。
我们通常:

  • 在构建 Markdown 转换器、插件库时使用 ByteMarkdown
  • 在实际前端应用中使用 ByteMD React,快速构建 Markdown 编辑器和预览器。

很好!我为你整理一套 ByteMD 完整插件示例代码,展示如何:

✅ 创建一个 Markdown 扩展插件
✅ 在 ByteMarkdown 中注册
✅ 在 ByteMD React 中调用

这个示例实现一个简单效果:

检测 Markdown 中的 !!警告!! 关键字,并转为高亮提示块


⚡️ 完整示例代码

📄1️⃣ 创建 Markdown 扩展插件 (bytemd/plugin-alert.ts)

import { Plugin } from 'bytemd';
import { visit } from 'unist-util-visit';export function alertPlugin(): Plugin {return {remark: (processor) =>processor.use(() => (tree) => {visit(tree, 'text', (node) => {if (node.value.includes('!!警告!!')) {node.value = node.value.replace('!!警告!!','⚠️ [警告提示]');}});}),};
}

⚡️2️⃣ 在 ByteMarkdown 层注册

如果是纯 Markdown 构建器场景:

import { createProcessor } from 'bytemd';
import { alertPlugin } from './bytemd/plugin-alert';const processor = createProcessor({plugins: [alertPlugin()],
});const result = await processor.process('# 标题\n!!警告!!');
console.log(result);

✅ 渲染后:

# 标题
⚠️ [警告提示]

⚡️3️⃣ 在 ByteMD React 中注册

如果是 React 项目场景:

import React, { useState } from 'react';
import { Editor, Viewer } from '@bytemd/react';
import gfm from '@bytemd/plugin-gfm';
import highlight from '@bytemd/plugin-highlight';
import { alertPlugin } from './bytemd/plugin-alert';const plugins = [gfm(), highlight(), alertPlugin()];export function App() {const [value, setValue] = useState('# 测试\n!!警告!!');return (<div className="app"><Editor value={value} plugins={plugins} onChange={setValue} /><Viewer value={value} plugins={plugins} /></div>);
}

⚡️4️⃣ 示例效果概览

Markdown 源文:

# 测试
!!警告!!

👉 渲染后:

# 测试
⚠️ [警告提示]

⚡️5️⃣ 完整结构示意 (Mermaid)

!!警告!! Markdown 源文
alertPlugin()
检测 '!!警告!!' 节点修改文本
ByteMarkdown
调用 alertPlugin 修改 AST 节点
ByteMD React
接收修改后 AST 渲染为 React 节点

⚡️6️⃣ 向面试官介绍参考说法

我实现了一套 Markdown 扩展插件,检测 Markdown 中的 !!警告!! 并转为提示文本。
在构建层,我用 ByteMarkdown 创建 remark 插件,修改 AST 节点。
在应用层,我将插件注册到 ByteMD React 中,享受 Markdown 可插拔、可配置、可定制的好处。

✅ 可大规模构建 Markdown 扩展生态。
✅ 可快速集成到现有编辑器。
✅ 完美展示对 Markdown 管线和插件体系的掌握。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86002.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Redis》事务

文章目录 Redis中的原子性Redis的事物和MySQL事务的区别Redis实现事务什么场景下&#xff0c;会使用事务? Redis事务相关命令watch命令的实现原理 总结 Redis中的原子性 Redis的原子性不同于MySQL的原子性。 Redis的事物和MySQL事务的区别 但是注意体会Redis的事务和MySQL…

Elasticsearch Kibana (一)

一、官方文档 elasticsearch官网&#xff1a;elasticsearch官网 elasticsearch源码&#xff1a;elasticsearch源码 ik分词器&#xff1a; ik分词器 ik分词器下载&#xff1a;ik分词器下载 elasticsearch 版本选择&#xff1a;elasticsearch 版本选择 官方推荐Elasticsearch和j…

[linux] Ubuntu 24软件下载和安装汇总(自用)

经常重装系统&#xff0c;备份下&#xff0c;有用的也可以参考。 安装图形界面 apt install ubuntu-desktop systemctl set-default graphical.target reboot 安装chrome wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt insta…

分布变化的模仿学习算法

与传统监督学习不同,直接模仿学习在不同时刻所面临的数据分布可能不同.试设计一个考虑不同时刻数据分布变化的模仿学习算法 import numpy as np import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset from…

arm-none-eabi-ld: cannot find -lm

arm-none-eabi-ld -Tuser/hc32l13x.lds -o grbl_hc32l13x.elf user/interrupts_hc32l13x.o user/system_hc32l13x.o user/main.o user/startup_hc32l13x.o -lm -Mapgrbl_hc32l13x.map arm-none-eabi-ld: cannot find -lm makefile:33: recipe for target link failed 改为在gcc…

【Python办公】Excel文件批量样式修改器

目录 专栏导读1. 背景介绍2. 项目概述3. 库的安装4. 核心架构设计① 类结构设计② 数据模型1) 文件管理2) 样式配置5. 界面设计与实现① 布局结构② 动态组件生成6. 核心功能实现① 文件选择与管理② 颜色选择功能③ Excel文件处理核心逻辑完整代码结尾专栏导读 🌸 欢迎来到P…

QT的一些介绍

//虽然下面一行代码进行widget和ui的窗口关联&#xff0c;但是如果发生窗口大小变化的时候&#xff0c;里面的布局不会随之变化ui->setupUi(this);//通过下面这行代码进行显示说明&#xff0c;让窗口变化时&#xff0c;布局及其子控件随之变化this->setLayout(ui->ver…

RISC-V向量扩展与GPU协处理:开源加速器设计新范式——对比NVDLA与香山架构的指令集融合方案

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠 当开源指令集遇上异构计算&#xff0c;RISC-V向量扩展&#xff08;RVV&#xff09;正重塑加速…

自动恢复网络路由配置的安全脚本说明

背景 两个文章 看了就明白 Ubuntu 多网卡路由配置笔记&#xff08;内网 外网同时通 可能有问题&#xff0c;以防万一可以按照个来恢复 sudo ip route replace 192.168.1.0/24 dev eno8403 proto kernel scope link src <你的IP>或者恢复脚本! 如下 误操作路由时&…

创建 Vue 3.0 项目的两种方法对比:npm init vue@latest vs npm init vite@latest

创建 Vue 3.0 项目的两种方法对比&#xff1a;npm init vuelatest vs npm init vitelatest Vue 3.0 作为当前主流的前端框架&#xff0c;官方提供了多种项目创建方式。本文将详细介绍两种最常用的创建方法&#xff1a;Vue CLI 方式 (npm init vuelatest) 和 Vite 方式 (npm in…

Java求职者面试指南:Spring, Spring Boot, Spring MVC, MyBatis技术点深度解析

Java求职者面试指南&#xff1a;Spring, Spring Boot, Spring MVC, MyBatis技术点深度解析 面试官与程序员JY的三轮提问 第一轮&#xff1a;基础概念问题 1. 请解释一下Spring框架的核心容器是什么&#xff1f;它有哪些主要功能&#xff1f; JY回答&#xff1a;Spring框架的…

【修复MySQL 主从Last_Errno:1051报错的几种解决方案】

当MySQL主从集群遇到Last_Errno:1051报错后不要着急&#xff0c;主要有三种解决方案&#xff1a; 方案1: 使用GTID场景&#xff1a; mysql> STOP SLAVE;(2)设置事务号&#xff0c;事务号从Retrieved_Gtid_Set获取 在session里设置gtid_next&#xff0c;即跳过这个GTID …

定位接口偶发超时的实战分析:iOS抓包流程的完整复现

我们通常把“请求超时”归结为网络不稳定、服务器慢响应&#xff0c;但在一次产品灰度发布中&#xff0c;我们遇到的一个“偶发接口超时”问题完全打破了这些常规判断。 这类Bug最大的问题不在于表现&#xff0c;而在于极难重现、不可预测、无法复盘。它不像逻辑Bug那样能从代…

【网工】华为配置专题进阶篇②

目录 ■DHCP NAT BFD 策略路由 ▲掩码与反掩码总结 ▲综合实验 ■DHCP NAT BFD 策略路由 ▲掩码与反掩码总结 使用掩码的场景&#xff1a;IP地址强相关 场景一&#xff1a;IP地址配置 ip address 192.168.1.1 255.255.255.0 或ip address 192.168.1.1 24 场景二&#x…

基于STM32电子密码锁

基于STM32电子密码锁 &#xff08;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.正确输入密码前提下&#xff0c;开锁并有正确提示&#xff1b; 2.错误输入密码情况下&#xff0c;蜂鸣器报警并短暂锁定键盘&…

前端基础知识CSS系列 - 14(CSS提高性能的方法)

一、前言 每一个网页都离不开css&#xff0c;但是很多人又认为&#xff0c;css主要是用来完成页面布局的&#xff0c;像一些细节或者优化&#xff0c;就不需要怎么考虑&#xff0c;实际上这种想法是不正确的 作为页面渲染和内容展现的重要环节&#xff0c;css影响着用户对整个…

判断 NI Package Manager (NIPM) 版本与 LabVIEW 2019 兼容性

​判断依据 1. 查阅 LabVIEW 2019 自述文件 LabVIEW 2019 自述文件中包含系统要求&#xff0c;可通过 NI 官网访问。文件提到使用 NIPM 安装&#xff0c;但未明确最低版本要求&#xff0c;需结合其他信息判断。 2. 参考 NI 官方兼容性文档 NI 官方文档指出 LabVIEW 运行引擎与…

Django 安装指南

Django 安装指南 引言 Django 是一个高级的 Python Web 框架,用于快速开发安全且实用的网站。本文将详细介绍如何在您的计算机上安装 Django,以便您能够开始使用这个强大的工具。 安装前的准备 在开始安装 Django 之前,请确保您的计算机满足以下条件: 操作系统:Django…

Spring MVC参数绑定终极手册:单多参对象集合JSON文件上传精讲

我们通过浏览器访问不同的路径&#xff0c;就是在发送不同的请求&#xff0c;在发送请求时&#xff0c;可能会带一些参数&#xff0c;本文将介绍了Spring MVC中处理不同请求参数的多种方式 一、传递单个参数 接收单个参数&#xff0c;在Spring MVC中直接用方法中的参数就可以…

synchronized 做了哪些优化?

Java 中的 synchronized 关键字是保证线程安全的基本机制&#xff0c;随着 JVM 的发展&#xff0c;它经历了多次优化以提高性能。 1. 锁升级机制&#xff08;锁膨胀&#xff09; JDK 1.6 引入了偏向锁→轻量级锁→重量级锁的升级机制&#xff0c;避免了一开始就使用重量级锁&…