nodejs 与javascript 关系

node.js是什么?和JavaScript有什么关系?

关于node.js究竟是什么,大家的问题在于

node.js是不是一门语言?
node.js是不是一个JavaScript库函数?
node.js是不是一个JavaScript框架?

很遗憾,这三个问题的答案都是NO,看看官方对自己的描述

Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

官方很明确地说node.js是一个platform,也就是一个做xxx的平台。node.js是一个可以在服务器端运行JavaScript的平台,其实这句话华也不准确,按照《JavaScript权威指南》《JavaScript高级程序设计》等书中的定义,JavaScript是由两部分组成

core JavaScript
client JavaScript(DOM、BOM)
而只有core JavaScript可以在node.js上运行,所以node.js借用了JavaScript的语法,但并不能用来处理浏览器对象(BOM)及文档对象(DOM),所以node.js并不是设计为在服务器端运行解析html文档的(当然有module可以做此事),所以“在服务器端运行的JavaScript”在一定程度上误导了初学者。

同时node.js并不仅仅运行core JavaScript,node.js中还有文件系统、模块包、操作系统API、网络通信、二进制类型处理等core JavaScript不具备的功能。

nodejs 底层*nix 与window的区别
img

node w3c js关系
img

在nodejs中引入模块,需要经历3个步骤:
1 路径分析
2 文件定位
3 编译执行

node中分为核心模块(http/fs/path)与文件模块
在node进程启动过程中,部分核心模块被直接加载进内存中,所以这部分核心模块引入时,文件定位及编译执行这两个步骤可以省略掉,并且在路径分析中优先判断,所以他们的加载速度是最快的。

每个模块文件中都存在require、exports、module这三个变量,甚至还有filename、dirname

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
console.log(module.paths);
console.log(require.extensions);
console.log(__filename);
console.log(__dirname);
/* *
[ '/Users/liuhui/Desktop/mylab/pkg/node_modules',
'/Users/liuhui/Desktop/mylab/node_modules',
'/Users/liuhui/Desktop/node_modules',
'/Users/liuhui/node_modules',
'/Users/node_modules',
'/node_modules' ]
{ '.js': [Function], '.json': [Function], '.node': [Function] }
/Users/liuhui/Desktop/mylab/pkg/module_path.js
/Users/liuhui/Desktop/mylab/pkg
*/

这是因为编译过程中,node对获取的js文件进行了头尾包装,在头部加上了

1
2
3
4
5
6
7
(function(exports,require,module,__filename,__dirname){
var math = require('math');
exports.area = function(radius){
return Math.PI*radius*radius
};
})
require、exports、module就是node对commonjs规范的实现