当前位置: 首页 > news >正文

基于vue3+ByteMD快速搭建自己的Markdown文档编辑器

简介

ByteMD 是一个轻量级、功能丰富的 Markdown 编辑器组件,由稀土掘金(juejin.cn)团队开发并开源。它采用 Svelte 构建,支持双向编辑(所见即所得),并提供了丰富的插件系统。

核心特点

轻量级

  • 不依赖任何前端框架(如 React、Vue),可直接集成到任何项目中。
  • 压缩后体积约 30KB(含核心功能)。

双向编辑模式

  • 支持分屏预览、实时预览和切换为纯编辑器 / 预览模式。

 插件系统

  • 内置常用插件(如代码高亮、表格、数学公式等)。
  • 支持自定义插件扩展功能。

 安全处理

  • 内置 XSS 过滤,防止恶意代码注入。
  • 支持自定义 HTML 渲染规则。

 响应式设计

  • 适配移动端和桌面端,布局自动调整。

基本用法

安装依赖

安装环境依赖

pnpm install bytemd

安装vue3版本组件

pnpm install @bytemd/vue-next

安装主题

pnpm install juejin-markdown-themes //安装掘金主题 不安装无法正常显示markdown文本

或安装使用第三方主题: https://github.com/xitu/juejin-markdown-themes

安装插件

//可选安装插件
pnpm install @bytemd/plugin-medium-zoom  //图片缩放
pnpm install @bytemd/plugin-gfm          //让mrakdown 可以展示表格
pnpm install @bytemd/plugin-gemoji       //支持Gemoji短代码
pnpm install @bytemd/plugin-highlight    //支持代码块高亮pnpm install @bytemd/plugin-math          //支持数学公式
pnpm install @bytemd/plugin-breaks
pnpm install @bytemd/plugin-frontmatter   //解析前置元数据
pnpm install @bytemd/plugin-highlight-ssr //支持代码块高亮ssr版本
pnpm install @bytemd/plugin-math-ssr      //支持数学公式ssr版本
pnpm install @bytemd/plugin-mermaid       //支持 Mermaid 图表

自定义组件

创建一个 ByteMD.vue组件,封装 ByteMD 的功能:

<script setup lang="ts">
import {Editor} from '@bytemd/vue-next'
//第三方主题:https://github.com/xitu/juejin-markdown-themes
import 'juejin-markdown-themes/dist/juejin.min.css'
import 'bytemd/dist/index.css'import gfm from '@bytemd/plugin-gfm'
import highlight from '@bytemd/plugin-highlight'
import zhHans from 'bytemd/locales/zh_Hans.json'
import gemoji from '@bytemd/plugin-gemoji'
import mediumZoom from '@bytemd/plugin-medium-zoom'
import math from '@bytemd/plugin-math'
import breaks from '@bytemd/plugin-breaks'
import frontmatter from '@bytemd/plugin-frontmatter'
import highlightSsr from '@bytemd/plugin-highlight-ssr'
import mathSsr from '@bytemd/plugin-math-ssr'
import mermaid from '@bytemd/plugin-mermaid'import {defineProps, withDefaults} from 'vue'// 定义Props接口
interface Props {height?: number | string;handleChange: (value: string) => void;mode?: string;
}// 定义默认值
const props = withDefaults(defineProps<Props>(), {height: 400,mode: () => 'split', //编辑器显示模式,默认值:autohandleChange: (v: string) => {console.log(v)}
})// 添加插件
const plugins = [gfm(),highlight(),gemoji(),mediumZoom(),math(),breaks(),frontmatter(),highlightSsr(),mathSsr(),mermaid(),
]const emit = defineEmits<{mounted: [];
}>();const content = defineModel<string>('modelValue', {default: '',
});//上传图片
import {ossUpload} from "#/api/system/oss";const handleUploadImages = async (files: any) => {let imgs: any = []for (let index = 0; index < files.length; index++) {const file = files[index]let res = await ossUpload(file)  //上传到OSSconsole.log(res)imgs.push({title: res.fileName,url: res.url})}return imgs
}</script><template><div class="app-bytemd"><Editor:value="content":plugins="plugins"@change="handleChange":locale="zhHans":upload-images="handleUploadImages"/></div>
</template><style lang="scss">
.app-bytemd {//覆盖 ByteMD Editor 的默认高度。.bytemd {height: 800px !important;}
}</style>

引用组件

<script setup lang="ts">import {ByteMD} from '#/components/bytemd';import { ref } from 'vue'//给组件传入值 就是文章的内容
const content= ref<string>()const handleChange= (value: string) => {content.value = value
}</script><template><view><ByteMD:value="content":handle-change="handleChange"/></view>
</template>

演示效果

参考

https://github.com/pd4d10/bytemd

https://github.com/xitu/juejin-markdown-themes

Markdown themes gallery

http://www.lryc.cn/news/575397.html

相关文章:

  • Midscene.js:使用 LLMs.txt 快速生成 AI 自动化测试用例「喂饭教程」
  • [Andrej Karpathy] 大型语言模型作为新型操作系统
  • 华为OD 机试 2025-黑板上色
  • 【25软考网工】第十章 网络规划与设计(2)网络规划与分析、网络结构与功能
  • 如何进行 iOS App 混淆加固?IPA 加壳与资源保护实战流程
  • 如何将视频从 iPhone 发送到 Android 设备
  • 数字孪生技术驱动UI前端变革:从静态展示到动态交互的飞跃
  • uniapp 和原生插件交互
  • 小程序入门:理解小程序页面配置
  • vue + vue-router写登陆验证的同步方法和异步方法,及页面组件的分离和后端代码
  • 命名数据网络 | 数据包(Data Packet)
  • chili3d笔记23 正交投影3d重建笔记4 点到线2
  • 【NLP】使用 LangGraph 构建 RAG 的Research Multi-Agent
  • house of apple2
  • Linux系统(信号篇):信号的产生
  • 【Pandas】pandas DataFrame shift
  • Ubuntu下布署mediasoup-demo
  • 黑马JVM解析笔记(四):Javap图解指令流程,深入理解Java字节码执行机制
  • Redis 为什么选用跳跃表,而不是红黑树
  • 《聊一聊ZXDoc》之汽车标定、台架标定、三高标定
  • 【STM32】外部中断
  • 【C++11】右值引用和移动语义
  • gRPC 使用(python 版本)
  • 2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷(五)
  • Axure版TDesign 组件库-免费版
  • MQTT 和 HTTP 有什么本质区别?
  • 如何将 Memfault 固件 SDK 集成到使用 Nordic 的 nRF Connect SDK(NCS)的项目中
  • 数据结构进阶 - 第四,五章 串、数组和广义表
  • Docker 入门教程(一):从概念到第一个容器
  • 水质指数预测模型R²偏低的原因分析与优化策略