Node.js中的模块化

2019-12-15  本文已影响0人  梁坤同学

什么是模块?

为什么要进行模块化

补充:面向对象编程的5(6)大原则:

什么是包?

在Node.js中的模块主要分为:核心模块 和 文件模块

核心模块

文件模块(包含独立文件模块和第三方模块)

module.exports 和 exports

exports = module.exports;
 // To illustrate(说明) the behavior, imagine this hypothetical implementation of require(), which is quite similar to what is actually done by require():

 function require(...) {
 var module = { exports: {} };

 ((module, exports) => {
   // Your module code here. In this example, define a function.
   function some_func() {};
   exports = some_func;
   // At this point, exports is no longer a shortcut to module.exports, and
   // this module will still export an empty default object.
   module.exports = some_func;
   // At this point, the module will now export some_func, instead of the
   // default object.
 })(module, module.exports);

 return module.exports;
}

require 加载模块时做了2件事

  1. 执行了模块中的代码
  2. 返回了模块中对外暴露的内容(可能是对象、函数等等)

二、require 加载模块顺序

  1. 看 require() 加载模块时传入的参数是否以 './' 或 '../' 或 '/' 等等这样的路径方式开头(相对路径或绝对路径都可以)

  2. 是,那么会按照传入的路径直接去查询对应的模块。

  1. 不是,那么就认为传入的是 "模块名称"(比如:require('http')、require('mime'))
// require('http')
// require('mime')


// 情况一:require() 的参数是一个路径
require('./index2.js')

// index2.js
// index2.json
// index2.node
// index2 文件夹 -> package.json -> main(入口文件 app.js -> index.js/index.json/index.node) -> 加载失败
require('ndex2')

// 情况二: require() 的参数不是路径,直接就是一个模块名称
// 1. 先在核心模块中查找,是否有和给定的名字一样的模块。如果有,则直接加载该核心模块。
// require('http')

// 2. 如果核心模块中没有该模块那么就会认为这个模块是一个第三方模块(自定义模块)
// 先会去当前js文件所在的目录下去找是否一个一个 node_modules 文件夹
// require('mime')

require 加载模块注意点

  1. 所有模块第一次加载完毕后都会有 缓存,二次加载直接读取缓存,避免了二次开销
  1. 每次加载模块的时候都优先从缓存中加载,缓存中没有的情况下才会按照 node.js 加载模块的规则去查找

  2. 核心模块在 Node.js 源码编译的时候,都已经编译为二进制执行文件,所以加载速度较快(核心模块加载的优先级仅次于 缓存加载)

  3. 核心模块都保存在 lib 目录下

  4. 试图加载一个和 核心模块 同名的 自定义模块(第三方模块)是不会成功的

  1. 核心模块 只能通过 模块名称 来加载(错误示例:require('./http'); 这样是无法加载 核心模块 http的 )
  2. require() 加载模块使用 ./ 相对路径时,相对路径是相对当前模块,不受执行 node 命令的路径影响
  3. 建议加载文件模块的时候始终添加文件后缀名,不要省略。
上一篇 下一篇

猜你喜欢

热点阅读