nodejs学习日志3--模块

nodejs引入模块用require:
var express = require('express')

exports对象用于导出当前模块的方法和变量,一个文件就是一个模块,将方法挂载在exports对象上作为属性定义导出的方式,例如:

//test.js
exports.test1 = function(){
  return 'ok';
}


在另一个文件中,我们通过require()方法引入模块后,就能调用它的方法和属性了:

//test2.js
var test = require('test');
exports.tt = function(){
    return test.test1();
}

node中引入模块需要经历三个步骤:

  1. 路径分析。
  2. 文件定位
  3. 编译执行

路径分析:
    require()方法接受一个标识符作为参数,模块标识符分为:

  • 核心模块,如http,fs,path等,加载优先级仅次于缓存
  • . 或者..开始的相对路径文件模块
  • /开始的绝对路径文件模块,上述两种文件模块require()方法会将路径转为真实路径,并以真实路径作为索引,将编译执行后的结果缓存。由于指定了明确的路径,所以查找可以节约大量时间,加载速度慢于核心模块。
  • 非路径形式的文件模块,特殊的文件模块,可以是一个文件或者包的形式,最慢最费时。根据node的模块路径生成规则,在加载过程中会:
    1(找当前文件目录下的node_modules目录),
    2(父目录下的node_modules目录),
    3(父目录的父目录的
    node_modules),
    4(沿路径逐级向上逐级递归直到跟目录的
    node_modules

文件定位:

  • require()在分析标识符的过程中,标识符不包含文件扩展名的情况下,node会按.js,.node,.json的次序补足扩展名,依次尝试(调用fs模块同步阻塞式判断文件是否存在),所以如果是.node .json文件最好加上扩展名。
  • 如果没有查找到文件却得到一个目录会将目录当作一个包来处理。

模块编译:

  • js文件通过fs模块同步读取文件后编译执行
  • node文件,通过,c/c++编写的扩展文件(编写c/c++模块之后编译生成的,所以这里只有加载和执行),通过dlopen()方法加载最后编译生成的文件
  • json文件,通过fs模块同步读取,用JSON.parse()解析返回结果
  • 其余扩展名都被当作.js文件载入

node中模块分为核心模块和自己编写的模块(文件模块),核心模块是在node源代码编译过程中编译进了二进制执行文件,进程启动的时候部分核心模块就直接加载到了内存,省略了2 (文件定位)和3(编译执行),并且在1(路径分析)的时候优先判断,加载速度是最快的,文件模块在运行的时候动态加载,需要123步骤,加载速度比核心模块慢。node对引入过的模块都会进行缓存,缓存的是编译和执行后的对象。require()方法优先缓存加载,核心模块的缓存检查优先于文件模块的检查。



转载于:https://my.oschina.net/ozil/blog/185864

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值