global对象
浏览器中,全局对象是window。window对象上定义的任何内容都可以被全局访问。
node中有两个类似但却各自代表不同含义的对象:
- global:和window一样,任何global对象上的属性都可以被全局访问到
- process:所有全局执行上下文中的内容都在process中。浏览器中,只有一个window对象,node中,也只有一个process对象。举例来说,浏览器窗口名字是window.name,类似,node中进程名称是process.title
模块系统
js原生态是一个全局的世界,所有如setTimeout、document等这样在浏览器端使用的api,都是全局定义的。js语言标准中并未为模块独立定义专门的API。以往的通过script标签引入第三方模块时,会导致引入的多个模块对全局命名空间的污染及命名冲突问题。
node内置了很多实用的模块作为基础工具(如http,fs等),node摒弃了采用定义一堆全局变量的方式,转而引入一个简单却强大的模块系统,该模块系统有三个全局对象:require,module和exports。
- 绝对模块:指node通过在其内部node_modules查找到的模块,或者node内置的如fs这样的模块。可以直接通过名字require这个模块,无须添加路径名:require("xxx")
- 相对模块:将require指向与一个相对工作目录中的js文件。
暴露API
要让模块暴露一个API成为require调用的返回值,就要依靠modole和exports。默认情况下,每个模块都会暴露出一个空对象,如果你想要在该对象上添加属性,那么简单实用exports即可:
let apiRootUrl="http://www.baidu.com";
exports.getRootUrl=function(){
return apiRootUrl;
}
exports就是对module.exports的引用,在默认情况下是一个对象,要是在该对象上逐个添加属相无法满足需求,可以重写module.exports。
function Person(name){
this.name=name;
}
Person.prototype.sayHi=function(){
console.log("hi,我叫"+this.name)
}
module.exports=Person;
事件
node中基础API之一就是EventEmitter。无论在node还是浏览器中,大量代码都依赖于所监听或分发的事件。
node中暴露了EventEmitter API,该API定义了on,emit以及removeLIstener方法。它以process.EventEmitter形式暴露出来。
buffer
除了模块以外,node还弥补了语言另外一个不足之处,那就是对二进制数据的处理。
buffer是一个表示固定内存分配的全局对象(也就是说,要放到缓冲区中的字节数需要提前顶下),它就好比一个由八位字节元素组成的数组,可以有效地在js中表示二进制数据。
该功能一部分作用就是可以对数据编码转换。比如可以将一副用base64表示的图片将其作为二进制png图片形式写入文件中。