prismjs不支持html,Vue 中使用 prismjs 代码高亮组件

1d10b520a4a605a5e449b244b60b1c8a.png

代码高亮是我一直以来都在纠结的问题,市面上的高亮组件特别繁多,我用过例如 syntaxhighlight、highlight.js 等组件,觉得都不太好用,要么是样式不好看、支持的语法不齐全,要么就是使用太过麻烦等等。

今天经过我的仔细甄选后,终于在 gayhub 上发现了这个宝藏:PrismJS

进入它的官网,你会发现它所支持的几款主题,我非常喜欢 OKAIDIA 这个主题,代码风格如下:

namespace App\Exceptions;

use Exception;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler

{

/**

* A list of the inputs that are never flashed for validation exceptions.

*

* @var array

*/

protected $dontFlash = [

'password',

'password_confirmation',

];

public function render($request, Exception $exception)

{

return parent::render($request, $exception);

}

}

是不是有种似曾相识的感觉?没错,很多社区都在用这个组件,例如

终于等到你~嘻嘻,下面开始正文

在 Vue 项目中安装及使用

直接使用 npm 安装 prismjs 及其 babel:

npm install prismjs

npm install babel-plugin-prismjs

接着在 .babelrc 中配置语言及主题:

"plugins": [

[

"prismjs",

{

"languages": ["html", "css", "javascript", "php", "dart", "bash", "nginx", "sql"],

"theme": "okaidia"

}

]

]

以上是我所用的语言及暗黑主题,可以根据自己的需求自定义,更多语言支持

配置完毕后,在组件中引入 JS:

import Prism from 'prismjs';

引入 CSS:

code[class*="language-"],

pre {

color: #f8f8f2;

background: none;

text-shadow: 0 1px rgba(0, 0, 0, 0.3);

font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;

font-size: 1em;

text-align: left;

white-space: pre;

word-spacing: normal;

word-break: normal;

word-wrap: normal;

line-height: 1.5;

-moz-tab-size: 4;

-o-tab-size: 4;

tab-size: 4;

-webkit-hyphens: none;

-moz-hyphens: none;

-ms-hyphens: none;

hyphens: none;

}

/* Code blocks */

pre {

padding: 1em;

margin: .5em 0;

overflow: auto;

border-radius: 0.3em;

}

:not(pre) > code[class*="language-"],

pre {

/*background: #272822;*/

background: #384548;

}

/* Inline code */

:not(pre) > code[class*="language-"] {

padding: .1em;

border-radius: .3em;

white-space: normal;

}

.token.comment,

.token.prolog,

.token.doctype,

.token.cdata {

color: slategray;

}

.token.punctuation {

color: #f8f8f2;

}

.namespace {

opacity: .7;

}

.token.property,

.token.tag,

.token.constant,

.token.symbol,

.token.deleted {

color: #ffa07a;

}

.token.boolean,

.token.number {

color: #ae81ff;

}

.token.selector,

.token.attr-name,

.token.string,

.token.char,

.token.builtin,

.token.inserted {

color: #a6e22e;

}

.token.operator {

color: #00e0e0;

}

.token.entity,

.token.url,

.language-css .token.string,

.style .token.string,

.token.variable {

color: #f8f8f2;

}

.token.atrule,

.token.attr-value,

.token.function,

.token.class-name {

color: #e6db74;

}

.token.keyword {

color: #66d9ef;

}

.token.regex,

.token.important {

color: #fd971f;

}

.token.important,

.token.bold {

font-weight: bold;

}

.token.italic {

font-style: italic;

}

.token.entity {

cursor: help;

}

我对官方的 css 内容做了部分更改,使代码看起来不是那么刺眼,如果你不喜欢我的优化,可以出门左转去官网下载。

即时渲染代码块

正常情况下,我们肯定都是想在编辑器中输入完代码就能渲染出效果,但是编辑器也是各式各样的,也基本不可能内置这个高亮组件,所以我接下来讲解一种可以在任意编辑器中进行即时渲染的做法:那就是借助 MutationObserver 这个强大的 DOM3 API。

无论是 markdown 编辑器还是富文本编辑器,编辑器页面中呈现出来的都有一份 HTML 代码,我们就用 MutationObserver 来监听 HTML 的变化即可,每次发生变化就立刻让 prismjs 对所有 code 标签里的内容重新渲染即可。

具体实现如下:

const languages = ['html', 'css', 'js', 'php', 'dart', 'bash', 'nginx', 'sql'],

content = document.querySelector('.v-show-content'),

codeNodes = content.getElementsByTagName('code');

this.observer = new MutationObserver(() => {

let nodesLength = codeNodes.length, codeNode, language;

while (nodesLength--) {

codeNode = codeNodes[nodesLength];

language = codeNode.className.split('-')[1];

if (languages.includes(language)) {

codeNode.innerHTML = Prism.highlight(codeNode.innerText, Prism.languages[language], language);

}

}

this.html = content.innerHTML;

this.text = content.innerText;

});

this.observer.observe(content, {

childList: true,

characterData: true,

});

以上代码,当 .v-show-content 这个元素的内容发生改变时,就会触发 MutationObserver 的回调函数。

在回调函数中,我对所有 code 标签进行了遍历,每次循环都会判断语言是否支持,支持就直接渲染。

在回调函数的最后部分,渲染完毕将 HTML 内容重新赋值给编辑器组件,提供给外部使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,我们需要检查一下是否正确引入了Vue.jsVue组件。检查Vue.js是否引入成功,可以通过在控制台输入Vue来验证是否存在Vue对象来判断。如果不存在可以尝试重新引入Vue.js文件,确保引入路径正确。 其次,我们需要确定 Vue 组件是否正确引入,并写入 Vue 实例。可以在控制台输入组件名称查看是否正确引入,并查看 Vue 实例是否注册了该组件。 如果组件正确引入和注册,但仍未正常显示,那么可能出现了组件渲染问题。可能是组件模板代码出现错误,或者组件数据或属性有误,也可能是组件样式出现问题。我们可以通过查看控制台的错误信息来定位具体的错误位置,并修复问题。 最后,我们需要确保我们的 Vue 实例已经挂载至 HTML 的某个元素,且该元素正确存在。在 Vue 实例的 el 属性定义的元素应与 HTML 文件实际存在的元素的 id 或 class 相匹配。如果 id 或 class 不存在或与 Vue 实例不匹配,那么组件将无法正常渲染。 总之,在使用 Vue.js 编写组件过程,我们需要注重细节,仔细检查代码,排除一切可能出现的问题,保证 Vue 组件能够正常渲染,显示在页面上。 ### 回答2: 在使用HTML引入Vue组件时,有可能会出现组件没有正确显示的情况。这种情况可能有多种原因,下面列出几种可能的原因和解决方法: 1. 检查Vue的版本:如果Vue组件使用较新版本的Vue框架编写的,确保使用Vue版本要与组件指定的版本相同。如果Vue版本不一致,可能会出现不兼容的问题。 2. 检查组件名:在HTML引入组件时,必须使用正确的组件名。如果组件名不正确,Vue框架就无法识别组件,因此无法正确渲染组件。 3. 检查组件路径:在HTML引入组件时,必须使用正确的组件路径。如果路径不正确,Vue框架就无法找到组件文件,因此无法正确渲染组件。 4. 检查模板内容:在Vue组件,模板是用来渲染组件的关键。如果模板存在错误,可能会导致组件无法正常渲染。因此,应该仔细检查组件模板内容,确保其正确无误。 5. 检查组件数据:在Vue组件,数据是用来驱动组件渲染的关键。如果组件数据出现错误或缺失,可能会导致组件无法正确渲染。因此,应该仔细检查组件数据,确保其正确无误。 总的来说,在使用HTML引入Vue组件时,需要仔细检查组件名、组件路径、组件模板内容、组件数据等关键因素,以确保组件能够正确渲染。如果还是出现问题,可以使用Vue框架提供的开发者工具进行调试,查找并解决问题。 ### 回答3: 如果在HTML页面使用Vue组件时没有报错但是组件没有显示出来,那么可能有以下几个原因: 1.没有正确引入Vue.js库 在使用Vue组件之前,需要先在HTML页面正确引入Vue.js库。如果没有正确引入,那么虽然没有报错,但是Vue组件依旧无法渲染显示。 可以在HTML页面添加以下代码引入Vue.js库: ``` <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> ``` 或者使用Vue.js的CDN链接: ``` <script src="https://cdn.jsdelivr.net/npm/vue"></script> ``` 2.没有正确定义Vue实例 在使用Vue组件之前,需要先定义Vue实例。如果没有正确定义,那么虽然没有报错,但是Vue组件依旧无法渲染显示。 可以在HTML页面添加以下代码定义Vue实例: ``` var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' } }) ``` 其`'#app'`表示Vue实例要挂载的元素,`data`表示数据对象。 3.没有正确引入组件使用Vue组件之前,需要先正确引入组件。如果没有正确引入,那么虽然没有报错,但Vue组件依旧无法渲染显示。 可以在HTML页面添加以下代码引入组件: ``` Vue.component('my-component', { template: '<div>A custom component!</div>' }) ``` 其`'my-component'`是组件的名称,`template`是组件的DOM模板。 4.没有正确使用组件 在引入组件后,需要在Vue实例使用组件。如果没有正确使用组件,那么组件依旧无法渲染显示。 可以在Vue实例添加以下代码使用组件: ``` Vue.component('my-component', { template: '<div>A custom component!</div>' }) var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' }, components: { 'my-component': myComponent } }) ``` 其`'components'`表示Vue实例使用组件,`'my-component'`是组件的名称,`myComponent`表示引入的组件对象。 综上所述,如果在HTML页面使用Vue组件没有报错但是组件没有显示出来,可以先检查是否正确引入Vue.js库、定义Vue实例、引入组件和正确使用组件。如果这些都没有问题,可以再尝试去检查组件代码问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值