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

更新日期: 2019-04-19阅读: 2.9k标签: 变量

一、全局变量

在 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、项目构建、网络编程、异步编程等知识点,加油呢少年~

来自:https://segmentfault.com/a/1190000018926421


链接: https://www.fly63.com/article/detial/2959

css自定义变量_初次接触CSS变量

本文的目的主要是展示CSS变量是如何工作的。随着Web应用程序变得越来越大,CSS变得越来越大,越来越多,而且很多时候都很乱,在良好的上下文中使用CSS变量,为您提供重用和轻松更改重复出现的CSS属性的机制。

CSS变量(自定义属性)实践指南

Sass和Less这样的预处理器,让我们的CSS代码保持良好的结构和可维护性。像变量、混合(mixins)、循环控制等特性,增强了动态编写CSS的能力,从而减少重复代码,也加快了我们开发速度。

css变量_原生css 中变量的使用

原生css 中变量的使用,这个重要的 CSS 新功能,所有主要浏览器已经都支持了。本文全面介绍如何使用它,你会发现原生 CSS 从此变得异常强大。声明变量的时候,变量名前面要加两根连词线(--),var()函数用于读取变量。

理解var let const区别

JavaScript中var、let、const区别?js中let和const都是es5版本新的命名规范,在此之前定定义一个变量只能用var。我们可以把let和const看做是为了弥补var的一些不足而新设计出来的

一个例子,变量提升和函数提升就是这么简单!

引擎在读取js代码的过程中,分为两步。第一个步骤是整个js代码的解析读取,第二个步骤是执行。在JS代码执行之前,浏览器的解析器在遇到 var 变量名 和function 整个函数 提升到当前作用域的最前面。

CSS变量使用解析

很早直接就了解到CSS变量相关的内容,奈何之前使用价值不高(很多主流浏览器不兼容),最近发现主流浏览器都已经支持了这一变化,CSS变量就像JS的变量,每个类名或者花括号就像一个function,里面的变量只有上下文以内可以获取,这就让CSS有了更多可能性。

let与var的区别,为什么要用let?

var是全局声明,let是块级作用的,只适用于当前代码块;var变量会发生变量提升,let则不会进行变量提升;var 会造成重复赋值,循环里的赋值可能会造成变量泄露至全局

ES6-变量的解构赋值

解构赋值官方解释:按照一定的模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。变量的解构赋值就是一种写法,掌握了这种写法可以让我们在书写 javascript 代码时可以更加的简单,迅捷。

JS中变量的存储

JS中的变量是保存在栈内存中的:1.基本数据类型的值直接在栈内存中存储;2.值与值之间是独立存在的,修改一个变量不会影响其他变量;对象是保存到堆内存中的,每创建一个新的对象

js 交换变量值的方法总汇

这篇文章总结七种办法来交换a和b的变量值 。最最最简单的办法就是使用一个临时变量了 ,最后我的方案是利用了ES6的解构赋值语法 ,它允许我们提取数组和对象的值,对变量进行赋值

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!