跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

前端 Markdown 渲染:从基础到实战

介绍前端渲染 Markdown 的核心逻辑与主流库选型。通过 marked.js、React-Markdown 和 showdown.js 实现解析与展示,涵盖原生 JS、React 及 Vue 项目方案。重点讨论 XSS 安全防护(如 DOMPurify)、样式美化(CSS 库复用)及大文档性能优化策略,提供不同场景下的最佳实践建议。

JavaCoder发布于 2026/4/6更新于 2026/5/2026 浏览

在 Web 开发中,常需将 Markdown 文本(如接口文档、博客内容)渲染为美观的 HTML 页面。不同于纯文本展示,Markdown 渲染需要借助专门的库解析语法规则,再结合样式实现可视化。

一、前端渲染 Markdown 的核心逻辑

Markdown 本质是轻量级标记语言,无法直接被浏览器识别。前端渲染的核心流程如下:

  1. 解析:通过库将 Markdown 文本转换为 HTML 字符串;
  2. 渲染:将解析后的 HTML 插入页面 DOM 中;
  3. 美化:通过 CSS 优化排版(如标题间距、代码块高亮);
  4. 增强(可选):支持表格、公式、自定义组件等进阶功能。

目前主流的前端 Markdown 渲染库有 marked.js(轻量灵活)、showdown.js(功能全面)、React-Markdown(React 生态专用)等。

二、3 个主流渲染库实战教程

1. marked.js:轻量首选(原生 JS / 框架通用)

marked.js 是目前最流行的 Markdown 解析库之一,体积小、解析速度快,支持自定义渲染规则,适合原生 JS 项目或各类框架。

步骤 1:安装与引入
  • CDN 引入(快速测试):
<!-- 引入 marked 核心库 -->
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<!-- 可选:代码高亮需搭配 highlight.js -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/styles/github-dark.min.css">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lib/highlight.min.js"></script>
  • npm 安装(工程化项目):
npm install marked highlight.js --save
步骤 2:基础渲染示例(原生 JS)

实现输入 Markdown 文本,实时预览渲染结果的功能:

// 1. 获取 DOM 元素
const input = document.getElementById('markdownInput');
const preview = .();


marked.({
    :  {
         lang && hljs.(lang) ? hljs.(code, { : lang }). : hljs.(code).;
    },
    : ,
    : 
});


 () {
     markdownText = input.;
     html = marked.(markdownText);
    preview. = html;
}


();
input.(, renderMarkdown);
document
getElementById
'previewArea'
// 2. 配置 marked(启用代码高亮)
setOptions
highlight
(code, lang) =>
return
getLanguage
highlight
language
value
highlightAuto
value
breaks
true
gfm
true
// 3. 渲染函数
function
renderMarkdown
const
value
const
parse
innerHTML
// 4. 初始化渲染 + 监听输入变化
renderMarkdown
addEventListener
'input'
步骤 3:进阶配置(自定义渲染)

若需修改默认渲染规则,可通过 marked.Renderer() 实现:

const renderer = new marked.Renderer();
renderer.heading = (text, level) => {
    return `<h${level}>${text}</h${level}>`;
};
renderer.link = (href, title, text) => {
    const titleAttr = title ? `title="${title}"` : '';
    return `<a href="${href}" ${titleAttr} target="_blank" rel="noopener">${text}</a>`;
};
const html = marked.parse(markdownText, { renderer });

2. React-Markdown:React 生态专用(安全无 XSS)

如果是 React 项目,推荐使用 react-markdown,它基于组件化思想,支持插件扩展,且默认过滤危险 HTML。

步骤 1:安装依赖
npm install react-markdown @types/react-markdown highlight.js --save
# 若需支持表格、公式等,需安装对应插件
npm install remark-gfm remark-math rehype-katex --save
步骤 2:React 组件示例
import React, { useState } from 'react';
import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm';
import remarkMath from 'remark-math';
import rehypeKatex from 'rehype-katex';
import 'highlight.js/styles/github-light.min.css';
import 'katex/dist/katex.min.css';

const MarkdownPreview = () => {
    const [markdownText, setMarkdownText] = useState(`# React-Markdown 示例
## 1. 表格
| 姓名 | 技术栈 |
|------|--------|
| 张三 | React |
## 2. 数学公式
欧拉公式:$e^{i\pi} + 1 = 0$`);

    return (
        <div style={{ display: 'flex', gap: '20px', padding: '20px' }}>
            <textarea value={markdownText} onChange={(e) => setMarkdownText(e.target.value)} style={{ width: '40%', height: '600px', padding: '10px' }} />
            <ReactMarkdown className="markdown-body"
                remarkPlugins={[remarkGfm, remarkMath]}
                rehypePlugins={[rehypeKatex]}
                style={{ width: '50%', padding: '20px', border: '1px solid #eee' }}
            >
                {markdownText}
            </ReactMarkdown>
        </div>
    );
};
export default MarkdownPreview;

关键优势:

  • 安全:默认不渲染 script、iframe 等危险标签;
  • 插件化:通过 remark-* 和 rehype-* 插件支持复杂功能;
  • TS 友好:自带类型定义。

3. showdown.js:功能全面(适合复杂场景)

showdown.js 支持更多自定义配置,适合企业级文档系统。

基础使用示例(Vue 项目):

<template>
    <div>
        <textarea v-model="markdownText" @input="render" placeholder="输入 Markdown..."></textarea>
        <div v-html="htmlContent"></div>
    </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';
import showdown from 'showdown';
import hljs from 'highlight.js';

const converter = new showdown.Converter({
    tables: true,
    strikethrough: true,
    autolink: true,
    extensions: [
        () => ({
            type: 'output',
            filter: (html) => {
                return html.replace(/<pre><code([^>]*)>/g, '<pre><code$1>').replace(/<code([^>]*)>([\s\S]*?)<\/code>/g, (match, attrs, code) => {
                    const langMatch = attrs.match(/class="language-(\w+)"/);
                    const lang = langMatch ? langMatch[1] : 'plaintext';
                    const highlighted = hljs.highlight(code, { language: lang }).value;
                    return `<code${attrs}>${highlighted}</code>`;
                });
            }
        })
    ]
});

const markdownText = ref('# Showdown Vue 示例\n**加粗文本**');
const htmlContent = ref('');

const render = () => {
    htmlContent.value = converter.makeHtml(markdownText.value);
};
onMounted(() => render());
</script>

三、渲染优化与注意事项

1. 解决 XSS 安全风险

直接使用 innerHTML 可能导致 XSS 攻击。解决方案:

  • 用 DOMPurify 净化 HTML(适合原生 JS/showdown):
import DOMPurify from 'dompurify';
const html = marked.parse(markdownText);
const safeHtml = DOMPurify.sanitize(html);
preview.innerHTML = safeHtml;
  • React 项目优先用 react-markdown(默认安全),Vue 项目可配合 vue-dompurify-html 指令。

2. 样式美化:复用成熟 CSS 库

推荐直接引入现成样式库,实现 GitHub 风格等排版:

  • github-markdown-css(最常用):
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/github-markdown-css/github-markdown.min.css">

使用时给预览区添加 markdown-body 类。

3. 大文档渲染性能优化

若渲染超长 Markdown,可能导致页面卡顿。优化方案:

  • 分片渲染:只渲染当前可视区域内容;
  • 懒加载图片:替换为 loading="lazy" 格式;
  • 缓存解析结果:对相同的 Markdown 文本缓存解析后的 HTML。

四、常见场景选型建议

项目场景推荐库核心原因
原生 JS / 小项目marked.js轻量、速度快、学习成本低
React 项目React-Markdown组件化、安全无 XSS、插件丰富
Vue 项目showdown.js + vue-dompurify-html配置灵活、支持 Vue 指令
企业级文档 / 复杂语法showdown.js扩展能力强、支持自定义语法
静态站点(如博客)Next.js/VuePress 内置无需手动配置,支持 SSR/SSG

五、总结

前端渲染 Markdown 的核心是选对库并做好配置:

  1. 简单场景用 marked.js 快速实现,React 项目优先 React-Markdown;
  2. 需复杂扩展时,搭配对应的插件(remark-gfm/rehype-katex);
  3. 始终关注安全(XSS)和性能(大文档优化),避免直接使用未净化的 innerHTML;
  4. 样式美化优先复用成熟 CSS 库,减少重复开发。

目录

  1. 一、前端渲染 Markdown 的核心逻辑
  2. 二、3 个主流渲染库实战教程
  3. 1. marked.js:轻量首选(原生 JS / 框架通用)
  4. 步骤 1:安装与引入
  5. 步骤 2:基础渲染示例(原生 JS)
  6. 步骤 3:进阶配置(自定义渲染)
  7. 2. React-Markdown:React 生态专用(安全无 XSS)
  8. 步骤 1:安装依赖
  9. 若需支持表格、公式等,需安装对应插件
  10. 步骤 2:React 组件示例
  11. 1. 表格
  12. 2. 数学公式
  13. 3. showdown.js:功能全面(适合复杂场景)
  14. 三、渲染优化与注意事项
  15. 1. 解决 XSS 安全风险
  16. 2. 样式美化:复用成熟 CSS 库
  17. 3. 大文档渲染性能优化
  18. 四、常见场景选型建议
  19. 五、总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 Leaflet 和天地图的长沙市免费运动场所 WebGIS 可视化
  • WebGoat 安全靶场环境搭建与实战指南
  • Windows 下安装 OpenClaw 并接入飞书机器人指南
  • 大香蕉 (Banana Pro) 企业级落地白皮书:如何用 0.18 元打破 AIGC 的“商业不可能三角”?
  • 使用 Copilot 制定 60 天系统学习 AI 计划
  • 数据结构:归并排序与分治思想详解
  • 18 款主流 AI Agent 框架技术选型与对比分析
  • 18 款 AI Agent 框架技术选型与对比解析
  • SAP ABAP Web Dynpro 开发指南
  • MCP 协议详解:与 Function Call 的区别及使用方式
  • ComfyUI AI 绘画高效工作流:节点思维与模板复用
  • Claude-Code 2.1.88 源码结构解析:基于 Source Map 的逆向分析
  • Android 开发岗位历年高频面试题及参考答案
  • ToClaw:不是更会炫技的 AI,而是更容易上手的桌面工具
  • YOLOv8/v11 与 LLM 联动的 Web 视觉检测系统:Django+Vue3 前后端分离实战
  • Vue 3 + TypeScript + Vite 在具身 AI 系统中的前端架构实践
  • 缓存算法实战:LRU 与 LFU 原理及 Java 实现
  • Fastjson 解析嵌套 JSONArray 获取值的常见陷阱与解决方案
  • Linux 常见指令(下)
  • 五种常用 Web 加密算法原理及实战

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online