【Node】常用的全局变量与 Inspect 调试

32次阅读

共计 3812 个字符,预计需要花费 10 分钟才能阅读完成。

一、全局变量
在 Node 中常用的全局方法有 CommonJS、Buffer、process、console、timer 等,这些方法不需要 require 引入 API 就可以直接使用。
如果希望有属性或方法可以“全局使用”,那就将它挂载在 Node 的 global 对象上:
global.gNum = 300
console.log(gNum); // 300
在 Node 中所有模块都可以使用这些全局变量,以下就介绍 Node 中的全局变量
二、CommonJS 模块
Node CommonJS 模块规范根据实现了 module、exports 和 require 模块机制。Node 对每个文件都被进行了模块封装,每个模块有自己的作用域,如在 debug 时看到的:
(function (exports, require, module, __filename, __dirname) {
// some code
});
模块机制中的 __dirname、__filename、exports、module、require() 这些变量虽然看起来是全局的,但其实它们仅存在于模块范围。需要注意的几点是:

模块内部 module 变量代表模块本身
模块提供 require() 方法引入外部模块到当前的上下文中

module.exports 属性代表模块对外接口,默认的快捷方式 exports

简单的使用方式如下:
/* common_exports.js */
exports.num = 100
exports.obj = {
a : 200
}
exports = {
count : 300
}

/* common_require.js */
const mod = require(‘./common_exports’)
console.log(mod) // {num: 100, obj: { a: 200} }
console.log(mod.count) // undefined
注意到上例中的 mod.count 为 undefined,这是因为 exports 只是 module.exports 的引用,可以给 exports 添加属性,但不能修改 exports 的指向。
更深入的了解模块机制可以看【Node】前后端模块规范与模块加载原理

三、process 进程对象
process 包含了进程相关的属性和方法,Node 的 process 文档 中的内容特别多,列举几个常用
3.1 argv 启动参数
Node 进程启动时传递的参数都在 process.arg 数组中:
// process.js
const {argv , execPath} = process

argv.forEach((val, index) => {
console.log(`${index}: ${val}`)
})
console.log(execPath)
可以在执行 process.js 时传递其他参数,这些参数都会保存在 argv 中:
$ node apiTest/process.js one=1 –inspect –version
0: /usr/local/bin/node
1: /Users/mobike/Documents/webProjects/testNode/apiTest/process.js
2: one=1
3: –inspect
4: –version
/usr/local/bin/node
process.argv 第一个参数就是 process.execPath,即调用执行程序 Node 的路径,第二个参数时被执行的 JS 文件路径,剩下的就是自定义参数。
3.2 env 环境对象
process.env 是包含运行环境各种参数的对象,可以直接输出 env 查看所有参数信息,也可以输出某个属性:
const {env} = process.env
console.log(env.PATH) // /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/Documents/webProjects/testNode/node_modules/.bin
console.log(env.SHELL) // /bin/zsh
在 webpack 打包过程中常用 process.env.NODE_ENV 判断生产环境或开发环境,process.env 是没有 NODE_ENV 这个属性的,你可以在系统环境变量中配置,也可以在项目程序直接设置 process.env.NODE_ENV=‘dev’。
3.3 cwd 当前目录
process.cwd() 方法返回 Node.js 进程的当前工作目录,和 Linus 命令 $ pwd 功能一样:
// process.js
console.log(process.cwd()) // /Users/Documents/webProjects/testNode
$ node process.js
/Users/WebstormProjects/testNode
$ pwd
/Users/WebstormProjects/testNode

四、Timers 异步
Node 中的计时器方法与 Web 浏览器中的 JS 计时器类似,但内部实现是基于 Node 的 Event Loop。Node 中的计时器有 setImmediate()、setTimeout()、setInterval()。
在 Node 中有一个轻量级的 process.nextTick() 异步方法,它是在当前事件队列结束时调用,setImmediate() 是当前 Node Event Loop 结束时立即执行,那执行顺序有什么区别呢?
下面举例说明 process.nextTick(fn) 与 setImmediate(fn) 与 setTimeout(fn,0) 之间的区别:
// timer.js
setImmediate(()=>{
console.log(“setImmediate”)
});

setTimeout(()=>{
console.log(“setTimeout 0”)
},0);

setTimeout(()=>{
console.log(“setTimeout 100”)
},100);

process.nextTick(()=>{
console.log(“nextTick”)
process.nextTick(()=>{
console.log(“nextTick inner”)
})
});
看下执行结果:
$ node timer.js
nextTick
nextTick inner
setTimeout 0
setImmediate
setTimeout 100
process.nextTick() 中的回调函数最快执行,因为它将异步事件插入到当前执行队列的末尾,但如果 process.nextTick() 中的事件执行时间过长,后面的异步事件就被延迟。
setImmediate() 执行最慢,因为它将事件插入到下一个事件队列的队首,不会影响当前事件队列的执行。当 setTimeout(fn, 0) 是在 setImmediate() 之前执行。
以上就是 Node 全局变量的概述,其他的 API 或内置模块都需要·require(‘xxx’) 引入使用,我们可以在 nodejs.cn 中查看关于 Global API 更详细的介绍。
五、Debug 调试方法
Node 的调试方法有很多,主要分为安装 node-inspect 包调试、用 Chrome DevTools 调试和 IDE 调试,可以在官网的 Docs Debugging Guide 查看安装方法。
下面介绍使用 Chrome DevTools 调试的方法,首先安装 Chrome Extension NIM,打开 Inspect 入口页面 chrome://inspect
写一个简单 debug.js 测试文件:
// apiTest/debug.js
console.log(“this is debug test”)
function test () {
console.log(“hello world”)
}
test()
使用 node –inspect-brk 来启动脚本,-brk 相当于在程序入口前加一个断点,使得程序会在执行前停下来
$ node –inspect-brk apiTest/debug.js
Debugger listening on ws://127.0.0.1:9229/44b5d11e-3261-4090-a18c-2d811486fd0a
For help, see: https://nodejs.org/en/docs/inspector
在 chrome://inspect 中设置监听端口 9229(默认),就可以看到可以 debug 的页面:
(function (exports, require, module, __filename, __dirname) {
console.log(“this is debug test”)
function test () {
console.log(“hello world”)
}
test()
});
如果我们使用 node –inspect 来启动脚本,那整个代码直接运行到代码结尾,无法进行调试,但此时 Node 还进程没有结束,所以可以在 http://127.0.0.1:9229/json/list 查询 devtoolsFrontendUrl,复制此 Url 到 Chrome 上进行调试。
看到使用 Chrome DevTools 的调试方法还是比较复杂的,一些 IDE 都支持直接断点调试,推荐 WebStorm、VScode。

接下来会整理学习 Node 的基础 API、项目构建、网络编程、异步编程等知识点,加油呢少年~

正文完
 0