全局变量
定义全局变量
在nodejs中使用全局变量gobal定义全局变量,定义的全局变量,可以在引入的文件中访问该变量
例如:在a.js 中
gobal.a = 123
require('./b.js')
在b.js 中
console.log(gobal.a)// 123
在浏览器中我们使用 window定义全局变量 在nodejs中我们使用gobal定义全局变量,不同环境我需要判断,
在ECMScript2020出现了gobalThis 全局变量,在nodejs中会自动切换gobal 在浏览器环境自动切换为window
关于其他全局API
注意:由于node 没有DOM和BOM,除了这些API ,其他ECMAScriptAPI基本都能使用
例如:以下这些API 都是可以正常用的
setTimeout setInterval Promise Math console Date fetch(node v18) 等...
noden内置全局API
__dirname 和 __filename
注意:__dirname __filename 只能在cjs使用, esm规范没有这两个全局变量
- 在
cjs中可以使用__dirname __dirname当前模块所在目录的绝对位置- 比如我的我模块文件在 D:\test\node\global\lib\index.js
console.log(__dirname) // D:\test\node\global\lib
__filename当前模块文件的绝对路径 包含文件的:文件名文件扩展名
console.log(__filename) // D:\test\node\global\lib\index.js
-
问题是这两个全局变量都是在
cjs全局变量 我们如果是ES模块咋办呢?-
在
node20.11.0版本之后加入以下变量就能跟这两个变量类似import.meta.dirname类似于 cjs 的__dirnameimport.meta.filename类似于 cjs 的__filename
-
在
node20.11.0版本之前我们需要使用这种方式来得到 cjs 这两个全局变量 -
首先我们需要使用到
import.meta.url,他表示当前模块的绝对URLconsole.log(import.meta.url);- 在浏览器环境中 我们打印得到的是
http://127.0.0.1:5500/lib/index.js - 在node环境中我们打印得到的是文件路径包含(file:// 协议)
file:///D:/test/node/global/lib/index.js
- 在浏览器环境中 我们打印得到的是
-
然后我们使用node 自带的内置模块
url剔除 file:// 协议 -
fileURLToPath此函数可确保正确解码百分比编码字符并确保跨平台有效的绝对路径字符串。
-
-
然后得到跟cjs一样的全局变量
import { fileURLToPath } from 'node:url'; import { dirname } from 'node:path'; //D:\test\node\global\lib\index.js const __filename = fileURLToPath(import.meta.url); // D:\test\node\global\lib const __dirname = dirname(__filename);
require module
引入模块和模块导出上一章已经详细讲过了,不清楚可以点击这个链接 模块化
process
-
process也是一个全局对象,提供有关当前node进程信息对其进行控制
-
process 对象是
EventEmitter的实例,它可以发出监听事件'beforeExit'事件会在 Node.js 清空其事件循环并且没有额外的工作要安排时触发 -
process.argv:这是一个命令行参数的数组,第一个参数是node.js的执行路径 第二个参数是
当前执行的JavaScript文件的路径,之后的元素是传递给脚本的命令行参数

-
process.env: 这是一个包含当前环境变量的对象。您可以通过process.env访问并操作环境变量。 -
process.cwd(): 返回当前项目的根目录的路径- 比如我的我模块文件在 D:\test\node\global\lib\index.js
console.log(process.cwd()); // D:\test\node\global -
process.on(event,listener)用于注册事件监听器。您可以使用process.on监听诸如exit、uncaughtException等事件,并在事件发生时执行相应的回调函数。 -
process.exit([code]): 用于退出当前的Node.js进程。您可以提供一个可选的退出码作为参数。 -
process.pid: 这个属性返回当前进程的PID(进程ID)。
这些只是process对象的一些常用属性和方法,还有其他许多属性和方法可用于监控进程、设置信号处理、发送IPC消息等。
Buffer
1.创建 Buffer 实例:
-
Buffer.alloc(size[, fill[, encoding]]): 创建一个指定大小的新的Buffer实例,初始内容为零。fill参数可用于填充缓冲区,encoding参数指定填充的字符编码。const b = Buffer.alloc(10, 'a', 'utf8'); console.log( b.toString('utf8')); // aaaaaaaaaa const b1 = Buffer.alloc(10) console.log(b1.toString().length) // 10 console.log(b1.toJSON())
-
Buffer.from(array): 创建一个包含给定数组的Buffer实例。const b = Buffer.from([1,2,3]); console.log( b.toJSON()); // { type: 'Buffer', data: [ 1, 2, 3 ] } -
Buffer.from(string[, encoding]): 创建一个包含给定字符串的Buffer实例。- 如果填入的是
字符串使用toJSON方法 返回的是ASCII码
const b = Buffer.from('ABC','utf8'); console.log( b.toJSON()); // { type: 'Buffer', data: [ 65, 66, 67 ] } console.log( b.toString()); // ABC - 如果填入的是
2.读取和写入数据:
-
buffer[index]通过索引读取或写入Buffer实例中的特定字节。const b = Buffer.alloc(10, 'a', 'utf8').toString(); let bs = b.split(''); bs[0] = 'b'; console.log(bs.join('')); // baaaaaaaaa console.log( b.toString('utf8')); // aaaaaaaaaa -
buffer.length: 获取Buffer实例的字节长度。 -
buffer.toString([encoding[, start[, end]]]): 将Buffer实例转换为字符串。
3.转换数据:
-
buffer.toJSON(): 将Buffer实例转换为JSON对象。 -
buffer.slice([start[, end]]): 返回一个新的Buffer实例,其中包含原始Buffer实例的部分内容。const b = Buffer.alloc(10, 'a', 'utf8').toString(); const bs = b.slice(0, 3); console.log(bs); // aaa
4.其他方法:
-
Buffer.isBuffer(obj): 检查一个对象是否是Buffer实例。const b = Buffer.alloc(10, 'a', 'utf8'); console.log(Buffer.isBuffer(b)); // true console.log(Buffer.isBuffer(b.toString())); // false -
Buffer.concat: 将一组Buffer实例或字节数组连接起来形成一个新的Buffer实例。
const str = Buffer.from([1, 2, 3]);
const str1 = Buffer.from([4, 5, 6]);
const str3 = Buffer.concat([str, str1]);
console.log(str3.toJSON()); // type: 'Buffer', data: [ 1, 2, 3, 4, 5, 6 ] }
请注意,从Node.js 6.0版本开始,Buffer构造函数的使用已被弃用,推荐使用Buffer.alloc()、Buffer.from()等方法来创建Buffer实例。
Buffer类在处理文件、网络通信、加密和解密等操作中非常有用,尤其是在需要处理二进制数据时