本文摘自PHP中文网,作者青灯夜游,侵删。
本篇文章给大家介绍一下nodejs如何在控制台打印高亮代码。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。当代码运行报错时,我们会打印错误,错误中有堆栈信息,可以定位到对应的代码位置。但有的时候我们希望能够更直接准确的打印报错位置的代码。【推荐学习:《nodejs 教程》】
比如这样:
这个可以使用 @babel/code-frames 来做到:
1 2 3 4 5 6 7 8 9 10 11 |
|
有没有感觉比较神奇,它是怎么做到的打印出上面的代码格式的(code frame)?
本文我们就来探究下原理。
主要会解答三个问题:
- 如何打印出标记相应位置代码的 code frame(就是上图的打印格式)
- 如何实现语法高亮
- 如何在控制台打印颜色
如何打印 code frame
我们先不管高亮,实现这样的格式的打印:
有啥思路没?
其实也比较容易想到,传入了源代码、标记开始和结束的行列号,那么我们就能够计算出显示标记(marker)的行是哪些,以及这些行的哪些列,然后依次对每一行代码做处理,如果本行没有标记则保持原样,如果本行有标记的话,那么就在开始打印一个 marker “>”
,并且在下面打印一行 marker "^"
,最后一个标记行还要打印错误信息。
我们来看一下 @babel/code-frame 的实现:
首先,分割字符串成每一行的数组,然后根据传入的位置计算出 marker 所在的位置。
比如图中第二行的第 1 到 12 列,第三行的 0 到 5 列。
然后对每一行做处理,如果本行有标记,则拼成 marker + gutter(行号) + 代码的格式,下面再打印一行 marker,最后的 marker 行打印 message。没有标记不处理。
这样最终拼出的就是这样的 code frame:
我们实现了 code frame 的拼接,暂时忽略了高亮,那么怎么做语法高亮呢?
如何实现语法高亮
实现语法高亮需要理解代码,但是如果只是高亮,词法分析就足够了。babel 也是这么做的,@babel/highlight 包里面完成了高亮代码的逻辑。
相关阅读 >>
html5+nodejs实现websocket即时通讯的示例代码分享
更多相关阅读请进入《nodejs》频道 >>
Vue.js 设计与实现 基于Vue.js 3 深入解析Vue.js 设计细节
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者