本文系统介绍 Vue 生态的 Markdown 编辑器 md-editor-v3,涵盖核心特性、安装与基础配置、常用功能演示、与 Vue/React 的集成方案,以及实际项目中的最佳实践与性能优化建议。文末附官方文档链接。示例均可运行,便于快速上手。
使用 npm:
npm i md-editor-v3
使用 yarn:
yarn add md-editor-v3
使用 pnpm:
pnpm add md-editor-v3
md-editor-v3 需要全局样式支持,请在入口处引入一次:
// main.ts
import { createApp } from 'vue'
import App from './App.vue'
// 必须:样式
import 'md-editor-v3/lib/style.css'
createApp(App).mount('#app')
<!-- App.vue -->
<template>
<div class="container">
<MdEditor
v-model="text"
theme="light"
previewTheme="github"
codeTheme="github"
@onSave="handleSave"
:onUploadImg="onUploadImg"
/>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import MdEditor from 'md-editor-v3'
const text = ref('# Hello md-editor-v3 👋\n\n- 支持实时预览\n- 支持图片上传\n- 支持快捷键(如 Ctrl+S 保存)')
function handleSave(v: string, html: string) {
console.log('保存内容:', v)
console.log('渲染 HTML:', html)
localStorage.setItem('post.md', v)
}
const onUploadImg = async (files: File[], callback: (urls: string[]) => void) => {
// 示例:本地预览;生产中应将 files 上传到服务器后返回可访问的 URL 列表
const urls = files.map((f) => URL.createObjectURL(f))
callback(urls)
}
onMounted(() => {
const cached = localStorage.getItem('post.md')
if (cached) text.value = cached
})
</script>
<style scoped>
.container {
height: 100vh;
display: flex;
flex-direction: column;
}
</style>
运行(以 Vite 为例):
npm run dev
# 或 yarn dev / pnpm dev
<MdEditor v-model="text" previewTheme="vuepress" codeTheme="atom" />
<MdEditor v-model="text" @onSave="(v) => saveToServer(v)" />
async function saveToServer(content: string) {
// POST 到服务端
await fetch('/api/save', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ content }),
})
}
const onUploadImg = async (files: File[], callback: (urls: string[]) => void) => {
// 这里演示本地预览;生产中请将文件上传后返回可外链访问的 URL
const urls = await Promise.all(
files.map(async (file) => {
// 例如:上传到 OSS 后返回 url
// const url = await uploadToOSS(file)
// return url
return URL.createObjectURL(file)
}),
)
callback(urls)
}
<script setup lang="ts">
import { ref } from 'vue'
import MdEditor from 'md-editor-v3'
const text = ref('# 自定义工具栏与主题')
const toolbars = [
'bold',
'italic',
'strikeThrough',
'title',
'underline',
'quote',
'list',
'code',
'image',
'link',
'preview',
'save',
] as const
</script>
<template>
<MdEditor
v-model="text"
theme="dark"
previewTheme="github"
codeTheme="monokai"
:toolbars="toolbars"
:toolbarsExclude="['github']"
/>
</template>
补充:也可通过 CSS 变量进行细粒度外观定制(示意)
:root {
/* 示例变量名,仅作演示 */
--md-color-primary: #2f54eb;
--md-border-color: #e5e7eb;
}
<script setup lang="ts">
import { ref } from 'vue'
import { MdPreview } from 'md-editor-v3'
import 'md-editor-v3/lib/style.css'
const content = ref(`# 仅预览模式
- 适合文章详情页
- 支持目录、表格、代码高亮等
`)
</script>
<template>
<MdPreview :modelValue="content" previewTheme="github" codeTheme="github" />
</template>
参见 2.4 最小示例。Vite 环境下通常零配置即可使用,注意入口引入样式。
编辑器依赖浏览器环境,SSR 需在客户端渲染。推荐使用 ClientOnly:
// plugins/md-editor.client.ts
import 'md-editor-v3/lib/style.css'
<!-- pages/editor.vue -->
<template>
<ClientOnly>
<MdEditor v-model="text" />
</ClientOnly>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import MdEditor from 'md-editor-v3'
const text = ref('# Nuxt 3 + md-editor-v3')
</script>
在 nuxt.config.ts 中确保插件以 .client.ts 结尾自动按客户端加载。
在 React 项目中请使用同作者的 md-editor-rt(API 与体验与 Vue 版一致):
安装:
npm i md-editor-rt
# 或 yarn add md-editor-rt / pnpm add md-editor-rt
最小示例:
// App.tsx
import React, { useState } from 'react'
import MdEditor from 'md-editor-rt'
import 'md-editor-rt/lib/style.css'
export default function App() {
const [text, setText] = useState('# Hello md-editor-rt')
const onUploadImg = async (files: File[], callback: (urls: string[]) => void) => {
const urls = files.map((f) => URL.createObjectURL(f))
callback(urls)
}
return (
<MdEditor
modelValue={text}
onChange={setText}
onSave={(v, html) => console.log('save', v)}
onUploadImg={onUploadImg}
theme="light"
previewTheme="github"
codeTheme="github"
/>
)
}
Next.js(SSR)动态导入:
// pages/editor.tsx
import dynamic from 'next/dynamic'
import 'md-editor-rt/lib/style.css'
import React, { useState } from 'react'
const MdEditor = dynamic(() => import('md-editor-rt'), { ssr: false })
export default function EditorPage() {
const [text, setText] = useState('# Next.js + md-editor-rt')
return <MdEditor modelValue={text} onChange={setText} />
}
如需流程图/时序图、数学公式:
示意(伪代码):
let mermaidReady = false
async function ensureMermaid() {
if (!mermaidReady) {
await import('mermaid') // 或使用 CDN
mermaidReady = true
}
}
md-editor-v3 是一款功能完善、性能优秀的 Vue3 Markdown 编辑器,凭借其灵活的扩展能力和良好的开发体验,能够广泛应用于内容管理系统、博客平台、技术文档编写等场景。在实际项目中合理配置与优化,可进一步提升用户体验与编辑效率。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。