文章插图
一、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-2d811486fd0aFor 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 中常用的全局方法有 CommonJS、Buffer、process、console、timer 等,这些方法不需要 require引入 API 就可以直接使用 。
如果希望有属性或方法可以*“全局使用”*,那就将它挂载在 Node 的global对象上:
global.gNum = 300console.log(gNum); // 300在 Node 中所有模块都可以使用这些全局变量,以下就介绍 Node 中的全局变量
2.1 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的指向 。
2.2 process 进程对象
process 包含了进程相关的属性和方法,Node 的 process 文档 中的内容特别多,列举几个常用方法 。
Node 进程启动时传递的参数都在 process.arg数组中:
// process.jsconst {argv , execPath} = processargv.forEach((val, index) => { console.log(`${index}: ${val}`)})console.log(execPath)可以在执行 process.js 时传递其他参数,这些参数都会保存在argv中:
$ node apiTest/process.js one=1 --inspect --version0: /usr/local/bin/node1: /Users/mobike/Documents/webProjects/testNode/apiTest/process.js2: one=13: --inspect4: --version/usr/local/bin/nodeprocess.argv第一个参数就是 process.execPath,即调用执行程序 Node 的路径,第二个参数时被执行的 JS 文件路径,剩下的就是自定义参数 。
process.env是包含运行环境各种参数的对象,可以直接输出env查看所有参数信息,也可以输出某个属性:
const {env} = process.envconsole.log(env.PATH) // /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/Documents/webProjects/testNode/node_modules/.binconsole.log(env.SHELL) // /bin/zsh在 webpack 打包过程中常用process.env.NODE_ENV判断生产环境或开发环境,process.env是没有NODE_ENV这个属性的,你可以在系统环境变量中配置,也可以在项目程序直接设置process.env.NODE_ENV=‘dev’ 。
process.cwd()方法返回 Node.js 进程的当前工作目录,和 Linus 命令$ pwd功能一样:
// process.jsconsole.log(process.cwd()) // /Users/Documents/webProjects/testNode复制代码$ node process.js/Users/WebstormProjects/testNode$ pwd/Users/WebstormProjects/testNode2.3 Timers 异步
Node 中的计时器方法与 Web 浏览器中的JS 计时器类似,但内部实现是基于 Node 的 Event Loop 。Node 中的计时器有setImmediate()、setTimeout()、setInterval() 。
推荐阅读
- 几项措施,让你的api不再裸奔
- ROS 的常用命令行工具
- 红茶常用外形评语,喝红茶的好处介绍
- excel常用的趋势分析图,值得收藏
- 小程序的api是什么
- Linux操作系统:文件的逻辑组织
- CNN中常用的四种卷积详解
- 红茶审评常用术语,评茶滋味术语
- API设计的几条原则
- JAVA程序员常用的几个工具类