Sukka 写前端、网络和基础设施时,习惯先把边界和代价摊开。把「给 Hexo 添加 Google Code Prettify | Sukka's Blog」整理成可落地的中文笔记:问题在哪、默认做法会踩什么坑、该怎么选。原站导航和广告已去掉。
问题从哪来
为了让「Suka」主题正如我在 Slogan 介绍的那样是一个「Powerful」的主题,所以除了内置 Prism 代码高亮以外,至少还应该内置 Google Code Prettify 代码高亮。
首先是把 Google Code Prettify 添加到 Hexo 主题之中。查看 Google Code Prettify 的 README 上面的教程,按照 Google 提供的方法 ,只需要引入一个主题 css 文件和一个 prettify.js 就行。 Google 打包了一个 Prettify 的默认主题和一个通用方案版本的 prettify.js 代码 供开发者下载 。解压以后丢进主题的 source 目录里。
常见做法为什么不够
为了主题的前端性能,所以我们只需要在文章页面(layout 为 post 的页面)引入文件。正好,Hexo 提供了这辅助函数 is_post() 判断当前页面的 layout,我们就不需要什么 if (page.layout === 'post') 了。所以可以直接用这样的代码完成 prettify.js 的按需加载。
<% if ( (is_post()) ) { %> <script src="<%- url_for('js/prettify.js') %>"></script> <% } %> 光光引入 prettify.js 并不能完成代码高亮,还要需要“激活”代码才能开始让 prettify 开始渲染代码。Google 推荐在 <body> 上绑定 onload 事件来调用 prettify,就像这样:
更稳的做法
< body onload = " PR . prettyPrint ( ) " > 这个方案显然很 dirty,而且 不符合规范 (虽然我这里引用的规范是我自己写的)。如果你在其它类似的给 Hexo 添加 Prettify 的教程上介绍的方法,无一例外使用了 $(document).ready() ,还有一些使用了 $(window).load(function() 。但是「Suka」主题并没有使用 jQuery,所以只能用 VanillaJS 的方法。而且,和 $(document).ready() 可以在一个页面里反复使用不同, window.onload 方法在一个页面里只允许使用一次。 我的方案更加简单粗暴。因为 HTML 中的 <script> 标签是按照顺序执行的,所以我可以在页面底部添加 <script> 标签调用 Prettify,在执行的时候已经可以确保所有 DOM Tree 都已经建立好、可以调用 Prettify 去遍历 DOM Node 了,并不需要等待 onload 事件发生。
但是,Prettify 并不是指定元素选择器的方式来就决定渲染哪一部分,Google Code Prettify 使用的元素选择器是 .prettyprint ,并需要添加 .linenums 作为行号。所以必须事先对 <pre> 标签带上这个 class。不过,我在为「Suka」主题添加 PrismJS 代码高亮的时候就是使用的 preprocess 的方案,通过在主题的 scripts 目录下编写了一段插件脚本、在执行 hexo s 或者 hexo g 的时候对代码进行预处理(打上 class)。到适配 Google Code Prettify 的时候,我不想再采用 preprocess 的方案了,我要用 JS 中遍历 <pre> 标签带上这两个 class。 在那些常见的为 Hexo 添加 Prettify 的教程中,他们一般会教你使用 $('pre').addClass('prettyprint linenums'); 方法。但是同样因为我没有用 jQuery,我需要使用 VanillaJS 的方法
落地检查
for ( var i = 0 ; i < ( document . querySelectorAll ( 'pre' ) || [ ] ) . length ; i += 1 ) { document . querySelectorAll ( 'pre' ) [ i ] . classList . add ( 'prettyprint' ) ; document . querySelectorAll ( 'pre' ) [ i ] . classList . add ( 'linenums' ) ; } 虽然看起来更长,但是这是纯原生的 JS 代码方法,而且 It works。只需要在这段代码之后再添加 prettyPrint(); 渲染就行了。最终代码就像这样:
< script > var prettifyel = document . querySelectorAll ( 'pre' ) ; for ( var i = 0 ; i < ( prettifyel || [ ] ) . length ; i += 1 ) { prettifyel [ i ] . classList . add ( 'prettyprint' ) ; prettifyel [ i ] . classList . add ( 'linenums' ) ; } prettyPrint ( ) ; </ script > 当然,因为 prettyPrint() 方法依赖 prettify.js ,所以需要把它放在其后,放在 is_post() 的判断的里面。
落地时建议先做的 5 件事
- 用自己的流量和设备测,不要只抄厂商推荐最小配置。
- DNS、CDN、代理分流先画清 Fake IP 和 Real IP 的边界。
- 前端性能看 CLS、白屏和重复渲染,而不是只看打包体积。
- 基础设施变更走 Git,能复现、能回滚。
- 结论写成可检查的清单:接口、超时、失败样本、回滚版本。
和智能体产品怎么接
龙虾PRO做 OpenClaw 落地时,网络、DNS 和前端性能笔记最有用的是「边界」:哪一层该加速、哪一层不该假装智能。数字员工调用外部能力前,先把超时和失败路径写死。
本文侧重全链路风控方法论。落地时请用自身业务单据做回放验证,不要把示例阈值直接当生产策略。 相关:风控体检 · 方案资源
常见问题 FAQ
什么是AI智能系统?
「AI智能系统」可概括为:为了让「Suka」主题正如我在 Slogan 介绍的那样是一个「Powerful」的主题,所以除了内置 Prism 代码高亮以外,至少还应该内置 Google Code Prettify 代码高亮。 本文从定义、方法与实践要点展开说明。
为什么要关注AI智能系统?
关注AI智能系统,是因为它直接影响效率、风险与可复制性。文中指出:为了让「Suka」主题正如我在 Slogan 介绍的那样是一个「Powerful」的主题,所以除了内置 Prism 代码高亮以外,至少还应该内置 Google Code Prettify 代码高亮。
如何落地AI智能系统?有哪些关键步骤?
建议按以下路径推进AI智能系统:1) 用自己的流量和设备测,不要只抄厂商推荐最小配置。;2) DNS、CDN、代理分流先画清 Fake IP 和 Real IP 的边界。;3) 前端性能看 CLS、白屏和重复渲染,而不是只看打包体积。;4) 基础设施变更走 Git,能复现、能回滚。;5) 结论写成可检查的清单:接口、超时、失败样本、回滚版本。。细节见正文对应章节。
AI智能系统适合哪些人或团队?
AI智能系统更适合:产品/技术负责人、运营与增长团队、需要落地智能体或自动化的中小团队、关注「AI智能系统」方向的读者。若你只需要单次聊天式问答,可先读概念;若要上生产,请重点看步骤、权限与风控相关段落。
关于「问题从哪来」,本文给出了什么结论?
在「问题从哪来」部分,要点是:le Code Prettify 的 README 上面的教程,按照 Google 提供的方法 ,只需要引入一个主题 css 文件和一个 prettify.js 就行。 Google 打包了一个 Prettify 的默认主题和一个通用方案版本的 prettify.js 代码 供开发者下载 。解压以后丢进主题的 source 目录里。 常见做法为什么不够 为了主题的前端性能,所以我们只需要在文章页面(layout 为 post 的页面)引
关于「常见做法为什么不够」,本文给出了什么结论?
在「常见做法为什么不够」部分,要点是:(虽然我这里引用的规范是我自己写的)。如果你在其它类似的给 Hexo 添加 Prettify 的教程上介绍的方法,无一例外使用了 $(document).ready() ,还有一些使用了 $(window).load(function() 。但是「Suka」主题并没有使用 jQuery,所以只能用 VanillaJS 的方法。而且,和 $(document).ready() 可以在一个页面里反复使用不同, window.onload