Vue3解析markdown解析并实现代码高亮显示

本文介绍了如何在Vue项目中使用marked和highlight.js库来实现Markdown的解析和代码高亮显示。首先通过npm安装两个库,然后在main.js中引入highlight.js及其样式,并创建全局指令v-highlight。接着在Vue组件中应用marked解析Markdown内容,并使用v-highlight指令实现代码高亮。最后展示了代码示例和实际效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vue实现博客前端,需要实现markdown的解析,如果有代码则需要实现代码的高亮。
Vue的markdown解析库有很多,如markdown-it、vue-markdown-loader、marked、vue-markdown等。这些库都大同小异。这里选用的是marked,代码高亮的库选用的是highlight.js。

具体实现步骤如下:

一、安装依赖库

在vue项目下打开命令窗口,并输入以下命令

npm install marked -save    // marked 用于将markdown转换成html
npm install highlight.js -save   //用于代码高亮显示

命令执行完后可以在控制台或package.json文件中看到有安装的版本号
package.json文件中看到有安装的版本号

二、在main.js文件中引入highlight.js及样式并创建一个自定义的全局指令

import hljs from 'highlight.js';
import 'highlight.js/styles/atom-one-dark.css' //样式

//创建v-highlight全局指令
Vue.directive('highlight',function (el) {
  let blocks = el.querySelectorAll('pre code');
  blocks.forEach((block)=>{
    hljs.highlightBlock(block)
  })
})

这样就可以在vue组件中使用v-highlight引用代码高亮的方法了。

三、在Vue组件中应用marked解析及实现代码高亮

代码示例如下:

 <!-- 正文输出 -->
<div class="entry-content">
  <div v-highlight v-html="article"  id="content"></div>
</div>

<script>
    // 将marked 引入
  import { marked }from 'marked';
    export default {
        name: 'articles',
        data(){
          return{
              article:''
          }
        },
        methods: {
          getPostDetail() {
            console.log('getPostDetail()'+this.id)
            fetchPostDetail(this.id).then(res => {
               this.postdetail=res.data
               // 调用marked()方法,将markdown转换成html
               this.article= marked(this.postdetail.content);
               console.log(res.data)
              }).catch(err => {
                  console.log(err)
              })

          },
        created() {
          //调用获取文章内容的接口方法
          this.getPostDetail()
        },
    }
 </script>

四、显示效果

markdown解析及代码高亮显示效果
在这里插入图片描述

示例中引用的样式是 import 'highlight.js/styles/atom-one-dark.css'
实际highlight.js/styles中提供了很多样式,可以根据自己的喜好选用。

代码高亮样式


博客:http://xiejava.ishareread.com/

<think>好的,我需要帮助用户在Vue3实现Markdown解析。根据用户的问题,他们想了解使用哪些库或方法。首先,我得回忆一下常见的Vue3 Markdown解析库。之前学过的有markdown-it、marked、vue-markdown等,但用户提供的引用里提到他们用的是marked和highlight.js,这应该是个不错的起点。 首先,我应该分步骤说明如何实现。第一步是安装必要的库,也就是marked和highlight.js。然后,需要在Vue3组件中引入这些库。接下来,配置marked以支持代码高亮,这涉及到设置highlight函数,使用highlight.js来处理代码块。 另外,用户提到的是Vue3,所以要注意组合式API的使用,比如在setup函数中导入库,或者使用<script setup>语法。可能还需要使用ref或reactive来处理响应式的Markdown输入和HTML输出。 然后,要处理安全性问题,比如使用DOMPurify来防止XSS攻击。用户可能没有提到这一点,但这是一个重要的安全考虑因素,应该包含在回答中。 接下来,展示一个简单的组件示例,包括模板部分,使用textarea输入Markdown,然后实时渲染HTML。这里需要用v-model绑定输入内容,通过方法将Markdown转换为HTML,再使用v-html指令显示结果。 最后,还需要考虑样式部分,引入highlight.js的主题样式,确保代码高亮显示美观。同时,提醒用户注意安全性和性能优化,比如避免不必要的重新渲染。 用户提供的引用中提到了marked和highlight.js的具体使用,所以在回答中需要引用这些内容,正确添加引用标识。同时,生成的相关问题要围绕Markdown解析的扩展,比如实时预览、代码高亮自定义、性能优化等。 总结一下,回答的结构应该是:安装库、配置解析器、创建组件、处理安全性、示例代码、注意事项和相关问题。这样用户能一步步跟着操作,确保他们能顺利在Vue3项目中实现Markdown解析。</think>### Vue3Markdown解析实现步骤 在Vue3解析Markdown主要依赖第三方库实现,以下为详细实现方案: #### 1. 安装核心库 ```bash npm install marked highlight.js dompurify ``` - $marked$:Markdown解析核心库(解析速度较快,扩展性强)[^1] - $highlight.js$:代码高亮支持库(支持170+编程语言) - $dompurify$:HTML净化工具(防止XSS攻击) #### 2. 基础解析实现 ```vue <script setup> import { ref } from &#39;vue&#39; import marked from &#39;marked&#39; import hljs from &#39;highlight.js&#39; import DOMPurify from &#39;dompurify&#39; const markdownText = ref(&#39;# Hello Markdown! \n```js\nconsole.log("Hello Vue3")\n```&#39;) const htmlOutput = ref(&#39;&#39;) const parseMarkdown = (raw) => { marked.setOptions({ highlight: (code, lang) => { return hljs.highlightAuto(code).value } }) return DOMPurify.sanitize(marked.parse(raw)) } htmlOutput.value = parseMarkdown(markdownText.value) </script> <template> <div class="editor-container"> <textarea v-model="markdownText" /> <div class="preview" v-html="htmlOutput"></div> </div> </template> ``` #### 3. 关键配置说明 1. **代码高亮配置**: - 通过$highlightAuto$自动检测代码语言 - 需要引入高亮主题样式: ```css @import &#39;highlight.js/styles/github-dark.css&#39;; ``` 2. **安全防护**: - 使用$DOMPurify.sanitize()$过滤危险标签 - 防止用户输入恶意脚本的XSS攻击 3. **实时预览**: - 通过$watchEffect$实现响应式更新: ```javascript watchEffect(() => { htmlOutput.value = parseMarkdown(markdownText.value) }) ``` #### 4. 完整功能组件示例 ```vue <template> <div class="markdown-editor"> <div class="editor-pane"> <h3>编辑区</h3> <textarea v-model="inputText" @input="updatePreview" placeholder="输入Markdown内容..." ></textarea> </div> <div class="preview-pane"> <h3>预览区</h3> <div class="rendered-content" v-html="processedHtml" ></div> </div> </div> </template> <script setup> import { ref } from &#39;vue&#39; import marked from &#39;marked&#39; import hljs from &#39;highlight.js&#39; import DOMPurify from &#39;dompurify&#39; // 初始化配置 marked.setOptions({ breaks: true, // 转换换行符 gfm: true, // 支持GitHub风格 highlight: (code) => hljs.highlightAuto(code).value }) const inputText = ref(&#39;&#39;) const processedHtml = ref(&#39;&#39;) const updatePreview = () => { processedHtml.value = DOMPurify.sanitize( marked.parse(inputText.value) ) } </script> ``` #### 5. 注意事项 1. **性能优化**: - 对大规模文档使用防抖处理 - 避免频繁的DOM操作 2. **扩展功能**: ```javascript // 自定义渲染规则示例 const renderer = new marked.Renderer() renderer.heading = (text, level) => { return `<h${level} class="custom-heading">${text}</h${level}>` } marked.use({ renderer }) ``` 3. **服务端渲染**: - 需要单独处理DOMPurify的SSR兼容 - 建议将marked解析过程放在客户端执行
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiejava1018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值