一、常见的全局对象

1.全局对象的定义

  • 全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。
  • 在浏览器JavaScript中,通常window是全局对象
  • 在Node.js中,全局对象是global,所有的全局对象都是global对象的属性。

控制台打印的global

<ref *1> Object [global] {
  global: [Circular *1],
  clearInterval: [Function: clearInterval],
  clearTimeout: [Function: clearTimeout],
  setInterval: [Function: setInterval],
  setTimeout: [Function: setTimeout] {
    [Symbol(nodejs.util.promisify.custom)]: [Getter]
  },
  queueMicrotask: [Function: queueMicrotask],
  performance: Performance {
    nodeTiming: PerformanceNodeTiming {
      name: 'node',
      entryType: 'node',
      startTime: 0,
      duration: 26.296499997377396,
      nodeStart: 0.5467000007629395,
      v8Start: 1.967500001192093,
      bootstrapComplete: 19.882200002670288,
      environment: 9.948199987411499,
      loopStart: -1,
      loopExit: -1,
      idleTime: 0
    },
    timeOrigin: 1669688619386.091
  },
  clearImmediate: [Function: clearImmediate],
  setImmediate: [Function: setImmediate] {
    [Symbol(nodejs.util.promisify.custom)]: [Getter]
  }
}

2.特殊的全局变量

  • __dirname 输出当前目录
  • __filename输出当前文件的目录,及文件名

image-20221129104542795

  • exports
  • module
  • require()

这些全局对象实际上模块中的变量,只是每个模块都有,看起来像是全局变量。

在命令行交互中是不可以使用的。

  1. setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。:setTimeout() 只执行一次指定函数。
  2. clearTimeout(t) 全局函数用于停止一个之前通过 setTimeout() 创建的定时器。 参数 t 是通过 setTimeout() 函数创建的定时器。
  3. setInterval(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb),这个函数可以使用clearInterval()函数来清除。
  4. console:提供简单的调试控制台,用于向标准输出流(stdout)或标准错误流(stderr)输出字符。
  5. process :process提供了Node进程中相关的信息, 即 global 对象的属性,用于描述当前Node.js 进程状态的对象,提供了一个与操作系统的简单接口。

二、模块化开发

1.CommonJS

CommonJS是一个规范,简称为CJS

  • NodeCommonJS在服务器端一个具有代表性的实现,Node中对CommonJS进行了支持和实现,让我们在开发node的过程中可以方便的进行模块化开发
  • Node中每一个js文件都是一个单独的模块;
  • 这个模块中包括CommonJS规范的核心变量:exportsmodule.exportsrequire
  • 我们可以使用这些变量来方便的进行模块化开发

模块化的核心是导入和导出

  • exports和module.exports可以负责对模块中的内容进行导出
  • require函数可以帮助我们导入其他模块(自定义模块、系统模块、第三方库模块)中的内容

exports 和 module.exports 的使用

  • 如果要对外暴露属性或方法,就用 exports 就行,要暴露对象(类似class,包含了很多属性和方法),就用 module.exports
  • 不建议同时使用 exports 和 module.exports。
  • 如果先使用 exports 对外暴露属性或方法,再使用 module.exports 暴露对象,会使得 exports 上暴露的属性或者方法失效。

三、require细节

1.require('X')的查找规范

情况一 像http fs这种内置模块,直接返回核心模块

情况二 X是以./或../开头的。

  1. 如果有后缀名,按照后缀名的格式查找对应的文件;

  2. 如果没有后缀名,

    1. 直接查找文件X
    2. 查找X.js文件
    3. 查找X.json文件
    4. 查找X.node文件
  3. 如果灭找到对应的文件,将X作为一个目录

    查找目录下的index文件

    1. 查找X/index.js文件
    2. 查找X/index.json文件
    3. 查找X/index.node文件

情况三 在node_moudles文件夹中查找

四、exports导出方式

方式一

exports = {
    name:'mwf'
}
module.exports = exports

方式二

module.exports={
    name:'mwf'
}
exports = module.exports

最终目的都是让他们两个指向同一个对象

五、ES Module

image-20221128221030251