问题
使用hljs高亮代码结果发现不管什么类型代码都是一个黑色,这是因为hljs将你的代码识别为普通文本了,先从原理方面分析
工作原理
第一步识别类型
传参
hljs支持我们传language, code, autodetect这三个参数,language代表我们想要hljs识别成的语言,code是代码,autodetect代表我们是否想要hljs自动识别
注意:如果我们设置了language或者是autodetect,这里的代码仍旧不会出现效果,这是因为hljs内容并没有下载对应的语言库并不能识别该代码类型,但有人会说我使用npm下载了依赖包,包里面有不同的语言啊。这就像是游戏一样,有些模块你可以看到,但是你需要下载之后才能玩,hljs也是如何是好你需要先注册相应语言。
下面是hljs识别代码类型源码
highlighted() {
// no idea what language to use, return raw code
//如果我们单纯的传递language参数,不注册语言就会导致hljs不识别该语言
if (!this.autoDetect && !hljs.getLanguage(this.language)) {
console.warn(`The language "${this.language}" you specified could not be found.`);
this.unknownLanguage = true;
return escapeHTML(this.code);
}
let result = {};
if (this.autoDetect) {
//传递autoDetect参数,不注册语言也识别不了代码类型
result = hljs.highlightAuto(this.code);
this.detectedLanguage = result.language;
} else {
result = hljs.highlight(this.code, { language: this.language, ignoreIllegals: this.ignoreIllegals });
this.detectedLanguage = this.language;
}
return result.value;
}
第二步分割重组
hljs会将我们传递的代码按照它所识别的类型去分割代码中的特殊变量,将特殊变量加上标签放入原代码中,并设置不同标签的颜色
解决方法
给hljs注册语言库,例如javascript
import javascript from 'highlight.js/lib/languages/javascript';
hljs.registerLanguage('javascript', javascript);
hljs判断语言库方法
hljs.highlightAuto(`let a = 1;`) //看输出来语言类型是什么