hljs识别不了代码类型

487 阅读1分钟

问题

使用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;`) //看输出来语言类型是什么