Node第九章(全局变量)

159 阅读4分钟

全局变量

定义全局变量

​ 在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 没有DOMBOM,除了这些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 的 __dirname
      • import.meta.filename 类似于 cjs 的 __filename
    • node20.11.0 版本之前我们需要使用这种方式来得到 cjs 这两个全局变量

    • 首先我们需要使用到 import.meta.url ,他表示当前模块的绝对URL

      console.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文件的路径,之后的元素是传递给脚本的命令行参数

image.png

  • 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监听诸如exituncaughtException等事件,并在事件发生时执行相应的回调函数。

  • 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()) 
    
  • image.png
  • 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类在处理文件、网络通信、加密和解密等操作中非常有用,尤其是在需要处理二进制数据时