美文网首页
5.Node.js 中的模块系统

5.Node.js 中的模块系统

作者: 璎珞纨澜 | 来源:发表于2019-03-27 20:56 被阅读0次

使用 Node.js 编写应用程序主要就是在使用:

  • EcmaScript 语言
  • 核心模块
  • 第三方模块(必须通过 npm 来下载才可以使用)
  • 自己写的模块

CommonJS 模块规范

在 Node 中的 JavaScript 还有一个很重要的概念:模块系统

  • 模块作用域
  • 使用 require 方法用来加载模块
  • 使用 exports 接口对象用来导出模块中的成员

1.加载 require

语法: var 自定义变量名称 = require('模块')
两个作用:

  • 执行被加载模块中的代码
  • 得到被加载模块中的 exports 导出接口对象

2.导出 exports

  • Node中是模块作用域,默认文件中所有成员都只在当前文件模块有效
    对于希望可以被其他模块访问的成员,我们需要把这些公开的成员都挂载到 exports 接口对象中就可以了。

导出多个成员(必须在对象中):

exports.a = 123
exports.b = 'hello'
exports.c = function () {
  console.log('ccc')
}
exports.d = {
  foo: 'bar'
}

导出单个成员:

module.exports = 'hello'

以下情况会覆盖:

module.exports = 'hello'
module.exports = function (x, y) {
  return x + y
}

也可以这样来导出多个成员:

module.exports = {
  add: function () {
    return x + y
  }
  str: 'hello'
}

原理解析

  • 在 node 中,每个模块内部都有一个自己的 module 对象,该 module 对象中,有一个成员叫:exports也是一个对象。如果你需要对外导出成员,只需要把导出的成员挂载到 module.exports 中。
    我们发现,每次导出接口成员的时候都通过 module.exports.xxx = xxx的方式很麻烦,所以 Node 为了简化你的操作,专门提供了一个变量:exports 等于 module.exports。也就是说在模块中还有这么一句代码:
    var exports = module.exports

  • 当一个模块需要导出单个成员的时候,直接给 exports 赋值是不管用的,给 exports 赋值会断开和 module.exports 之间的引用,同理,给 module.exports 重新赋值也会断开。但是有一种引用方式比较特殊:exports = module.exports 这个是用来重新建立引用关系的。

  • 最终 return 的是 module.exports,不是 exports。默认在代码的最后有一句:return module.exports。谁来 require,谁就得到 module.exports

原理解析demo:

exports.foo = 'bar'
// ==> {foo: bar}

module.exports.a = 123
// ==> {foo: bar, a: 123}

// 重新赋值后:exports !== module.exports
// 最终 return 的是 module.exports,所以无论你 exports 中的成员是什么都没用
exports = {
  a: 456
}

module.exports.foo = 'haha'
// ==> {foo: 'haha', a: 123}

// 没关系,混淆你的
exports.c = 456

// 重新建立了和 module.exports 之间的引用关系了
exports = module.exports

// 由于在上面建立了引用关系,所以这里是生效的
exports.a = 789
// ==> {foo: 'haha', a: 789}

// 前面再牛逼,在这里都全部推翻了,重新赋值
// 最终得到的是 Function
module.exports = function () {
  console.log('hello')
}

相关文章

  • 5.Node.js 中的模块系统

    使用 Node.js 编写应用程序主要就是在使用: EcmaScript 语言 核心模块 第三方模块(必须通过 n...

  • Python 沙箱逃逸 Payload 收集

    读取文件 在 linecache 中寻找 os 模块执行系统命令 在自模块中寻找 os 模块执行系统命令 读取重要...

  • python导入自定义模块时注意事项

    1.模块名称注意不要和系统中其他模块有冲突 2.模块中的方法要注意不要和系统中其他模块冲突 3.使用anacond...

  • Node.js教程(02)|基础知识篇(下)

    Node.js 模块系统 模块系统,便于各个文件之间的相互调用。在node.js中,模块就是文件,文件也是模块,这...

  • 16-os模块

    OS模块 OS 操作系统的简称os模块就是对操作系统进行操作 使用该模块必须先导入模块: os模块中的函数 ge...

  • python OS 简单操作命令

    OS模块-操作系统(Operating System) python中的OS模块可以操作操作系统,与操作系统交互....

  • Java 9 逆天的十大新特性

    modularity System 模块系统 Java 9 中主要的变化是已经实现的模块化系统。 Modulari...

  • 进程之os模块

    os模块 os 模块提供大量和系统相关的功能函数接口 os 模块的使用时系统相关的,在不同的系统中,可能使用方法不...

  • Node 中的模块系统

    使用 Node 编写应用程序主要是使用 EcmaScript 语言(和游览器中不一样,在 Node 中没有 BOM...

  • node中的模块系统

    1.http:搭建后台服务器 fs 文件操作模块 读取文件 写文件 fs模板结合http模板请求不同文件

网友评论

      本文标题:5.Node.js 中的模块系统

      本文链接:https://www.haomeiwen.com/subject/ujnfmqtx.html