node

NodeJS:模块加载原理

2019-08-02  本文已影响0人  SwiftBirds

模块的工作原理

实现“模块”功能的奥妙就在于JavaScript是一种函数式编程语言,它支持闭包。如果我们把一段JavaScript代码用一个函数包装起来,这段代码的所有“全局”变量就变成了函数内部的局部变量。

模块的加载顺序

模块加载按照如下顺序从先到后:优先从缓存加载--> 核心模块 --> 路径形式的文件模块 --> 第三方模块

优先从缓存加载

有以下三个js,终端运行node main.js会出现什么样的结果?

//a.js
console.log('a.js 被加载了')

var fn = require('./b')
console.log(fn)
//b.js
console.log('b.js 被加载了')

module.exports = function (str) {
  console.log('hello'+str)
}
//main.js
require('./a')

var fn = require('./b')
fn(",Mary")

优先从缓存加载,由于在a.js中已经加载过b.js了,所以在main.js中不会重复加载b.js。可以拿到其中的接口对象,但是不会重复执行里面的代码。这样做的目的是为了避免重复加载,提高模块加载效率。

最终运行结果为:

a.js 被加载了
b.js 被加载了
[Function]
hello,Mary

核心模块

路径形式的文件模块

也就是自己写的模块,在该模块中通过exports或者module.exports导出模块对象,两者是有差别的,真正使用的时候一般按照如下规则:

通过require可以加载自己写的模块,有以下的一些规定

第三方模块

通过npm安装进项目的模块即为第三方模块,他的加载书写规则和核心模块一模一样,但是加载的时候,nodejs会先去核心模块加载,没有该模块则去第三方木块加载
它的加载原理如下所列:

一个项目有且仅有一个 node_modules 而且是存放到项目的根目录

上一篇 下一篇

猜你喜欢

热点阅读