使用Node编写应用程序主要就是在使用:
- EcmaScript语言
- 和浏览器一样,在Node中没有Bom和Dom
- 核心模块
- 文件操作的fs
- http服务操作的http
- url路径操作模块
- path路径处理模块
- os操作系统信息
- 第三方模块
- art-template
- 必须通过npm来下载才可以使用
- 自己写的模块
- 自己创建的文件
什么是模块化
- 文件作用域(模块是独立的,在不同的文件使用必须要重新引用)【在node中没有全局作用域,它是文件模块作用域】
- 通信规则
- 加载require
- 导出exports
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yM0YTOyQTM5UDMyEjY4IzMzYzX2AzMzMTM3IzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
CommonJS模块规范
在Node中的JavaScript还有一个重要的概念,模块系统。
- 模块作用域
- 使用require方法来加载模块
- 使用exports接口对象来导出模板中的成员
加载 require
require
语法:
var 自定义变量名 = require('模块')
作用:
- 执行被加载模块中的代码
- 得到被加载模块中的
导出接口对象exports
导出 exports
exports
- Node中是模块作用域,默认文件中所有的成员只在当前模块有效
- 对于希望可以被其他模块访问到的成员,我们需要把这些公开的成员都挂载到
接口对象中就可以了exports
导出多个成员(必须在对象中):
.a = 123;
exports.b = function(){
console.log('bbb')
};
exports.c = {
foo:"bar"
};
exports.d = 'hello';
也可以通过以下方法来导出多个成员:
.exports = {
foo: 'hello',
add: function () {
return x + y;
}
};
直接加载的就是某一个方法或者成员变量
- 如果一个模块需要直接导出来,而非挂载的方式
.exports = add;
但是,貌似
.exports = add;
//无意间发现的一个也可以嗷
导出单个成员(直接加载拿到的就是函数,字符串):
.exports = 'hello';
以下情况会覆盖:
.exports = 'hello';
//后者会覆盖前者
module.exports = function add(x,y) {
return x+y;
}
模块原理
.log(exports === module.exports); //true
exports.foo = 'bar';
//等价于
module.exports.foo = 'bar';
真正去使用的时候:
导出单个成员:exports.xxx = yyy;
导出多个成员:module.exports 或者 modeule.exports = {};
其实也就是
var module ={
exports:{
foo:'bar',
add:function(){
// ……
}
}
}
- 每一个模块中都有一个
对象module
- module对象中有一个
对象exports
- 我们可以把需要导入的成员挂到
接口对象module.exports
- 也就是
的方式module.exports.XXX= XXX
- 但是每次的
的方式很麻烦,点儿太多了module.exports.XXX= XXX
- 所以为了方便就是在每一块模块中提供了一个成员叫
-exports
结果为exports === module.exports.xxx
TRUE
- 所以对于是
的方式完全可以exports === module.exports.xxx
的方式expots.xxx=xxx
- 不要使用
不管用exports = xxx
- 因为一个每个模块最终向外
的是return
moudle.exports
- 而
只是exports
是一个引用moudle.exports
- 所以即便是
重新赋值,也不会影响exports = xx
moudle.esports
- 但是有一种赋值方式
这个用来重新建立引用关系exports = moudle.exports