Vue3中实现代码高亮的两种方法(prismjs和highlight.js)

 更新时间:2025年04月04日 08:46:11   作者:富朝阳  
最近忙着开发自己的博客系统,在做界面展示的时候,需要让代码高亮,于是经过在网上查阅,发现有两款比较好用的插件实现代码高亮,分别是prismjs和highlight.js,下面我分别介绍下,方便给需要的同学参考

prismjs和highlight.js

prismjs使用

prismjs官网链接

1.安装依赖

//安装prismjs 插件
npm install prismjs -S
 
// vite
npm install vite-plugin-prismjs -D

2.配置vite.config.js 2.配置vite.config.js 

import { prismjsPlugin } from 'vite-plugin-prismjs';
export default defineConfig({
	plugins: [
    	vue(),
    	prismjsPlugin({
      		languages: 'all', // 语言
      		plugins: ['line-numbers', 'copy-to-clipboard'], //官网有其他功能,这里开启行数和复制按钮功能
      		theme: 'okaidia', // 主题
      		css: true,
    	}),
  ],
})

参数解读:

  • line-numbers 显示行数
  • language 显示语言
  • copy-to-clipboard 复制功能
  • inline-color 代码中显示颜色块

3.html使用

 设置语言只需要在class="language-语言",比如如下js设置language-js即可

<template>
  <pre><code class="language-js line-numbers">{{ codes }}</code></pre>
</template>
 
<script lang="ts">
import { defineComponent } from 'vue';
import Prism from 'prismjs';
export default defineComponent({
  name: 'HtmlRender',
  setup() {
    onMounted(() => {
      Prism.highlightAll(); // 切换更新内容则重新调用这个方法
    });
  }
});
</script>

注意: pre 和 code 写在同一行(不然行号会错乱)

效果图:

4.额外扩展

如果你想用Mac分格的样式,则需要自定义pre样式,如下是我自己的,大家可做参考:

pre {
    overflow: hidden !important;
    code{ 
        display: inline-block;
        padding-bottom: 20px;
        position: relative;
        top: 20px;
    }
    &::before {
        content: "";
        position: absolute;
        background: red;
        width: 10px;
        height: 10px;
        border-radius: 50%;
        top: 10px;
        left: 15px;
        transform: translate(-50%);
    }
    &::after {
        content: "";
        position: absolute;
        background: sandybrown;
        width: 10px;
        height: 10px;
        border-radius: 50%;
        top: 10px;
        left: 30px;
        transform: translate(-50%);
    }
    code:first-child{
        &::after{
            content: "";
            position: absolute;
            background: limegreen;
            width: 10px;
            height: 10px;
            border-radius: 50%;
            top: -24px;
            left: -7px;
            transform: translate(-50%);
        }
    }
}

如果你到了这一步,那代表你使用prismjs实现的的代码块样式功能完美实现啦!恭喜恭喜! 

highlight使用

1.安装依赖

npm install highlight.js --save 或 yarn add highlight.js

2.在main.js中引入,官方为我们提供了vue到插件

// highlight 的样式,依赖包,组件
import hljs from "highlight.js";
import "highlight.js/styles/github.css";
 
const app = createApp(App);
app.use((app) => {
    app.directive("highlight", {
      mounted(el) {
        const blocks = el.querySelectorAll("pre code"); // querySelectorAll可以根据自己的富文本生成的代码做调整 我这里默认刚好
        blocks.forEach((block: any) => {
          // 在forEach中做一些操作
          // 1.创建ul节点
          const ul = document.createElement("ul");
          // 2.根据换行符获取行数,根据获取的行数生成行号
          const rowCount = block.outerHTML.split("\n").length;
          for (let i = 1; i <= rowCount; i++) {
            //创建li节点,创建文本节点
            const li = document.createElement("li");
            const text = document.createTextNode(String(i));
            //为li追加文本节点,将li加入ul
            li.appendChild(text);
            ul.appendChild(li);
          }
          // 3.给行号添加类名
          ul.className = "pre-numbering";
          // 4.将ul节点加到 代码块
          block.parentNode.appendChild(ul);
          hljs.highlightBlock(block);
        });
      },
    });
  })
  .mount("#app");

3.css行数样式自定义

我们对显示行数做了扩展,css如下 

pre {
  position: relative;
  background-color: #fafafa;
  font-size: 14px;
  padding: 8px 8px 0px 8px;
  overflow: hidden;
  border: 1px solid #ccc;
}
 
code.hljs {
  background-color: #fafafa !important;
  line-height: 22px;
  padding: 0 0 0.5em 2.2em !important;
  white-space: unset;
}
 
.pre-numbering {
  position: absolute;
  top: 8px;
  left: 0;
  width: 30px;
  border-right: 1px solid #c5c5c5;
  background-color: #fafafa;
  text-align: center;
  line-height: 22px;
}
 
.pre-numbering li {
  list-style: none;
  color: #383a42;
  font-size: 14px;
}

行数以及背景显示样式可以根据自己的需求自定义

注意点: 

设置行数样式中,有人反应高亮的代码死活就是错位显示,正常没有库样式覆盖pre参照以上样式基本没问题,如果引入其他css库覆盖可能是pre下面的code设置了white-space: pre-wrap;换行导致错位展示问题,重点排查样式覆盖问题。

4.html中使用

<highlightjs language='javascript' code="var x = 5;" />

如果你到了这一步,那代表你使用highlight实现的代码块样式功能完美实现啦!恭喜恭喜!

总结

prismjs和highlight.js两个插件感觉都很不错,个人比较喜欢prismjs,当然萝卜青菜各有所爱,大家根据自己的爱好选择即可。

到此这篇关于Vue3实现代码高亮的两种方法(prismjs和highlight.js)的文章就介绍到这了,更多相关Vue3 prismjs和highlight.js代码高亮内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue使用vue-area-linkage实现地址三级联动效果的示例

    Vue使用vue-area-linkage实现地址三级联动效果的示例

    很多时候我们需要使用地址三级联动,即省市区三级联动,这篇文章主要介绍了Vue使用vue-area-linkage实现地址三级联动效果的示例,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • 关于element-ui表头吸附问题的解决方案

    关于element-ui表头吸附问题的解决方案

    数据过多滑动表格的时候,看不到表头不知道对应的数据是什么,用户体验操作不友好,要改成表头固定住,所以本文给大家介绍了关于element-ui表头吸附问题的两个解决方案,需要的朋友可以参考下
    2024-01-01
  • vue项目打包成桌面快捷方式(electron)的方法

    vue项目打包成桌面快捷方式(electron)的方法

    本文主要介绍了vue项目打包成桌面快捷方式(electron)的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 前端(VUE)打包上线去除console.log解决方案

    前端(VUE)打包上线去除console.log解决方案

    这篇文章主要介绍了如何在前端项目中使用terser-webpack-plugin插件来删除代码中的console.log语句,以避免在正式环境中输出调试信息,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • 使用vue打包时vendor文件过大或者是app.js文件很大的问题

    使用vue打包时vendor文件过大或者是app.js文件很大的问题

    这篇文章主要介绍了使用vue打包时vendor文件过大或者是app.js文件很大问题的解决方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • 5个Vue3阻止事件冒泡的方法

    5个Vue3阻止事件冒泡的方法

    在 Vue3 项目开发中,事件冒泡经常会导致一些意想不到的问题,本文为大家整理了五个Vue3中阻止事件冒泡的方法,希望对大家有一定的帮助
    2024-11-11
  • vue 输入电话号码自动按3-4-4分割功能的实现代码

    vue 输入电话号码自动按3-4-4分割功能的实现代码

    这篇文章主要介绍了vue 输入电话号码自动按3-4-4分割功能的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • vue 项目地址去掉 #的方法

    vue 项目地址去掉 #的方法

    vue 项目往往会搭配 vue-router 官方路由管理器,它和 vue.js 的核心深度集成,让构建单页面应用变得易如反掌。这篇文章主要介绍了vue 项目地址去掉 #的方法,需要的朋友可以参考下
    2018-10-10
  • vue3项目中配置sass,vite报错Undefined mixin问题

    vue3项目中配置sass,vite报错Undefined mixin问题

    这篇文章主要介绍了vue3项目中配置sass,vite报错Undefined mixin问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Vue中localStorage的用法和监听localStorage值的变化

    Vue中localStorage的用法和监听localStorage值的变化

    这篇文章主要介绍了Vue中localStorage的用法和监听localStorage值的变化,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04

最新评论