背景:SE当前使用Google代码修饰库来突出显示语法。过去曾建议进行切换的可能性:


为什么StackOverflow不使用Highlight.js而不是Google-Code-Prettify?

切换到Highlight.js用于语法突出显示(由Highlight.js作者本人)

我想在2016年更新此讨论。这是对Highlight.js的独家报道:

太大

SE所服务的prettify当前版本为30.9kB(压缩后为12.7kB)。

highlight.js当前的默认cdnjs版本为42.0kB(17.5kB)压缩)。这包括一组默认语言,但是当然可以自定义。

它的速度更快


我在JSFiddle中进行了基本性能测试,以了解如何对于某些Ruby代码(来自Rails的文件)​​,prettify花费的时间是highlight.js的4倍,而prettify的作用是prettify。


/>
和使用Objective-C(PLCrashReporter的文件)的时间大约是原来的10倍:



它要好得多

> highlight.js支持的语言集比google-code-prettify大。 (请参见其中的一个演示。)

它生成的标签/类非常广泛,并且它们嵌套得很好,因此您可以使用CSS做一些很酷的事情,以形成一个非常漂亮的配色方案。 。

它可以检测嵌套的代码块(例如HTML内的CSS),并在同一代码段中正确突出显示这两种语言。

这里是一个简单的比较,您可以看到突出显示。 js理解嵌套的PHP,JS和CSS,并且比修饰词更了解关键字,内置函数等。





 demo='<!DOCTYPE html>\n<head>\n  <title><? echo "Hello $name!"; ?></title>\n\n  <style>\n    body {\n      width: 500px;  /* big enough */\n    }\n  </style>\n\n  <script type="application/javascript">\n    function someFunction() {\n      return true;\n      console.log("hello world!");\n    }\n  <'+'/script>\n\n<body>\n  <p class="something" id=\'12\'>Something</p>\n  <p class=something>Something</p>\n  <!-- comment -->\n  <p class>Something</p>\n  <p class="something" title="p">Something</p>\n</body>';

document.getElementById("prettify").innerText = demo;
document.getElementById("hljs").innerText = demo;

PR.prettyPrint();
hljs.highlightBlock(document.getElementById("hljs")); 

 pre { padding: 0.5em; background: #F0F0F0; }

/* prettify */
.prettyprint { color: #444; }
.str { color: #880000; }
.kwd { font-weight: bold; }
.com { color: #888888; }
.typ { color: #880000; }
.lit { color: #78A960; }
.tag { font-weight: bold; }
.atn { color: #bdb76b; }
.atv { color: #65b042; }
.dec { color: #3387CC; }

/* highlight.js styles */
.xml .css, .xml .javascript, .xml .php { opacity: 0.6; }
.hljs, .hljs-subst { color: #444; }
.hljs-tag .hljs-string { color: #65b042; }
.hljs-comment { color: #888888; }
.hljs-attr { color: #bdb76b; }
.hljs-keyword, .hljs-attribute, .hljs-selector-tag, .hljs-meta-keyword, .hljs-doctag, .hljs-name { font-weight: bold; }
.hljs-type, .hljs-string, .hljs-selector-id, .hljs-selector-class, .hljs-quote, .hljs-template-tag, .hljs-deletion { color: #880000; }
.hljs-title, .hljs-section { color: #880000; font-weight: bold; }
.hljs-regexp, .hljs-symbol, .hljs-variable, .hljs-template-variable, .hljs-link, .hljs-selector-attr, .hljs-selector-pseudo { color: #BC6060; }
.hljs-literal { color: #78A960; }
.hljs-number { color: #3B719A; }
.hljs-built_in, .hljs-bullet, .hljs-code, .hljs-addition { color: #397300; }
.hljs-meta { color: #1f7199; }
.hljs-meta-string { color: #4d99bf; }
.hljs-emphasis { font-style: italic; }
.hljs-strong { font-weight: bold; } 

 <script src="https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.3.0/highlight.min.js"></script>

<table>
  <tr><th><tt>google-code-prettify</tt></th><th><tt>highlight.js</tt></th></tr>
  <tr>
    <td><pre id="prettify" class="prettyprint"></pre></td>
    <td><pre id="hljs"></pre></td>
  </tr>
</table> 






它是积极开发的

Highlight.js的提交活动始终很高。美化的目的不是很多(尽管它还没有像某些人想象的那样完全消失)。当然,SE不可能一直都在更新,但是每次库更新时都可以带来更多的改进。

从2011年开始的比较中和本文中的这篇文章中都讨论了其他一些好处。

让我们去做吧!

鉴于存在Stack Overflow和其他SE网站以进行Q&A编程,良好的语法突出显示至关重要。如果这样做能改善每月4,800万访问者中每个人的用户体验,似乎值得进行投资,我敢肯定,只有随着一些新的(语法繁重的)功能的出现,这一点才能保持增长。多年来,社区对语法突出显示改进表现出了浓厚的兴趣……我只是希望时机成熟!

评论

现在该换衣服了。开始吧!

下周,我们将在每周一次的核心(Q&A)团队电话中审查这一想法。

太好了,谢谢@Haney。我(和许多其他人)期待听到所讨论的内容。 :-)

@jtbandes没问题。 PS:很好地使用Stack Snippet。 ;)

@Haney会随时与我们联系以寻求帮助,无论是有关GitHub的问题,还是通过电子邮件info@highlightjs.org

更新:仍在努力寻找时间进行审查,但是我们现在被项目所猛烈抨击。如果没有在接下来的几周里去看看,它将在本周晚些时候尝试到达它。

不过,现有语法荧光笔上CSS /颜色的变化很好;)

我不知道它在整个网络中有多普遍,但是在Code Golf上,我们在答案中广泛使用了语言标签,例如<!-全部语言:lang-ruby->。 Highlight.js仍然可以识别吗? (并不是说支持这种语法对我来说是一个大问题;这太好了。)

我不确定语言标记/提示是否是由SO专门实现的,还是内置于prettify中的。解析它们以通知hljs激活的方式可能并不难。

@AlexA。是的,highlight.js可以使用这些。我们有一个config选项,您可以在其中转储所有SO标签,我们将使用那些被识别为语言的标签来限制自动检测。实际上,它是专门为支持这种用例而设计的。

更新:团队在本周和下周正在调查和评估lib

@Haney很棒的新闻,谢谢您的更新!请同时测试matlab突出显示;)(一直以来都缺少对它的支持,有超过60k个问题)

@YaakovEllis我不知道是什么使比例尺偏向使用此库。奥德的答案似乎是一个非常令人信服的理由。

接下来的几周内将有一个官方帖子,其中将详细介绍转换原因和推出计划。

该博客文章,供参考:meta.stackexchange.com/questions/353983/…

#1 楼

我的测试结果令人失望-我们不会继续使用highlight.js作为Stack Overflow和其他网站的语法突出显示工具。

并不太大

是-我生成了一组自定义语言,以反映我们当前使用prettify支持的确切语言。未经压缩的文件为57kb,压缩后的文件大小为22kb,相比之下,用于整理的文件为42kb(压缩后为17.4kb)。每天至少有5kb的空间用于成千上万的请求(这不考虑css文件,而且highlight.js使用的css类名比美化用途长得多)。
这种大小的关注只会越来越大添加更多语言。完整的语言集将近500k(我不愿意用它来测试gzip)-添加更多的语言不是免费的。 />不是,不是在我的测试中-在本地计算机上的一些示例上使用highlight.js并比较性能(不要忘记-我们具有高度嵌套的DOM,并且许多“基准”都是在非常简单的页面-这并不表示Stack Overflow的性能。
在我的测试中,highlight.js的CPU时间是比美化的CPU时间高出2到4倍(在某些情况下,转换成> 120ms的差异)。实际上,稍后在Highlight.js中出现突出显示闪烁(代码从正常文本更改为突出显示文本)时,这一点就很明显了。
我还通过在突出显示调用周围使用console.time进行了测试-highlight.js的性能始终不如prettify。

好得多/积极开发

“更好”需要上下文-当然,它可以检测嵌套语言,是的,它有更多受支持的语言。但是这些功能需要付出一定的代价-它对我们来说更大,更慢-并且我们不愿意为此付出代价。
我不会与“积极开发”争论-是的。希望开发人员能够使它变得更小,更快,以至于我们能够用它代替漂亮的东西。动态添加语言-我们使用mathematica.se进行此操作,在其中我们为该站点添加了仅针对该网站的mathematica高亮显示(这是因为高亮显示文件很大且压缩效果不好-mathematica具有大量关键字)。

(目前)我们还没有这样做。
这些差异意味着我们目前不会继续使用highlight.js。
如果尺寸和性能该库将得到改进,我们可以找到一种动态添加语言的方法,我们可以再次进行测试,并可能替换prettify。

评论


感谢您给我们幽默和详细的答复。抱歉,它并没有成功-希望其中一些问题最终可以解决,但是我的希望不会太大。

– jtbandes
16年5月17日在16:03

感谢您的评价。确实,我们的头等大事是正确性,它的确以牺牲尺寸为代价。对于动态添加语言,完全可以通过在核心模块之后简单地包含