nodejs 模块加载机制

require 模块加载规则

核心模块 require(“模块名”)
第三方模块 require(“模块名”)
自定义模块 require(“模块路径”) ;一定要写 ./ 不然会被认为是核心模块 然后找不到报错

require加载机制

判断模块标识 require(“模块标识”)
路径形式模块
./ 单前目录不可省 
	../ 上一级目录不可省 
	/xxx(几乎不用) 
	
首位的 / 在这里表示的是当前文件模块所属磁盘根目录
.js 后缀名可省

require("./foo")
核心模块

核心模块文件已经被编译到了二进制文件中了,我们只需要按名字加载就行了

require("fs")
第三方模块 当模块没有路径且没有后缀

不可能有如何一个第三方和核心模块名字是一样的
凡是第三方模块都必须通过 npm 来下载 使用时 require(“模块名”)
找 node_modules/模块名/package.json 文件
在找 json 文件中的 main 属性 记录了当前模块的入口模块

可以测试
	在  node_modules 下新建 csA 文件夹 
	csA 下新建 package.json {"main":"index.js"}
		下新建 index.js 
			console.log("csA 加载了")
			module.exports = "测试 csA"
	在 node_modules 同级目录下创建 app.js
		var csA = require("csA")
		console.log(csA)
	运行 app.js
		node app.js

如果 node_modules目录下面没有 csA.js
	就会找 node_modules下的csA文件夹 下的package.json

如果 package.json 不存在 或 main指定入口文件也没有
	则 node 会自动找该目录下的 index.js,index.js 会作为默认备选项

如果 以上条件不成立 
	则会进入上一级目录的 node_modules 目录查找 模块 在没有 ,在往上上一级,...
	直至磁盘根目录,还没找到 会报错
		Cannot find module xxx
当模块有路径但没有后缀时
require("./find.js")
require("./find")
  1. require方法根据模块路径查找模块,如果是完整路径,直接引入模块。.
  2. 如果模块后缀省略,先找同名js文件再找同名j文件夹
  3. 如果找到同名文件夹,在找文件夹中的index.js
  4. 如果index.js也没有,就回去当前文件夹中的package.js文件中查找main选项中的入口文件
  5. 如果找到的入口文件不存在或者没有找到入口文件就会报错,模块没有找到
优先加载缓存数据

main.js

require("./a")
var b = require("./b")

a.js

console.log("a.js loading")
var b = require("./b")

b.js

console.log("b.js loading")
module.exports = "bljs"

运行main.js
打印

a.js loading
b.js loading

由于 a.js 已经加载了 b.js,所以 main.js 不会重复加载b.js,
是为了避免重复加载,提高模块加载效率
main.js 的 require("./b")只是为了获取 b.js 导出的结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值