模块机制
类比java的类库,php的函数库和类库,你会发现如果说作为服务端语言来讲,js缺少库,js----模块系统+ecmascript
之前的ecmascript只是定义了一些核心的库,对于文件系统,i/o流等常见需求并没有标准的api,也灭有web服务器和数据库的统一接口,也没有包的管理,而如果想让js应用在服务器端,貌似需要为其开发对应的api以及包的管理器,
运行在node端的js的规范包含:ecmascript+commonjs规范制定的标准库
(一)commenjs的模块规范标准
模块引用:require('模块名');,将模块的api引入在上下文中
模块定义:一个文件就是一个模块,module对象代表模块自身,exports是module的属性,该对象用于导出当前模块的方法啊或变量,将函数挂载在exports对象上作为属性即可导出,被外界文件所引用,
模块标识:就是传递给require方法的参数 模块文件的相对路径/绝对路径 (文件模块)慢|| 小驼峰命名的字符串(核心模块)快
module对象的属性require和exports,其中将函数或者变量赋值给exports属性可以实现该模块的函数被外界js文件所调用
require可以将模块引入在文件中,
(二)node对模块的支持
node的模块分类:node的核心模块(node自带的) 用户编写的模块(文件模块),无论是node自带的还是用户编写的,都是需要三个步骤才能让模块加载到内存进行编译的
有机会可以看一看node的源码对于module对象的封装,其require属性是什么样的,
既然其可以引入模块,那require的实现思路大概是这样的
1)路径分析
2)文件定位
3)编译执行
对于核心模块,也就是node自带的模块,都是已经编译过了集成在node中的,有一些非常核心的模块甚至会在node进程启动的时候直接被加载进内存,其省略了编译执行和文件定位的步骤,速度快
对与用户模块是在运行时动态加载,需要123三个步骤,引入的速度慢
但是node会对引入的模块进行缓存,node缓存的是编译和执行之后的对象
因此模块的引入步骤
1检查核心模块缓存中是否有?检查文件模块缓存中是否有?
2如果没有的话,执行三个步骤路径--文件定位---加载内存---编译执行