3.23模块机制再次阅读
仔细想来,为什么需要这个模块机制,你可不要以为js出道那么短时间,更何况刚就开始他只是一个前端语言而已,根本就没有王服务端发展,更别提什么模块了,你想想吧,其实js如果像作为服务端开发脚本,你不觉得他绝对需要模块化机制嘛,因此这也就是 commonjs的意义!
还有就是npm的出现,实际也就是对模块的一种管理,这些东西npm,commonjs其实都是服务端语言所必需的,你懂吧,因为你作为服务端语言你怎么可以能没有库,没有库管理的工具?
commonjs的模块规范
所以模块引用:const {a,b}=require(../1.js)
1,.js模块定义:const fun=()=>{}
module.exports={a,b}
模块标识:
commonjs包
包中包括如下文件:package.json bin lib doc
package.json {name:包名,description:包简介,version:版本号,repositories:包托管源代码的位置列表,maintainers:包维护者列表, dependnncies:包的依赖模块}
关于npm
安装依赖包:npm install .....
通常对于其中有执行命令的包需要全局安装后才能使用其命令 npm install -g
生成json文件:npm init
上传包:npm publish
通常像这种东西,企业专门做node的,比如说阿里可能就会存在自己的node的库
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
模块机制
类比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如果没有的话,执行三个步骤路径--文件定位---加载内存---编译执行