require('module') 是什么?

318be93f11e670e99e02ddb756f9bdda.png

在很多框架中经常会看到导入 module 模块来使用,那么导入的 module 模块和文件中的 module 变量到底又有什么区别呢?

const Module = require('module');

module 变量

在每个模块中,module 变量是对代表当前模块的对象的引用。

Module {
  id: '.',
  exports: 2,
  parent: null,
  filename: '/Users/leinov/github/node-api/module/module.js',
  loaded: false,
  children:
   [ Module {
       id: '/Users/leinov/github/node-api/module/circle.js',
       exports: [Object],
       parent: [Circular],
       filename: '/Users/leinov/github/node-api/module/circle.js',
       loaded: true,
       children: [],
       paths: [Array] } ],
  paths:
   [ '/Users/leinov/github/node-api/module/node_modules',
     '/Users/leinov/github/node-api/node_modules',
     '/Users/leinov/github/node_modules',
     '/Users/leinov/node_modules',
     '/Users/node_modules',
     '/node_modules' ]

node 在运行某个模块时会生成一个 module 对象,关于 module 对象具体是怎么生成的,是通过 Module 这个构造函数生成实例对象。

function Module(id = '', parent) {
  this.id = id;
  this.path = path.dirname(id);
  this.exports = {};
  this.parent = parent;
  updateChildren(parent, this, false);
  this.filename = null;
  this.loaded = false;
  this.children = [];
}


const module = new Module()

所以每个模块都是一个实例对象。那么如果我们想给实例对象添加公共方法,就要加在构造函数的原型上。

const Module = require('module');
Module.prototype._compile = function () {}

当与 Module 的实例交互时提供通用的实用方法。其实源码中已经暴露了很多方法,比如 createRequire 方法,用于构造 require 函数的文件名,返回 require 函数。

const Module = require('module');
const context = path.resolve('./src/package.json')
const require = Module.createRequire(context)


// sibling-module.js 是 CommonJS 模块。
const siblingModule = require('./sibling-module')

目的就是为了改变加载的位置,要从 src 这个目录里面加载 sibling-module 模块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`import` 和 `export` 是现代 JavaScript(ES6 及以上版本)中的模块化引入和导出机制,而 `require` 和 `module.exports` 是 Node.js 中传统的模块加载方式。两者的主要区别在于: 1. **作用域和模块上下文**: - `import` 语句使得你可以在模块内部导入其他模块的代码块,创建一个封闭的作用域。这样,你可以避免全局污染,并且导入的内容只在当前模块的范围内可见。 - `require` 需要在 Node.js 中运行,它在全局作用域下查找并加载模块,这可能导致无意中的变量共享。 2. **语法和用法**: - `import` 支持静态导入,意味着编译时可以确定导入内容,提高了性能,同时还可以使用解构赋值等更灵活的导入方式。 - `module.exports` 用于导出一个模块的内容,它通常是一个对象,当你使用 `require` 时会返回整个导出对象。 3. **动态导入**: - `import()` 是动态导入,支持在运行时决定要加载的模块,这对于异步加载大文件或模块树非常有用。 - `require()` 没有内置的动态导入功能,需要借助第三方库(如 `dynamic-import-node`)实现。 4. **模块系统不同**: - ES6 的模块系统是 CommonJS 的超集,Node.js 原生支持 CommonJS。 - ES6 的模块系统更现代,推崇更简洁、面向对象的编程风格。 因此,`import` 和 `export` 提供了更符合现代 JavaScript 规范、易于理解和维护的模块化编程方式,特别是在开发 Web 应用程序时,它们是标准的写法。而在 Node.js 中,尽管 `import` 和 `export` 也可以被模拟使用,但建议使用 `require` 和 `module.exports` 或者 `export default` 的组合,以保持向后兼容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值