nodejs学习日志3--模块
2013-12-19 10:23
531 查看
nodejs引入模块用require:
exports对象用于导出当前模块的方法和变量,一个文件就是一个模块,将方法挂载在exports对象上作为属性定义导出的方式,例如:
在另一个文件中,我们通过require()方法引入模块后,就能调用它的方法和属性了:
node中引入模块需要经历三个步骤:
路径分析。
文件定位
编译执行
路径分析:
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()方法优先缓存加载,核心模块的缓存检查优先于文件模块的检查。
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中引入模块需要经历三个步骤:
路径分析。
文件定位
编译执行
路径分析:
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()方法优先缓存加载,核心模块的缓存检查优先于文件模块的检查。
相关文章推荐
- nodejs 遇到的一个RangeError: Maximum call stack size exceeded 问题
- NodeJS无所不能:细数10个令人惊讶的NodeJS开源项目
- nodejs express 框架解密1-总体结构
- node.js的十大开源项目
- nodejs与websocket的库socket.io的应用
- 解决关于jquery中$.get()方法总是报“HierarchyRequestError: Node cannot be inserted at the specified point in the hierarchy”错的方法
- SKViedoNode类
- SKSpriteNode类
- SKShapeNode类
- SKNode类
- SKLabelNode类
- SKEmitterNode类
- SKEffectNode类
- SKCropNode类
- nodejs:在windows系统中安装node.js 及第一个程序Hello World
- node.js 文章
- java.lang.IllegalArgumentException: node to traverse cannot be null! 处理方法
- node.js async实践分享
- LeetCode(19) Remove Nth Node From End of List
- less-middleware