node mysql 模块化_node中的模块化(1)

有了解过模块化的同学一定都知道nodejs使用的是commonJs规范,甚至都还对比过commonJs、AMD、CMD、es6模块化之间的区别,这里主要以nodejs为例子讲commonJS的规范。

node中模块化分为两类,一类是原生模块,一类是文件模块,这两类都遵从commonJS规范,当我们利用require加载时(同步),会将加载结果缓存起来,相比于原生模块,文件模块加载速度要慢一些,因为原生模块再node源码编译时编译进行了二进制执行文件。

在我们开发的项目中无论使用什么脚手架,最终运行node Server都是通过 node 入口文件名.js启动的,以命令加载启动的方式都是文件模块。这个命令运行时借助的是node模块module实现的,这个属于原生模块,像上面说的,它在启动时已经被加载了,它会借助_load静态方法读取process.argv[1](也就是node后面跟的入口文件名)去查找该文件,将该文件包裹成一个函数

(function (exports, require, module, __filename, __dirname) {

const koa = require('koa');

})

我们可以看到,包裹这个函数的同时传入了五个参数,这也就是说我们在开发我们node文件的时候可以直接使用上面的五个参数,module是这个文件模块的自身,exports是在module的构造函数上定义一个{},所以我们会将一些方法通过exports暴露出去供其他模块使用,require是引用其他模块的方法,其实本质上调用的还是_load方法,所以说当我们启动node server的时候,会根据文件依赖关系加载项目所需的模块(这里可能会存在循环依赖的问题),load方法在载入、编译、缓存了module后返回自身的exports对象供外部模块调用, __filename、__dirname是在module方法查找文件的时候生成传入的,他们两个的含义可以查看__dirname | Node.js API 文档 ,我们通常会借助node原生模块path使用这两个变量。

require方法会根据模块不同的类型进行不同优先级的引入,首先会看缓存区中是否有该模块(无论是文件模块还是原生模块),当文件模块和原生模块同名时,node会选择在原生模块中加载,如果没有该原生模块,再去根据路径加载相应的文件模块,同样,这两种方法加载完以后都会放在各自相应的缓存区中。

require方法是智能的,它可以接受多重类型的参数,比如

require('path'); // 原生模块

require('../a'); // 相对路径

require('/b/a'); // 绝对路径 很多项目中可以配置

require('mode'); // 非原生模块的文件模块

主要是通过modulepath进行转换成一个list,还是根据我们上面所说的优先级进行查找(windows下生成的list不太一样)

参考朴灵老师的流程图

参考:深入浅出nodejs (朴灵)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值