详解nodejs在控制台打印高亮代码的方法


本文摘自PHP中文网,作者青灯夜游,侵删。

本篇文章给大家介绍一下nodejs如何在控制台打印高亮代码。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

当代码运行报错时,我们会打印错误,错误中有堆栈信息,可以定位到对应的代码位置。但有的时候我们希望能够更直接准确的打印报错位置的代码。【推荐学习:《nodejs 教程》】

比如这样:

1.png

这个可以使用 @babel/code-frames 来做到:

1

2

3

4

5

6

7

8

9

10

11

const { codeFrameColumns } = require('@babel/code-frame');

 

const res = codeFrameColumns(code, {

  start: { line: 2, column: 1 },

  end: { line: 3, column: 5 },

}, {

  highlightCode: true,

  message: '这里出错了'

});

 

console.log(res);

有没有感觉比较神奇,它是怎么做到的打印出上面的代码格式的(code frame)?

本文我们就来探究下原理。

主要会解答三个问题:

  • 如何打印出标记相应位置代码的 code frame(就是上图的打印格式)
  • 如何实现语法高亮
  • 如何在控制台打印颜色

如何打印 code frame

我们先不管高亮,实现这样的格式的打印:

2.png

有啥思路没?

其实也比较容易想到,传入了源代码、标记开始和结束的行列号,那么我们就能够计算出显示标记(marker)的行是哪些,以及这些行的哪些列,然后依次对每一行代码做处理,如果本行没有标记则保持原样,如果本行有标记的话,那么就在开始打印一个 marker “>”,并且在下面打印一行 marker "^",最后一个标记行还要打印错误信息。

我们来看一下 @babel/code-frame 的实现:

首先,分割字符串成每一行的数组,然后根据传入的位置计算出 marker 所在的位置。

比如图中第二行的第 1 到 12 列,第三行的 0 到 5 列。

3.png

然后对每一行做处理,如果本行有标记,则拼成 marker + gutter(行号) + 代码的格式,下面再打印一行 marker,最后的 marker 行打印 message。没有标记不处理。

4.png

这样最终拼出的就是这样的 code frame:

5.png

我们实现了 code frame 的拼接,暂时忽略了高亮,那么怎么做语法高亮呢?

如何实现语法高亮

实现语法高亮需要理解代码,但是如果只是高亮,词法分析就足够了。babel 也是这么做的,@babel/highlight 包里面完成了高亮代码的逻辑。

阅读剩余部分

相关阅读 >>

详解nodejs中的querystring模块

nodejs怎么运行js文件

浅谈nodejs关闭进程的方法

html5+nodejs实现websocket即时通讯的示例代码分享

nodejs设置node_env时发生错误怎么解决?

nodejs与javascript的区别

提示node应用性能的5个技巧

如何查看nodejs是否安装成功

了解nodejs中的模块载入

浅谈npm邮箱验证问题的解决方法

更多相关阅读请进入《nodejs》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...