CommonJS规范:弥补javascript天然不足的问题,规定了模块化开发的整体规则
1:引用模块
var http = require("http");
2、模块定义规则:
将方法作为exports的属性进行输出,
// math.js
exports.add = function() {
var sum = 0;
i = 0;
args = arguments,
l = args.length;
while(i<l){
sum += args[i++];
}
return sum;
};
// 在其他js代码中调用导出的模块
var math = require("math");
}
3、模块标识,传给require()方法的参数,它是必须符合小驼峰命名的字符串,或者以..或者.开头的的相对路径,或者绝对路径,可以没有后缀名js ;
Node 中引进模块的步骤:
(1)路径分析 (2)文件定位(3)编译执行
模块分为两类,一类是Node的核心模块,一个是用户自定义的模块,成为文件模块;文件模块需要在 运行时进行加载,速度比核心的慢
node对引入过的js代码会进行缓存,减少二次加载的开销;
如何进行路径分析和文件定位,在require()函数中的代码如何实现路径解析的呢?
模块分为核心模块和文件模块,如果是Node自带的一些模块,例如"http", "fs",require中只要指定
1、核心模块,"http", "fs",
2、以..或.开头的相对文件模块,
3、以/开头的绝对路径模块,
4、非路径形式的模块,如自定义的Connector模块;
console.log(module.paths) // 先在此js所在的文件夹下寻找指定的js文件,没找到则一次递归在父目录中寻找;
小诀窍,在指定文件的后缀,当模块不是以js结尾的情况下,用于快速加载js代码;
出现目录的名称和require()中的参数相同,则Node将目录当作一个包来处理,Node现在当前目录下查找package.json文件,通过JSON.parse()解析出包描述符对象,
读取main属性所指定的文件模块名称,然后对此模块名进行解析;
如果没有package.json文件,则以index作为文件模块名进行解析查找;
最后依然找不到,则抛出异常;
模块编译:
编译和执行是引入文件模块的最后步骤,Node会新建一个模块对象,然后根据路径载入编译,不同的后缀,载入方法也是不一样的,例如js后缀的fs模块进行加载,
.json后缀的以JSON.parse()函数解析,.node后缀以Node的C++模块dlopen()函数进行载入;
在Node中,每个文件模块都是一个对象,文件模块的定义如下:
function Module(id, parent) {
this.id = id;
// 导出对象
this.exports = {}
this.parent = parent;
if(parent && parent.children) {
parent.children.push(this)
}
this.filename = null;
this.loaded = false;
this.children = [] ;
}
每一个编译成功的模块,都会被缓存起来,作为索引存储在Module._cache对象上;
加载定义后缀的模块,设置require.extensions属性,require.extensions['.ext']
Node文件封装隔离,消除名称污染;
创建一个npm包的全过程:
(1)创建一个目录, mkdir demo, cd demo,创建文件hello.js文件 :
(2)调用npm init命令初始化package.json包;
(3)注册包仓库帐号
npm adduser
(4)上传包到npm仓库 npm publish
1:引用模块
var http = require("http");
2、模块定义规则:
将方法作为exports的属性进行输出,
// math.js
exports.add = function() {
var sum = 0;
i = 0;
args = arguments,
l = args.length;
while(i<l){
sum += args[i++];
}
return sum;
};
// 在其他js代码中调用导出的模块
var math = require("math");
}
3、模块标识,传给require()方法的参数,它是必须符合小驼峰命名的字符串,或者以..或者.开头的的相对路径,或者绝对路径,可以没有后缀名js ;
Node 中引进模块的步骤:
(1)路径分析 (2)文件定位(3)编译执行
模块分为两类,一类是Node的核心模块,一个是用户自定义的模块,成为文件模块;文件模块需要在 运行时进行加载,速度比核心的慢
node对引入过的js代码会进行缓存,减少二次加载的开销;
如何进行路径分析和文件定位,在require()函数中的代码如何实现路径解析的呢?
模块分为核心模块和文件模块,如果是Node自带的一些模块,例如"http", "fs",require中只要指定
1、核心模块,"http", "fs",
2、以..或.开头的相对文件模块,
3、以/开头的绝对路径模块,
4、非路径形式的模块,如自定义的Connector模块;
console.log(module.paths) // 先在此js所在的文件夹下寻找指定的js文件,没找到则一次递归在父目录中寻找;
小诀窍,在指定文件的后缀,当模块不是以js结尾的情况下,用于快速加载js代码;
出现目录的名称和require()中的参数相同,则Node将目录当作一个包来处理,Node现在当前目录下查找package.json文件,通过JSON.parse()解析出包描述符对象,
读取main属性所指定的文件模块名称,然后对此模块名进行解析;
如果没有package.json文件,则以index作为文件模块名进行解析查找;
最后依然找不到,则抛出异常;
模块编译:
编译和执行是引入文件模块的最后步骤,Node会新建一个模块对象,然后根据路径载入编译,不同的后缀,载入方法也是不一样的,例如js后缀的fs模块进行加载,
.json后缀的以JSON.parse()函数解析,.node后缀以Node的C++模块dlopen()函数进行载入;
在Node中,每个文件模块都是一个对象,文件模块的定义如下:
function Module(id, parent) {
this.id = id;
// 导出对象
this.exports = {}
this.parent = parent;
if(parent && parent.children) {
parent.children.push(this)
}
this.filename = null;
this.loaded = false;
this.children = [] ;
}
每一个编译成功的模块,都会被缓存起来,作为索引存储在Module._cache对象上;
加载定义后缀的模块,设置require.extensions属性,require.extensions['.ext']
Node文件封装隔离,消除名称污染;
创建一个npm包的全过程:
(1)创建一个目录, mkdir demo, cd demo,创建文件hello.js文件 :
(2)调用npm init命令初始化package.json包;
(3)注册包仓库帐号
npm adduser
(4)上传包到npm仓库 npm publish