目录
一、简介
Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。
单线程
由于ECMAScript标准存在没有模块系统的缺陷,导致代码耦合度高,复用率低,而CommonJS的模块功能可以帮助我们解决该问题。
(一)CommonJS规范
- CommonJS规范的提出,主要是为了弥补当前JavaScript没有标准的缺陷。
- CommonJS规范为JS指定了一个美好的愿景,希望JS能够在任何地方运行。
- CommonJS对模块的定义十分简单:-模块引用 -模块定义 -模块标识
(二)Node的用途
- Web服务API,比如REST
- 实时多人游戏
- 后端的Web服务,例如跨域、服务器端的请求
- 基于Web的应用
- 多客户端的通信,如即时通信
二、模块化
在Node中,一个js文件就是一个模块,我们可以通过require()函数来引入外部的模块
/**
* 在Node中,每一个js文件中的js代码都是独立运行在一个函数中,而不是全局作用域,
* 所以一个模块中的变量和函数在其他函数中无法访问
* */
// 1.js
var x = 0;
var y = 0;
// 2.js
var module = require('./1');
console.log(module.x); // not defind,因为x在1.js中被函数包住了,无法通过require返回的对象直接获取x的值
/**
*
* 想要2.js获取到x需要向外部暴露x:
*/
//1.js
exports.x = "我是1.js中的x"
//2.js
var md = require("./1");
console.log(md.x)
/**
* 在Node中有一个全局对象global,它的作用和网页中window类似
* 在全局中创建的变量都会作为global的属性保存
* 在全局中创建的函数都会作为global的方法保存
*
* 当Node在执行模块中的代码时,它首先会将所有代码包在一个函数内:
* function (exports, require, module, __filename, __dirname)
* 从函数的参数可以看出,实现元素暴露与引用的exports和require都是在这个函数中声明的
* */
// console.log(global);
console.log(arguments.callee + "") //arguments.callee保存的时当前执行的函数对象
如果定义一个a:“var a = 1”,a实际是被包在函数内的,因此a实际上是不在全局作用域的,全局对象global的“global.a”方法也就无法获取a的实际值;想要将a写到全局作用域需要去掉var,直接“a = 1”,这样global才可以获取到a的值。
对于默认添加的function函数:
exports | 该对象用来将变量或函数暴露到外部 |
require | 函数,用来引入外部模块 |
module | 代表的是当前模块本身 (exports就是module的属性:module.exports = exports) |
__filename | 当前模块的完整路径 |
__dirname | 当前模块所在文件夹的完整路径 |
module.exports与exports的区别:
exports相当于module对象的一个属性,因此在平常使用时二者是无差别的,但是如果想要暴露多条数据,可以使用&