前端直接渲染Markdown

前端直接渲染Markdown,主要技术方案:

1. 使用JavaScript库(最常用)

marked

javascript 复制代码
// 安装:npm install marked
import { marked } from 'marked';
document.getElementById('content').innerHTML = marked.parse(markdownText);

showdown

javascript 复制代码
// 安装:npm install showdown
const converter = new showdown.Converter();
document.getElementById('content').innerHTML = converter.makeHtml(markdownText);

remark + rehype

javascript 复制代码
// 更现代的方案
import { unified } from 'unified';
import remarkParse from 'remark-parse';
import remarkRehype from 'remark-rehype';
import rehypeStringify from 'rehype-stringify';

const html = await unified()
  .use(remarkParse)
  .use(remarkRehype)
  .use(rehypeStringify)
  .process(markdownText);

2. 浏览器原生方案

使用textarea + 解析

html 复制代码
<textarea id="markdown-source" style="display:none">
# 标题
这是**粗体**文本
</textarea>
<div id="rendered-content"></div>

<script>
// 需要配合marked或其他库使用
</script>

3. 框架集成方案

React + react-markdown

jsx 复制代码
import ReactMarkdown from 'react-markdown';

function MarkdownRenderer({ content }) {
  return <ReactMarkdown>{content}</ReactMarkdown>;
}

Vue + markdown-it

vue 复制代码
<template>
  <div v-html="compiledMarkdown"></div>
</template>

<script>
import markdownIt from 'markdown-it';

export default {
  data() {
    return {
      markdown: '# Hello World'
    };
  },
  computed: {
    compiledMarkdown() {
      return markdownIt().render(this.markdown);
    }
  }
};
</script>

4. 完整示例

html 复制代码
<!DOCTYPE html>
<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
</head>
<body>
  <textarea id="input" rows="10" cols="50">
# 标题
## 子标题
- 列表项1
- 列表项2
**粗体** *斜体*
  </textarea>
  <div id="output"></div>
  
  <script>
    const input = document.getElementById('input');
    const output = document.getElementById('output');
    
    function updateOutput() {
      output.innerHTML = marked.parse(input.value);
    }
    
    input.addEventListener('input', updateOutput);
    updateOutput(); // 初始渲染
  </script>
</body>
</html>

5. 安全考虑

使用DOMPurify防止XSS攻击:

javascript 复制代码
import DOMPurify from 'dompurify';
import { marked } from 'marked';

const cleanHtml = DOMPurify.sanitize(marked.parse(markdownText));
document.getElementById('content').innerHTML = cleanHtml;

推荐使用markedremark,它们性能好、功能完整,且有良好的社区支持。

相关推荐
z-robot4 小时前
Nginx 配置代理
前端
用户47949283569154 小时前
Safari 中文输入法的诡异 Bug:为什么输入 @ 会变成 @@? ## 开头 做 @ 提及功能的时候,测试同学用 Safari 测出了个奇怪的问题
前端·javascript·浏览器
没有故事、有酒4 小时前
Ajax介绍
前端·ajax·okhttp
朝新_4 小时前
【SpringMVC】详解用户登录前后端交互流程:AJAX 异步通信与 Session 机制实战
前端·笔记·spring·ajax·交互·javaee
裴嘉靖4 小时前
Vue 生成 PDF 完整教程
前端·vue.js·pdf
毕设小屋vx ylw2824264 小时前
Java开发、Java Web应用、前端技术及Vue项目
java·前端·vue.js
冴羽5 小时前
今日苹果 App Store 前端源码泄露,赶紧 fork 一份看看
前端·javascript·typescript
蒜香拿铁5 小时前
Angular【router路由】
前端·javascript·angular.js
brzhang6 小时前
读懂 MiniMax Agent 的设计逻辑,然后我复刻了一个MiniMax Agent
前端·后端·架构