到底什么是node.js
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 (node中文网翻译) 换句话说node就是基于JavaScript语言和V-8引擎的开源Web服务器项目,能让JavaScript运行在服务端的开发平台上。前端开发人员刚开始接触node.js的时候,可能有很多概念混淆的地方,因为很少接触服务端的数据处理等操作,于是我对这方面的背景做了一些整理,理解了概念,之后学习的过程才能清晰有效率。
JavaScript:
是一门非常强大的脚本语言,它包含三部分:ECMAScript、DOM、BOM:
- ECMAScript是JavaScript的核心语法
- DOM是HTML和XML的应用程序接口(API),用于控制文档的内容与结构
- BOM(浏览器对象模型)可以对浏览器窗口进行访问和操作
客户端的JavaScript:
目前绝大多数浏览器都有属于他们自己的JS解释器,也就是JavaScript引擎,用来解析嵌入或外部引用在网页中的js代码。浏览器还提供了对DOM的解析,所以客户端的JavaScript不仅应用核心语法ECMAScript,还会操作DOM和BOM。常见的应用场景如用户交互、动画特效、表单验证、发送Ajax请求等等,以上的这些就形成了客户端的JavaScript。
服务端的JavaScript:
此时的JavaScript不依赖浏览器解析,而是由特定的运行环境提供的JavaScript引擎解析执行,例如我们马上就要学习的Node.js。服务器端的JavaScript应用核心语法也是ECMAScript,但是不操作DOM和BOM。它常常用来做一些在客户端做不到的事情,例如操作数据库、操作文件等等。重点:在客户端的ajax操作只能发送请求,而接收请求和做出相应的操作就需要服务器端的JavaScript来完成。
node.js:
不是一门语言,就是提供解析js的特定的运行环境,带有能操作I/O和网络库的V8引擎,因此你能够在浏览器之外使用JavaScript创建shell脚本和后台服务或者运行在硬件上。
总结:客户端的JavaScript主要用来处理页面的交互,而服务器端的JavaScript主要用来处理数据的交互。
1.1 Google浏览器的V8引擎详解:
V8引擎:一种JavaScrip引擎的实现,JavaScript引擎是执行JavaScript代码的程序或解释器。v8是谷歌开源的一个基于C++语言开发的JavaScript引擎,可以实现ECMA-262中规定的ECMAScript,其被用于谷歌浏览器chrome,安卓浏览器,node.js等大型项目当中,V8引擎可以独立运行不依赖于其他环境,也可以嵌入任何的C++应用当中使用。在运行JavaScript之前,相比其它的JavaScript的引擎转换成字节码(经常被看作是包含一个执行程序的二进制文件)或解释执行(不依赖平台,编译器会根据不同的平台进行解析),V8将其编译成原生机器码(其实严格来讲是汇编代码)(IA-32, x86-64, ARM, or MIPS CPUs),并且使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序在V8引擎下的运行速度媲美二进制程序。
1.2. V8工作流程
V8将JavaScript代码进行编译,生成抽象语法树(AST),对作用域进行分析,分辨出局部变量或全局变量,再通过JIT技术将语法树直接转换成原生代码,没有经过字节码的编译,节省了编译时间,得到了不是最优的代码,其后通过数据分析器挑选使用频率高的代码进行优化,若优化后的效果不如之前的话就进行优化回滚。
1.3. 除了V8引擎,还有以下JS引擎:
JavaScriptCore: WebKit中默认的JavaScript引擎,它是苹果开源的一个项目,是苹果Safari浏览器的JavaScript引擎,应用较为广泛。
Mozilla
SpiderMonkey,第一款JavaScript引擎,由Brendan Eich在Netscape Communications时编写,用于Mozilla Firefox 1.0~3.0版本。
Rhino,由Mozilla基金会管理,开放源代码,完全以Java编写。
TraceMonkey,基于实时编译的引擎,其中部份代码取自Tamarin引擎,用于Mozilla Firefox 3.5~3.6版本。
JaegerMonkey,德文Jäger原意为猎人,结合追踪和组合码技术大幅提高性能,部分技术借凿了V8、JavaScriptCore、WebKit,用于Mozilla Firefox 4.0以上版本。
微软
Chakra (JScript引擎),中文译名为查克拉,用于Internet Explorer 9的32位版本。
Opera
Linear A,用于Opera 4.0~6.1版本。
Linear B,用于Opera 7.0~9.2版本。
Futhark,用于Opera 9.5~10.2版本。
Carakan,由Opera软件公司编写,自Opera10.50版本开始使用。
等等。。。。。。
1.4. 浏览器端和服务器端JavaScript的组成区别
浏览器端:
- ECMAScript,描述了JavaScript语言的语法和基本对象
- 文档对象模型(DOM),描述处理网页内容的方法和接口
- 浏览器对象模型(BOM),描述与浏览器进行交互的方法和接口
服务器端:
- ECMAScript
- node.js内置模块:文件系统I/O、网络(HTTP、TCP、UDP、DNS、TLS/SSL等)、二进制数据流、加密算法、数据流等等