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
英文地址,請注明出處:http://en.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;避免了一開始就使用重量級鎖&…