5.Node中的模块

目录

1  模块化

2  加载模块

3  模块作用域

4  module对象

4.1  初识module对象

4.2  module.exports

4.2.1  module.exports与require()

4.2.2  添加变量与方法

5  exports对象

5.1  初识exports对象

5.2  添加变量与方法

6  模块的加载机制

6.1  优先从缓存加载

6.2  内置模块优先级最高

6.3  自定义模块的寻找顺序

6.4  第三方模块的寻找顺序

6.5  目录作为require()参数


1  模块化

向我们之前引入的 fs,path,http 这些都是模块,每个模块干不同的事情

模块分为内置模块,自定义模块与第三方模块。

  • 内置模块,官方的模块,像fs,path,http
  • 自定义模块,自己写的js文件
  • 第三方模块,非官方的别人写的js文件,也叫包

Node.js遵循CommonJS模块化规范,CommonJS规定了模块的特定于各模块之前如何相互依赖

CommonJS中的一些规范

  • 每个模块内部,用module变量代表当前模块
  • module变量是一个对象,它的exports属性是对外的接口
  • 加载某个模块实则是加载该模块的module.exports属性。require()方法用于加载模块

2  加载模块

我们用require函数加载模块,内置模块和第三方模块我们都这样加载

自定义模块我们加载一个看一下

我当前有一个需要加载的模块.js,内容为console.log(1)

然后在同级目录下创建 2.加载自定义模块.js 进行引用,其他什么都不做

发现引用的内容被执行了

使用require方法加载包也可以不写 .js

效果一样

3  模块作用域

在自定义模块中定义一个全局变量

在被引用的文件中也可以正常使用

但如果要定义一个局部变量就使用不了了,我们把关键字都用上看一下

发现 var const let 都不行

所以当你自己写模块的时候最好不要用全局变量,那样会影响别的代码

4  module对象

4.1  初识module对象

module对象是node.js中的内置对象,我们打印出来看一下

其中 path是该文件所处的路径,filename是文件所处的路径再加一个文件名

4.2  module.exports

可以通过module.exports将模块内的变量与函数共享出去

4.2.1  module.exports与require()

外界使用require()方法导入的自定义模块,实际上就是module.exports指向的对象

如果被导入的模块module.exports中没有东西

那就会返回一个空对象

如果有东西就可以看到module.exports中的内容

4.2.2  添加变量与方法

可以给自定义模块定义一些变量或方法

这样就能打印出来一些东西

导入后就可以调用了

也可以这样添加,总的来讲保证module.exports是一个对象就行

  • 如果有冲突,下面的会覆盖掉上面的,像我这样重新定义了module.exports,那么重新定义的module.exports就会覆盖上面全部

同样可以使用

5  exports对象

5.1  初识exports对象

因为module.exports太长了,所以node提供了一个exports对象。功能与module.exports相同,默认情况下exports与module.exports指向相同的对象

你可以在任意的文件中打印出来看一下

可以使用 === 来判定exports与module.exports目前是否为同一个对象,true表示目前是同一个对象

5.2  添加变量与方法

与module.exports方法相似

我们用一下看看

使用require导入模块永远得到的是module.exports对象的内容,默认情况下指向的对象相同所以无所谓,现在我们更改module.exports的对象

使用的代码不变

发现myModule中只有我们刚刚定义的对象,没有后面exports定义的username与add_one

可以通过下面四个例子加深一下exports与module.exports的理解

6  模块的加载机制

09.模块的加载机制_哔哩哔哩_bilibili

6.1  优先从缓存加载

模块在第一次加载后回被缓存,多次使用require()调用相同的包不会被执行多次

无论是内置模块,自定义模块,第三方模块,都会优先从缓存中加载

6.2  内置模块优先级最高

内置模块的加载优先级最高,比如 即使你有一个自定义模块或第三方模块也叫fs,你用require()进行加载,永远加载内置的fs模块

6.3  自定义模块的寻找顺序

使用require()加载文件时会按照下面的顺序依次进行加载

  • 按照确切的文件名进行加载(如果没有任何扩展名优先按具体的名字加载,比如我的文件就叫test,不叫test.js test.json test.node 这些,就会加载test这个文件)
  • 补全 .js扩展名进行加载
  • 补全 .json扩展名进行加载
  • 补全 .node扩展名进行加载

6.4  第三方模块的寻找顺序

使用require()加载第三方模块的时候,优先会从当前路径下的 node_modules 中加载,如果没有就移动到上一层父目录中找node_modules,如果还没有就再向上,直到文件系统的根目录,做个例子

我在 D:\Node.js_demo\6.npm\ 打开终端

先找 D:\Node.js_demo\6.npm\node_modules\moment

再找 D:\Node.js_demo\node_modules\moment

再找 D:\node_modules\moment

找到D盘根目录都没有就不找了,报错

6.5  目录作为require()参数

优先找目录中的 package.json文件,加载其中的main(入口文件)

如果没找到就会加载目录中的 index.js 文件

如果都没有就报错

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Suyuoa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值