大佬教程收集整理的这篇文章主要介绍了Node.js之模块系统,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
模块系统
1、什么是模块
2、模块作用域
3、require
require("路径")
//路径现阶段使用相对路径
① 是module.exports的一个别名、引用,exports能做的module.exports都可以完成。
② 为了方便,Node为每个模块提供一个exports变量,指向module.exports。
相当于在每个模块头部,有这样一行命令:
var exports = module.exports;
结果就是:在对外输出模块接口时,可以向exports对象添加方法
③ 注意:不能直接给exports赋值,因为这样等于切断了exports和module.exports的联系
@H_264_32@module.exports 别名
@H_264_32@module.exports=123;已经使用过一次了,exports就不生效了
@H_264_32@module.exports.a=12;这样使用,exports是还可以使用的
补充: @H_172_14@module对象
1、 是一个全局对象,它的作用是存储模块信息的。每一个js是一个模块,每一个模块里面都有@L_930_0@module,module里面还存储了父子结构。直接给module.exports赋值,exports是无效,用属性的形式去赋值的时候二者都有效。
2、Node内部提供@L_930_0@module构造函数,所有模块都是Module的实例。
每个模块内部,都有@L_930_0@module对象,代表当前模块。
在Node.js中,模块分为两类:
第一类,核心模块(原生模块),node自带,用名称直接可以加载。
- 核心模块
fs: file sy@L_944_24@与文件系统交互
http: 提供http服务器功能
os
path: 处理文件路径
queryString : 解析url查询字符串
url:解析url
util: 提供一系列实用小工具
...
核心模块的源码都在Node的lib子目录中。为了提高运行速度,它们安装的时候都会被编译成二进制文件。
第二类,文件模块,用路径加载,用户自己编写的模块。有一种特殊的文件模块—–>包,可以直接用名字。
规范的包目录结构:
package.json : 包描述文件,说明文件
Bin : 存放可执行二进制文件的目录
Lib : 存放JavaScript代码的目录
Doc : 存放文档的目录
Test : 存放单元测试用例的代码
其中package.json:
name
包的名称
description
包的简介
version
包的版本号
keywords
关键词数组,用于在npm中分类搜索
author
包的作者
main
配置包的入口,默认是模块根目录下的index.js
dependencies
包的依赖项,npm会通过该属性自动加载依赖包
scripts
指定了运行脚本命令的npmm命令行缩写,例如start
package.json全字段解析](http://www.voidcn.com/article/p-fpclbowo-mw.html)
一个例子:
//test_package/node_modules/myPackage/package.json
{
"name": "test","version": "0.0.1","description": "","main": "index.js","keywords": [
],"author": "KingNigel","repository": {
"type": "git","url": "https://github.com/KingNigel/test.git"
},"bugs": {
"url": "https://github.com/KingNigel/test/issues"
},"license": "MIT","devDependencies": {
"test": "*"
},"dependencies": {
"test": "*"
}
}
//test_package/node_modules/myPackage/index.js
exports.a=123;
//test_package/index.js
var foo = require('myPackage'); //文件夹名就是包名
console.log(foo); //{a:123}
common.js规范----->加载后,再次加载时,去缓存中取@H_264_32@module.exports
只在第一次加载的时候,从硬盘中读取js,执行代码,缓存整个module对象。第二次加载去缓存中取module.exports。
//add.js
var add = function(a,b){
return a+b;
}
module.exports = add;
console.log('执行add.js');
//sub.js
var sub = function(a,b){
return a-b;
}
module.exports = sub;
console.log('执行sub.js');
//math.js
var add1 = require('./add.js');
var add2 = require('./add.js');
var add3 = require('./add.js');
var sub1 = require('./sub.js');
console.log(add1(3,5));
console.log(add3(1,5));
//执行结果:
执行add.js
执行sub.js
8
6
测试结果可知,add1和add3只加载一次;sub没有使用,也会加载执行
参数字符串不以“./“或”/”开始
标识符中可以不包含扩展名
.js、.node、.json
的次序补足扩展名,依次尝试
最终获取到的是module.exports
//@H_118_33@myrequire.js
function Myrequire(path) {
//定义一个构造@L_971_12@module
function Module() {
this.exports = {};
}
var fs = require('fs');
//同步读取文件,文件的内容source
var source = fs.readFileSync(path,'utf-8');
//拼接代码变成一个函数的String
var package = '(function(exports,modulE){' + source + ' return module.exports;})';
var packObj = eval(packagE);
//调用构造函数创建Module
var @H_264_32@module = new Module();
//var exports = @H_264_32@module.exports 把@H_264_32@module.exports当实参传入,exports当形参去接
var obj = packObj(@H_264_32@module.exports,@H_264_32@module);
return obj;
}
var foo = Myrequire('./hia.js');
console.log(foo);
console.log(foo.a);
foo.fun();
//hia.js
var a = 123;
var fun = function(){
console.log("我是fun函数");
}
console.log("Helloworld");
exports.a=a;
exports.fun = fun;
@H_812_489@参考文档:
package.json全字段解析:
(http://www.voidcn.com/article/p-fpclbowo-mw.html)
参考田永强《深入浅出nodejs》:(http://www.infoq.com/cn/articles/nodejs-module-mechanism/)
以上是大佬教程为你收集整理的Node.js之模块系统全部内容,希望文章能够帮你解决Node.js之模块系统所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。