Java OpenResty Spring Spring Boot MySQL Redis MongoDB PostgreSQL Linux Android Nginx 面试 小程序 Arthas JVM AQS juc Kubernetes Docker DevOps


Node.js 模块

Node.js 大约 2062 字

模块分类

内置模块

  • fs
  • path
  • http

自定义模块

创建的每个js都是自定义模块。

第三方模块

非官方提供的模块,由第三方提供并维护,需下载使用.

又叫做

加载模块

使用require()方法导入。

使用require()方法加载其他模块时,会执行被加载模块中的代码。

加载自定义模块时,必须指定以./../开头的路径标识符,如果没有指定,Node.js会把它认为是内置模块或第三方模块。

require 自定义模块

导入自定义模块时,如果省略了文件的扩展名,则Node.js会按以下顺序分别尝试加载文件:

  1. 按照确定的文件名进行加载。
  2. 补全**.js**扩展名进行加载。
  3. 补全**.json**扩展名进行加载。
  4. 补全**.node**扩展名进行加载。
  5. 加载四百,终端报错。

require 第三方模块

导入第三方模块时,Node.js会从当前模块的目录开始,从node_modules文件夹中加载第三方模块。如果没有找到第三方模块,则再从上一层目录中,进行加载,直到文件系统的根目录。

假设在C:\Users\hello\project\test.js中调用了require('tools'),则Node.js会按以下顺序查找:

  1. C:\Users\hello\project\node_modules\tools
  2. C:\Users\hello\node_modules\tools
  3. C:\Users\node_modules\tools
  4. C:\node_modules\tools
  5. 找不到模块,报错。

目录作为模块时

当把目录作为模块标识符时(如:自定义模块"project/test.js",导入时写成require('./project')),有三种加载方式:

  1. 在被加载的目录下查找一个叫做package.json的文件,并寻找main属性,作为require()加载的入口。
  2. 如果目录里没有package.json文件,或者main入口不存在或无法解析,则Node.js将会试图加载目录下的index.js文件。
  3. 如果以上两步都失败了,则Node.js会在终端抛出错误信息:Error: Cannot find module 'xxx'

module 和 module.exports

每个自定义模块中都有一个module实例。

declare var module: NodeModule;

// Same as module.exports
declare var exports: any;

module对象

console.log(module)

console.log(module.exports)

输出

Module {
  id: '.',
  path: 'D:\\node-learn',
  exports: {},
  filename: 'D:\\node-learn\\06_module.js',
  loaded: false,
  children: [],
  paths: [
    'D:\\node-learn\\node_modules',
    'D:\\node_modules'
  ]
}

注意

require()引入模块时,得到的永远是module.exports对象。

初始化时同时指向一块内存区域,赋值新对象就会改变指向的内存地址值。(添加新字段不会改变内存地址值的指向)

最终都以module.exports指向的对象为准。

举例一

module.exports.username = "zs";

module.exports = {
    gender: "男",
    age: 18
}

输出

{ gender: '男', age: 18 }

举例二

module.exports.username = "zs";

exports = {
    gender: "男",
    age: 18
}

输出

{ username: 'zs' }

举例三

exports.username = "zs";

module.exports.gender = "男";

输出

{ username: 'zs', gender: '男' }

举例三

exports = {
    username: "zs",
    gender: "男"
}

module.exports = exports

module.exports.age = 18

输出

{ username: 'zs', gender: '男', age: 18 }

CommonJS

  1. 每个模块内部,module变量代表当前模块。
  2. module变量是一个对象,它的exports属性(即module.exports)是对外的接口。
  3. 加载某个模块,其实就是加载该模块的module.exports属性。require()方法用于加载模块。
阅读 123 · 发布于 2022-12-20

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批