一,在使用node 编写应用程序主要就是
Ecmascript语言:和浏览器不一样,没有BOM,DOM
核心模块:文件操作的fs,http服务的http,url 路径操作模块,path 路径处理模块,os 操作系统模块
第三方模块:art-template
自己写的模块:自己创建的文件
二,commonJS模块规范
1.什么是模块化
文件作用域
通信规则 :加载require 导出
在Node中的javascript还有一个很重要的概念:模块系统
模块作用域
使用requirez方法用来加载模块
使用exports 接口对象来导出模块中的成员 如果一个模块需要直接导出某个成员,
1.1 加载require
语法:var 自定义变量名称 = require('模块')
两个作用:
1.执行被加载模块中的代码 2.得到被加载模块中exports导出接口对象
1.2 导出exports
Node 中是模块作用域,默认当前文件所有成员只在当前文件模板有效,对于希望被其他模块访问的成员,我们需要把这些公开的成员挂载到exports 接口对象就可以了,导出多个成员。(必须在对象中)
// 在 Node 中,每个模块内部都有一个自己的 module 对象
// 该 module 对象中,有一个成员叫:exports 也是一个对象
// 也就是说如果你需要对外导出成员,只需要把导出的成员挂载到 module.exports 中
// 我们发现,每次导出接口成员的时候都通过 module.exports.xxx = xxx 的方式很麻烦,点儿的太多了
// 所以,Node 为了简化你的操作,专门提供了一个变量:exports 等于 module.exports
// var module = {
// exports: {
// foo: 'bar',
// add: function
// }
// }
// 也就是说在模块中还有这么一句代码
// var exports = module.exports
// module.exports.foo = 'bar'
// module.exports.add = function (x, y) {
// return x + y
// }
// 两者一致,那就说明,我可以使用任意一方来导出内部成员
// console.log(exports === module.exports)
// exports.foo = 'bar'
// module.exports.add = function (x, y) {
// return x + y
// }
// 当一个模块需要导出单个成员的时候
// 直接给 exports 赋值是不管用的
// exports.a = 123
// exports = {}
// exports.foo = 'bar'
// module.exports.b = 456
// 给 exports 赋值会断开和 module.exports 之间的引用
// 同理,给 module.exports 重新赋值也会断开
// 这里导致 exports !== module.exports
// module.exports = {
// foo: 'bar'
// }
// // 但是这里又重新建立两者的引用关系
// exports = module.exports
// exports.foo = 'hello'
// {foo: bar}
exports.foo = 'bar'
// {foo: bar, a: 123}
module.exports.a = 123
// exports !== module.exports
// 最终 return 的是 module.exports
// 所以无论你 exports 中的成员是什么都没用
exports = {
a: 456
}
// {foo: 'haha', a: 123}
module.exports.foo = 'haha'
// 没关系,混淆你的
exports.c = 456
// 重新建立了和 module.exports 之间的引用关系了
exports = module.exports
// 由于在上面建立了引用关系,所以这里是生效的
// {foo: 'haha', a: 789}
exports.a = 789
// 在这里都全部推翻了,重新赋值
// 最终得到的是 Function
module.exports = function () {
console.log('hello')
}
// 真正去使用的时候:
// 导出多个成员:exports.xxx = xxx
// 导出多个成员也可以:module.exports = {
// }
// 导出单个成员:module.exports
// 谁来 require 我,谁就得到 module.exports
// 默认在代码的最后有一句:
// 一定要记住,最后 return 的是 module.exports
// 不是 exports
// 所以你给 exports 重新赋值不管用,
// return module.exports
exports 和 module.exports 的区别
+ 每个模块中都有一个 module 对象
+ module 对象中有一个 exports 对象
+ 我们可以把需要导出的成员都挂载到 module.exports 接口对象中
+ 也就是:`moudle.exports.xxx = xxx` 的方式
+ 但是每次都 `moudle.exports.xxx = xxx` 很麻烦,点儿的太多了
+ 所以 Node 为了你方便,同时在每一个模块中都提供了一个成员叫:`exports`
+ `exports === module.exports` 结果为 `true`s
+ 所以对于:`moudle.exports.xxx = xxx` 的方式 完全可以:`expots.xxx = xxx`
+ 当一个模块需要导出单个成员的时候,这个时候必须使用:`module.exports = xxx` 的方式
+ 不要使用 `exports = xxx` 不管用
+ 因为每个模块最终向外 `return` 的是 `module.exports`
+ 而 `exports` 只是 `module.exports` 的一个引用
+ 所以即便你为 `exports = xx` 重新赋值,也不会影响 `module.exports`
+ 但是有一种赋值方式比较特殊:`exports = module.exports` 这个用来重新建立引用关系的
+ 之所以让大家明白这个道理,是希望可以更灵活的去用它
- Node 是一个比肩 Java、PHP 的一个平台
+ JavaScript 既能写前端也能写服务端
+ 每个模块中都有一个 module 对象
+ module 对象中有一个 exports 对象
+ 我们可以把需要导出的成员都挂载到 module.exports 接口对象中
+ 也就是:`moudle.exports.xxx = xxx` 的方式
+ 但是每次都 `moudle.exports.xxx = xxx` 很麻烦,点儿的太多了
+ 所以 Node 为了你方便,同时在每一个模块中都提供了一个成员叫:`exports`
+ `exports === module.exports` 结果为 `true`s
+ 所以对于:`moudle.exports.xxx = xxx` 的方式 完全可以:`expots.xxx = xxx`
+ 当一个模块需要导出单个成员的时候,这个时候必须使用:`module.exports = xxx` 的方式
+ 不要使用 `exports = xxx` 不管用
+ 因为每个模块最终向外 `return` 的是 `module.exports`
+ 而 `exports` 只是 `module.exports` 的一个引用
+ 所以即便你为 `exports = xx` 重新赋值,也不会影响 `module.exports`
+ 但是有一种赋值方式比较特殊:`exports = module.exports` 这个用来重新建立引用关系的
+ 之所以让大家明白这个道理,是希望可以更灵活的去用它
- Node 是一个比肩 Java、PHP 的一个平台
+ JavaScript 既能写前端也能写服务端