node.js深入浅出5-------模块机制

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如果没有的话,执行三个步骤路径--文件定位---加载内存---编译执行

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值