前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >highlight.js 在 Vue 中使用的一点儿经验

highlight.js 在 Vue 中使用的一点儿经验

作者头像
overtrue
发布2018-07-05 15:02:43
2K0
发布2018-07-05 15:02:43
举报

使用 markdown 来给程序写文档是非常方便的,自从用顺了 markdown 之后,都很久没打开过 Word 了。

既然是程序的文档,少不了需要插入一些示例代码,而对代码进行语法高亮渲染并配以合适的颜色主题,会让文档显得更炫,也更便于阅读。

要实现文档代码高亮渲染其实并不难。

实现方法

首先,把 markdown 文件加载为 vue 组件,这需要一个合适的 loader,自己目前使用 vue-markdown-loader。webpack 配置的 module.rules 中进行如下配置:

代码语言:javascript
复制
{
    test: /\.md$/,
    loader: 'vue-markdown-loader',
    options: {
        preset: 'default',
        breaks: true,
        preventExtract: true
    }
}

然后就可以在项目中直接 import md 文件了。比如:

代码语言:javascript
复制
<template>
    <MyMarkdown/>
</template>

<script>
export default {
    components: {
        'MyMarkdown': () => import('xxx.md')
    }
}
</script>

当然,通常情况下,我们会与 vue-router 一起使用,把 md 文件作为一个视力组件加载到 router-view 中去。

代码语言:javascript
复制
{
    path: 'path/home',
    component: () => import('../markdown/home.md')
},

看到这里可能奇怪,这些与文题中提到的 highlight.js 有毛关系?这是因为,vue-markdown-loader 中已经内置了对代码高这的支持。你只需要在页面中引入相关的样式,例如:

代码语言:javascript
复制
import 'highlight.js/styles/atom-one-dark.css'

然后主可以看到代码高亮的效果,通常是这样的。

看起来还不错,但这样的高亮有个问题,那就是他的背景色并不随着你所加载了 highlight.js 主题样式而改变,而且不同语言的代码在配色上的一些差异也没有很好的渲染出来。而从 highlight.js 官网示例可以看到,这些问题本不应该出现的。

为了实现与 highlight.js 官网示例中的主题效果,可以在页面中自己完成代码高亮的渲染。

代码语言:javascript
复制
<script>
import hljs from 'highlight.js'
import 'highlight.js/styles/atom-one-dark.css'
    
const highlightCode = () => {
    const preEl = document.querySelectorAll('pre')
    preEl.forEach((el) => {
        hljs.highlightBlock(el)
  })
}
  
export default {
   mounted () {
      highlightCode()
   },

   updated () {
      highlightCode()
   }
}
</script>

可以看到,代码中使用了 highlight.js 的 highlightBlock()方法而不是官方默认示例里提到的 initHighlighting(),因为后者一般用于静态页面的渲染。如果使用它,当使用 vue-router 导航到一个新的‘页面’之后,新页面中的代码块可能无法被正确渲染。这也是为什么在 updated 钩子中再次调用 highlightCode()的原因。(实际上自己在此坑了很久,查阅不少文档才找到这一原因)

做完这些之后再看渲染效果:

果然好多了!

后记

既然是自己渲染代码高亮,那么其实 loader 中对代码块块的处理就不必要或者显得有点儿多余了,因为这些处理会增加一些计算量。所以你也可以找一些别的 loader 来替代 vue-markdown-loader,甚至尝试自己写一个 loader。

对于一个软件,官方文档是有必要仔细读的,就像前面提到的 highlight.js 中 initHighlighting() 方法的问题,其实在官方文档中也有解释。

给大家送上 EasyWeChat 教程 ¥20 元优惠码:NY2018 有效期到今年6月底,送亲友,送朋友,都可以,直接在 https://www.easywechat.com 即可使用!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 假装我会写代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现方法
  • 后记
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档