Vue 渲染 Markdown 文件完全指南

前言

大家好,我是一诺,今天分享的是vue中渲染markdown文件。这是一个常见的需求,比如用户隐私协议页、技术说明等文档页面~

本文将详细介绍如何在 Vue 中渲染 Markdown 文件,并美化代码块的显示效果。

基础概念

什么是 Markdown?

Markdown 是一种纯文本格式的标记语言,使用简单的语法来格式化文档。例如:

# 这是标题**这是粗体文字**- 这是列表项

markdown-it 是什么?

markdown-it 是一个功能强大的 Markdown 解析器,可以将 Markdown 文本转换为 HTML。它具有以下特点:

  • 遵循 CommonMark 规范
  • 支持插件扩展
  • 配置灵活
  • 性能优秀

实现步骤

第一步:安装依赖

首先需要安装 markdown-it:

npm install markdown-it

第二步:基础实现

创建一个 Vue 组件来渲染 Markdown 文件:

<template><div class="markdown-body"><div v-html="md"></div></div>
</template><script>
import markdownIt from 'markdown-it'// 引入 Markdown 文件(需要 webpack loader 支持)
const mdContent = require('./example.md')// 创建 markdown-it 实例
const md = markdownIt()export default {name: 'MarkdownRenderer',computed: {md() {return md.render(mdContent)}}
}
</script>

第三步:配置 markdown-it

markdown-it 提供了丰富的配置选项:

const md = markdownIt({html: true, // 启用 HTML 标签xhtmlOut: true, // 使用 XHTML 格式输出breaks: true, // 将换行符转换为 <br>linkify: false, // 自动识别链接typographer: false // 启用智能引号和其他印刷符号
})

让我们逐一解释这些配置:

  • html: true:允许在 Markdown 中使用 HTML 标签
  • xhtmlOut: true:输出符合 XHTML 规范的 HTML(如 <br />
  • breaks: true:将段落中的换行符转换为 <br> 标签
  • linkify: false:是否自动将 URL 文本转换为链接
  • typographer: false:是否启用智能引号等印刷优化

完整示例

根据您提供的代码,这里是一个完整的实现:

<template><divid="my-markdown"class="markdown-body"><div v-html="md"></div></div>
</template><script>
// 引入 Markdown 文件
const mda = require('./api.md')
import markdownInit from 'markdown-it'// 配置 markdown-it
const md = markdownInit({html: true, // 启用源代码中的 HTML 标签xhtmlOut: true, // 使用 '/' 关闭单一标签 (<br />)breaks: true, // 将段落中的 '\n' 转换为 <br>langPrefix: 'language-', // 用于围栏代码块的语言前缀linkify: false, // 自动将类似 URL 的文本转换为链接typographer: false // 启用一些语言无关的替换和引号美化
})export default {name: 'MyMarkdown',computed: {md() {return md.render(mda)}}
}
</script><style>
.markdown-body {box-sizing: border-box;margin: 0 auto;padding: 0 30px;
}.markdown-body .highlight pre,
.markdown-body pre {max-height: 250px;
}
</style>

美化 Markdown 样式

使用现成的主题

GitHub 提供了一个优秀的 Markdown CSS 样式库:github-markdown-css

npm install github-markdown-css

然后在组件中引入:

<style>
@import 'github-markdown-css/github-markdown.css';.markdown-body {box-sizing: border-box;margin: 0 auto;padding: 30px;
}
</style>

使用第三方主题库

推荐使用 mweb-themes 主题库,它提供了 30+ 款精美的 Markdown 预览主题,包括:

浅色主题:

  • Bear 同款主题
  • Vue 风格主题
  • Typo.css 主题
  • 飞书文档风格
  • 等等…

深色主题:

  • Dracula
  • Nord
  • Solarized Dark
  • 等等…

使用方法:

  1. 下载主题文件
  2. 将 CSS 文件放入项目中
  3. 在组件中引入对应主题
<style>
/* 引入喜欢的主题 */
@import './themes/vue.css';
</style>

代码高亮

如果需要语法高亮,可以使用 highlight.js:

npm install highlight.js

配置 markdown-it 使用 highlight.js:

import hljs from 'highlight.js'
import 'highlight.js/styles/github.css'const md = markdownInit({// 其他配置...highlight: function (str, lang) {if (lang && hljs.getLanguage(lang)) {try {return hljs.highlight(str, { language: lang }).value} catch (__) {}}return ''}
})

注意事项

安全性

使用 v-html 渲染 Markdown 内容存在 XSS 攻击风险。如果 Markdown 内容来自用户输入,建议:

  1. 禁用 HTML 标签:html: false
  2. 使用 DOMPurify 等库清理 HTML
  3. 对用户输入进行严格验证

性能优化

  1. 缓存渲染结果:将渲染结果缓存,避免重复计算
  2. 按需加载:大型文档可以考虑分页或懒加载
  3. Web Workers:复杂的 Markdown 渲染可以放到 Web Worker 中

Webpack 配置

要在 Vue 项目中直接引入 .md 文件,需要配置相应的 loader:

// vue.config.js
module.exports = {chainWebpack: (config) => {config.module.rule('md').test(/\.md$/).use('raw-loader').loader('raw-loader').end()}
}

总结

本文介绍了在 Vue 中渲染 Markdown 文件的完整流程:

  1. 安装并配置 markdown-it
  2. 创建 Vue 组件渲染 Markdown
  3. 应用美观的主题样式
  4. 添加代码语法高亮

通过这些步骤,就可以在 Vue 项目中优雅地展示 Markdown 内容了。

如果要更多高级功能,可以探索 markdown-it 的插件生态系统,比如数学公式渲染、图表支持等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Science Robotics:UCLA 贺曦敏团队综述自主软体机器人

在机器人中实现类似生命的自主性一直是研究的方向&#xff0c;但目前大多数软体机器人仍依赖外部刺激操控来产生持续运动。为了实现能够自我调节感知 、 决策和驱动的自主物理智能&#xff08;autonomous physical intelligence&#xff0c;API&#xff09;&#xff0c;一种有前…

基于LangChain构建高效RAG问答系统:向量检索与LLM集成实战

基于LangChain构建高效RAG问答系统&#xff1a;向量检索与LLM集成实战 在本文中&#xff0c;我将详细介绍如何使用LangChain框架构建一个完整的RAG&#xff08;检索增强生成&#xff09;问答系统。通过向量检索获取相关上下文&#xff0c;并结合大语言模型&#xff0c;我们能够…

【Java学习笔记】SringBuffer类(重点)

StringBuffer&#xff08;重点&#xff09; 1. 基本介绍 &#xff08;1&#xff09;StringBuffer是可变的字符序列&#xff0c;可以对字符串内容惊醒增删 &#xff08;2&#xff09;很多方法喝String相同&#xff0c;但StringBuffer可变长度 &#xff08;3&#xff09;Strin…

计算机网络领域所有CCF-A/B/C类期刊汇总!

本期小编统计了【计算机网络】领域CCF推荐所有期刊的最新影响因子&#xff0c;分区、年发文量以及投稿经验&#xff0c;供大家参考&#xff01; CCF-A类 1 IEEE Journal on Selected Areas in Communications 【影响因子】13.8 【期刊分区】JCR1区&#xff0c;中科院1区TOP …

AI-Sphere-Butler之如何启动AI全能管家教程(WSL测试环境下适用)

环境&#xff1a; Ubuntu20.04 WSL2 问题描述&#xff1a; AI-Sphere-Butler之如何启动AI全能管家教程(WSL测试环境下适用) 解决方案&#xff1a; 打开管家大模型 1.运行大模型在cmd下输入&#xff1a; ollama run qwen2.5-3bnsfwny运行管家 数字人运行脚本&#xff…

【python深度学习】Day 47 注意力热图可视化

知识点&#xff1a;热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 一、概念 为了方便观察输出&#xff0c;将特征图进行可视化。特征图本质就是不同的卷积核的输出&#xff0c;浅层指的是离输入图近的卷积层&#xff0c;浅层卷积层的特征图通常较大&#xff0c;而深层…

C#语音识别:使用Whisper.net实现语音识别

C#语音识别&#xff1a;使用Whisper.net实现语音识别 在当今数字化时代&#xff0c;语音识别技术已广泛应用于智能助手、语音转文字、会议记录等众多领域。对于 C# 开发者而言&#xff0c;如何快速、高效地实现语音识别功能呢&#xff1f;今天&#xff0c;我们就来介绍一个强大…

开源分享|适合初创商家的餐饮系统,基于thinkphp8+element-plus

一、项目介绍 三勾餐饮点餐连锁版系统是一个基于thinkphp8element-plusuniapp打造的面向开发的小程序商城的全面解决方案&#xff0c;旨在为连锁餐饮企业提供高效的点餐与管理服务。该系统支持多端应用发布&#xff0c;包括微信小程序、H5、安卓及iOS平台&#xff0c;实现数据…

rec_pphgnetv2完整代码学习(一)

rec_pphgnetv2是paddleocr_v5中的重要改进&#xff0c;因此对其完整代码进行学习十分之有必要。 一、IdentityBasedConv1x1 这段代码定义了 IdentityBasedConv1x1 类&#xff0c;它是 PaddleOCRv5 中 rec_pphgnetv2 模型的关键改进之一。该层通过将恒等映射&#xff08;Ident…

vue3+dify从零手撸AI对话系统

vue3dify从零手撸AI对话系统 前言 近年来&#xff0c;人工智能技术呈现爆发式增长&#xff0c;其应用已深度渗透至各行各业。甚至家里长辈们也开始借助AI工具解决日常问题。作为程序员群体&#xff0c;我们更应保持技术敏锐度&#xff0c;紧跟这波浪潮。 回溯求学时期&#xf…

robot_lab train的整体逻辑

Go2机器人推理(Play)流程详细分析 概述 本文档详细分析了使用命令 python scripts/rsl_rl/base/play.py --task RobotLab-Isaac-Velocity-Rough-Unitree-Go2-v0 进行Go2机器人推理的完整流程&#xff0c;基于实际的代码实现&#xff0c;包括模型加载、环境配置调整、推理循环…

Python Day45

Task&#xff1a; 1.tensorboard的发展历史和原理 2.tensorboard的常见操作 3.tensorboard在cifar上的实战&#xff1a;MLP和CNN模型 效果展示如下&#xff0c;很适合拿去组会汇报撑页数&#xff1a; 作业&#xff1a;对resnet18在cifar10上采用微调策略下&#xff0c;用tens…

MySQL SQL 优化:从 INSERT 到 LIMIT 的实战与原理

在数据库驱动的现代应用中&#xff0c;SQL 查询的性能直接决定了用户体验和系统效率。本文将深入探讨 MySQL &#xff08;特别是 InnoDB 存储引擎&#xff09;中常见的 SQL 性能瓶颈&#xff0c;并结合实际案例&#xff0c;详细剖析从数据插入到复杂分页查询的优化策略与底层实…

SQL 基础入门

SQL 基础入门 SQL&#xff08;全称 Structured Query Language&#xff0c;结构化查询语言&#xff09;是用于操作关系型数据库的标准语言&#xff0c;主要用于数据的查询、新增、修改和删除。本文面向初学者&#xff0c;介绍 SQL 的基础概念和核心操作。 1. 常见的 SQL 数据…

HTTP 请求协议简单介绍

目录 常见的 HTTP 响应头字段 Java 示例代码&#xff1a;发送 HTTP 请求并处理响应 代码解释&#xff1a; 运行结果&#xff1a; 文件名&#xff1a; 总结&#xff1a; HTTP&#xff08;HyperText Transfer Protocol&#xff09;是用于客户端与服务器之间通信的协议。它定…

《100天精通Python——基础篇 2025 第5天:巩固核心知识,选择题实战演练基础语法》

目录 一、踏上Python之旅二、Python输入与输出三、变量与基本数据类型四、运算符五、流程控制 一、踏上Python之旅 1.想要输出 I Love Python,应该使用()函数。 A.printf() B.print() C.println() D.Print() 在Python中想要在屏幕中输出内容&#xff0c;应该使用print()函数…

求解一次最佳平方逼近多项式

例 设 f ( x ) 1 x 2 f(x)\sqrt{1x^2} f(x)1x2 ​&#xff0c;求 [ 0 , 1 ] [0,1] [0,1]上的一个一次最佳平方逼近多项式。 解 &#xff1a; d 0 ∫ 0 1 1 x 2 d x 1 2 ln ⁡ ( 1 2 ) 2 2 ≈ 1.147 d_0\int_{0}^{1}\sqrt{1x^2}dx\frac{1}{2}\ln(1\sqrt{2})\frac{\sqrt…

在Ubuntu上使用 dd 工具制作U盘启动盘

在Ubuntu上使用 dd 工具制作U盘启动盘 在Linux系统中&#xff0c;dd 是一个功能强大且原生支持的命令行工具&#xff0c;常用于复制文件和转换数据。它也可以用来将ISO镜像写入U盘&#xff0c;从而创建一个可启动的操作系统安装盘。虽然图形化工具&#xff08;如 Startup Disk…

如何理解OSI七层模型和TCP/IP四层模型?HTTP作为如何保存用户状态?多服务器节点下 Session方案怎么做

本篇概览&#xff1a; OSI 七层模型是什么&#xff1f;每一层的作用是什么&#xff1f;TCP/IP四层模型和OSI七层模型的区别是什么&#xff1f; HTTP 本身是无状态协议&#xff0c;HTTP如何保存用户状态? 能不能具体说一下Cookie的工作原理、生命周期、作用域&#xff1f;使用…

深入剖析 RocketMQ 中的 DefaultMQPushConsumerImpl:消息推送消费的核心实现

前言 在 Apache RocketMQ 的消息消费体系中&#xff0c;RocketMQ 提供了DefaultMQPushConsumer&#xff08;推送消费&#xff09;和DefaultMQPullConsumer&#xff08;拉取消费&#xff09;两种主要消费方式。DefaultMQPushConsumer与DefaultMQPullConsumer在消息获取方式&…