news 2026/4/22 0:53:42

Vue3项目实战:5分钟搞定Highlight.js代码高亮(附常见语言配置)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue3项目实战:5分钟搞定Highlight.js代码高亮(附常见语言配置)

Vue3项目实战:5分钟搞定Highlight.js代码高亮(附常见语言配置)

在Vue3项目中实现代码高亮显示是提升技术文档、博客或教学应用体验的关键细节。Highlight.js作为轻量级语法高亮工具,配合Vue3的插件系统,能快速实现专业级的代码展示效果。本文将手把手带你完成从零集成到多语言配置的全流程,解决实际开发中的版本选择、样式定制等核心问题。

1. 环境准备与基础安装

首先确保你的Vue3项目已经初始化完成。我们推荐使用pnpm作为包管理器(当然yarn或npm也同样适用),它能显著提升依赖安装效率。打开终端,执行以下命令安装核心依赖:

pnpm add highlight.js@11 @highlightjs/vue-plugin@2

这里需要特别注意版本匹配问题:

  • Vue3必须使用@highlightjs/vue-plugin的2.x版本
  • highlight.js当前稳定版本为11.x,与Vue3插件完全兼容

常见踩坑点:很多开发者误装1.x版本的vue-plugin,这会导致Vue3项目运行时报错。如果不慎安装错误版本,先执行pnpm remove @highlightjs/vue-plugin再重新安装正确版本。

2. 核心集成方案

在项目入口文件(通常是main.ts或main.js)中,我们需要完成三个关键步骤:

  1. 导入基础样式(推荐stackoverflow-light主题)
  2. 按需注册需要的编程语言
  3. 挂载Vue插件

以下是完整的配置示例:

// 样式导入(二选一) import 'highlight.js/styles/stackoverflow-light.css' // 浅色主题 // import 'highlight.js/styles/stackoverflow-dark.css' // 深色主题 // 核心库与插件 import hljs from 'highlight.js/lib/core' import hljsVuePlugin from '@highlightjs/vue-plugin' // 按需语言导入(示例包含6种常见语言) import javascript from 'highlight.js/lib/languages/javascript' import typescript from 'highlight.js/lib/languages/typescript' import java from 'highlight.js/lib/languages/java' import sql from 'highlight.js/lib/languages/sql' import xml from 'highlight.js/lib/languages/xml' import bash from 'highlight.js/lib/languages/bash' // 语言注册 hljs.registerLanguage('javascript', javascript) hljs.registerLanguage('typescript', typescript) hljs.registerLanguage('java', java) hljs.registerLanguage('sql', sql) hljs.registerLanguage('xml', xml) hljs.registerLanguage('bash', bash) // Vue挂载 const app = createApp(App) app.use(hljsVuePlugin) app.mount('#app')

3. 组件化实战应用

集成完成后,我们可以在任意Vue组件中使用<highlightjs>标签。下面是一个带语言切换功能的增强型组件示例:

<template> <div class="code-container"> <div class="language-selector"> <select v-model="currentLanguage" @change="updateCode"> <option v-for="lang in languageOptions" :key="lang.value" :value="lang.value" > {{ lang.label }} </option> </select> </div> <highlightjs :language="currentLanguage" :code="currentCode" class="code-block" /> </div> </template> <script setup> import { ref } from 'vue' // 语言选项配置 const languageOptions = [ { value: 'javascript', label: 'JavaScript' }, { value: 'typescript', label: 'TypeScript' }, { value: 'java', label: 'Java' }, { value: 'sql', label: 'SQL' }, { value: 'bash', label: 'Bash' } ] // 示例代码库 const codeSamples = { javascript: `const greet = (name) => { console.log(\`Hello \${name}!\`) }`, typescript: `interface User { id: number name: string } const getUser = (id: number): User => ({ id, name: 'Test' })`, java: `public class Main { public static void main(String[] args) { System.out.println("Hello World"); } }`, sql: `SELECT users.name, orders.total FROM users JOIN orders ON users.id = orders.user_id WHERE orders.created_at > NOW() - INTERVAL '7 days'`, bash: `#!/bin/bash for file in *.txt; do mv "$file" "${file%.txt}.md" done` } const currentLanguage = ref('javascript') const currentCode = ref(codeSamples.javascript) const updateCode = () => { currentCode.value = codeSamples[currentLanguage.value] } </script> <style scoped> .code-container { border: 1px solid #eee; border-radius: 8px; overflow: hidden; } .language-selector { padding: 8px 12px; background: #f5f5f5; border-bottom: 1px solid #eee; } select { padding: 4px 8px; border-radius: 4px; border: 1px solid #ccc; } .code-block { margin: 0; padding: 12px; font-family: 'Fira Code', monospace; } </style>

4. 高级配置与优化技巧

4.1 主题定制方案

Highlight.js提供了数十种内置主题,只需替换导入的样式文件即可切换:

// 其他流行主题选择 import 'highlight.js/styles/github.css' // GitHub风格 import 'highlight.js/styles/atom-one-dark.css' // Atom暗色主题 import 'highlight.js/styles/vs2015.css' // VS2015风格

如需深度自定义,可以直接覆盖CSS变量:

/* 在全局样式中添加 */ .hljs { --hljs-bg: #f8f8f8; --hljs-color: #333; background: var(--hljs-bg); color: var(--hljs-color); } .hljs-keyword { color: #d73a49; } .hljs-string { color: #032f62; }

4.2 性能优化策略

对于大型项目,建议采用以下优化方案:

  1. 动态语言加载:只在需要时加载语言包
const loadLanguage = async (lang) => { const module = await import(`highlight.js/lib/languages/${lang}`) hljs.registerLanguage(lang, module.default) }
  1. CDN加速方案(适用于静态站点):
<!-- 在public/index.html中添加 --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/stackoverflow-light.min.css" > <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/highlight.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/languages/javascript.min.js"></script>
  1. 按需打包配置(vite示例):
// vite.config.js export default defineConfig({ optimizeDeps: { include: [ 'highlight.js/lib/core', 'highlight.js/lib/languages/javascript', // 其他需要预构建的语言 ] } })

4.3 Markdown集成方案

如果你使用Markdown编写文档,可以通过marked.js与highlight.js配合实现自动高亮:

import marked from 'marked' import hljs from 'highlight.js' marked.setOptions({ highlight: function(code, lang) { if (lang && hljs.getLanguage(lang)) { return hljs.highlight(lang, code).value } return hljs.highlightAuto(code).value } }) const htmlContent = marked(` \`\`\`javascript function test() { return "Hello World" } \`\`\` `)

5. 常见问题解决方案

Q1:某些语言高亮效果不正常?

  • 确认是否正确注册语言:hljs.registerLanguage('python', python)
  • 检查语言名称是否与官方文档一致(区分大小写)

Q2:如何扩展自定义语言?

  1. 创建语言定义文件(如myLang.js
  2. 实现语言语法规则
  3. 通过registerLanguage注册

Q3:行号显示功能实现推荐使用css计数器方案:

.hljs { counter-reset: line; } .hljs .line::before { counter-increment: line; content: counter(line); display: inline-block; width: 2em; margin-right: 1em; color: #999; text-align: right; }

配合代码预处理:

const codeWithLines = code.split('\n') .map(line => `<span class="line">${line}</span>`) .join('\n')

Q4:SSR兼容性问题在Nuxt等SSR框架中使用时,需确保只在客户端执行:

onMounted(() => { if (process.client) { const hljs = require('highlight.js') // 初始化逻辑 } })
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 0:53:23

别再被VS的C26432警告烦了!手把手教你把老旧的#define宏改成constexpr

彻底告别C26432警告&#xff1a;现代C中constexpr替代#define的完整指南 每次打开Visual Studio的旧项目&#xff0c;那个烦人的C26432警告就像个不请自来的客人——"建议使用constexpr而非#define"。这不仅仅是IDE的唠叨&#xff0c;而是现代C给我们的一剂良药。让我…

作者头像 李华
网站建设 2026/4/22 0:51:18

LibreVNA完全指南:从入门到精通的开源矢量网络分析仪使用教程

LibreVNA完全指南&#xff1a;从入门到精通的开源矢量网络分析仪使用教程 【免费下载链接】LibreVNA 100kHz to 6GHz 2 port USB based VNA 项目地址: https://gitcode.com/gh_mirrors/li/LibreVNA LibreVNA是一款功能强大的开源矢量网络分析仪&#xff0c;覆盖100kHz至…

作者头像 李华
网站建设 2026/4/22 0:47:25

Windows下Nacos启动报UnknownHostException?别慌,这3种方法帮你5分钟搞定

Windows下Nacos启动报UnknownHostException的实战解决方案 刚接触Nacos的开发者常常会在Windows环境下遇到一个令人头疼的错误——UnknownHostException: jmenv.tbsite.net。这个错误通常出现在初次启动Nacos时&#xff0c;让原本兴奋的心情瞬间跌入谷底。别担心&#xff0c;这…

作者头像 李华
网站建设 2026/4/22 0:44:58

杰理之 固件加密介绍【篇】

一般固件使用key文件方式加密&#xff0c;带key的芯片只有加入key文件编译后的下载文件才能下载&#xff0c;所以下载程序报key错误情况下&#xff0c;请加入方案商的key文件编译后生成新的下载文件后下载。

作者头像 李华
网站建设 2026/4/22 0:43:38

车规级容器启动慢?内存泄漏难复现?Docker 27车载环境诊断工具链全公开,含19个真实ECU日志分析模板

第一章&#xff1a;Docker 27车载容器部署的核心挑战与演进背景随着智能网联汽车向SOA&#xff08;面向服务架构&#xff09;深度演进&#xff0c;车载系统对轻量、可复用、可灰度升级的软件交付能力提出严苛要求。Docker 27作为首个专为车规级边缘场景优化的容器运行时版本&am…

作者头像 李华