对于前端而言,虽然不是人人都要拿 Node 写一个服务器程序,但简单可至使用命令交互模式调试 JS 代码片段,复杂可至编写工具提升工作效率。
相信很多初学者和我一样之前学习使用过 Node,可是要是问我 Node 是什么,我还是不清楚。便想着那就边总结边重新学习一遍 Node 吧,也因此这篇文章在不断地更改完善中,且不会涉及到 Node 的安装使用。
什么是 Node ?
JS是脚本语言,脚本语言都需要一个解析器才能运行。对于写在HTML页面里的JS,浏览器充当了解析器的角色。而对于需要独立运行的JS,NodeJS就是一个解析器。
每一种解析器都是一个运行环境,不但允许 JS 定义各种数据结构,进行各种计算,还允许 JS 使用运行环境提供的内置对象和方法做一些事情。例如运行在浏览器中的 JS 的用途是操作 DOM,浏览器就提供了 document 之类的内置对象。而运行在 Node 中的 JS 的用途是操作磁盘文件或搭建 HTTP 服务器,Node 就相应提供了 fs、http 等内置对象。
简单的说 Node.js 就是运行在服务端的 JavaScript。
Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。
Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境,基于 Google 的 V8 引擎,V8 引擎执行 Javascript 的速度非常快,性能非常好。
Node 为什么会出现
解决什么问题
提供一种简单的、用于创建高性能服务器及可在该服务器中运行的各种应用程序的开发工具。
Web 的发展导致的问题:
- 服务器端语言中存在的问题。
在 Java、PHP 或 ASP.NET 等服务器端语言中,为每一个客户端连接创建一个新的线程,而每个线程需要耗费大约 2MB 的内存,也就是说,理论上,具有 8GB 内存的服务器可以同时连接的最大用户数为 4000 个左右。要让 Web 应用程序支持更多的用户,就需要增加服务器的数量,而 Web 应用程序的硬件成本也就随之增加了。 - 技术层面潜在的问题。
例如,由于同一个用户的不同客户端请求可能会被不同的服务器处理,因此必须在所有的服务器之间共享所有的资源。
由此可见,在一个 Web 应用程序中,一个主要的瓶颈是服务器所支持的最大同时连接用户量。
为什么使用 JavaScript
Ryan Dahl 最初的目的是写一个基于事件驱动、非阻塞 I/O 的 Web 服务器,以达到更高的性能,提供 Apache 等服务器之外的选择。
- 高性能
- 符合事件驱动
- 没有历史包袱
学习一个新的知识,首先要去了解它的历史,了解它为什么会出现。下面是一些我认为比较重要的时间点:
JavaScript 革命
1994 年,网景公司公布服务器端 JavaScript -- LiveWire 。
LiveWire 致命错误:把堵塞式输入/输出包含在内,并在服务器端使用多进程模型,因而可扩展性不好。
1995 年,Brendan Eich 发明了 JavaScript 语言。这是一个在 Netscape Navigator 浏览器运行的脚本语言。
1996 年,第一次浏览器大战。11月,网景公司将 JavaScript 递交给 ECMA 国际标准组织。
1997 年 7 月公布第一个版本,ECMA-262 号标准,又称 ECMAScript 。
服务器端 JavaScript 逐渐式微。
2005 年,Google 通过其 Google Suggest 使 AJAX 变得流行起来。
第二次浏览器大战
CommonJS 规范的提出
ECMAScript 标准的不断推进
JavaScript 的逐渐完善
......
2009 年,Ryan Dahl 利用 Google 的 V8 引擎打造了基于时间循环实现的异步 I/O 框架---Node 。(JavaScript 之前没有任何 I/O 库)
Node 给 JavaScript 带来的意义
Node 打破了过去 JavaScript 只能在浏览器中运行的局面。前后端编程环境统一,可以大大降低前后端转换所需要的上下文交换代价。
- 在 Node 中,JavaScript 可以随心所欲的访问本地文件,可以搭建 WebSocket 服务器端,可以连接数据库。
- 如今,JavaScript 可以运行在不同的地方,不再限制在与浏览器中与 CSS 样式表、DOM 树打交道。
- Node 不处理 UI ,但用与浏览器相同的机制和原理运行。
- Node 不仅能够构建服务器端,而且能够适应日益提高的产能,还可以很方便的进行 JavaScript 客户端程序开发,并能够促进代码重用和进化。
- 如果没有 Node,JavaScript 将只能绑定在 Web 客户端上,其备受职责的文档对象模型以及其他一些历史遗留问题将会日益突出。
- Node 帮助 JavaScript 摆脱了客户端的限制。
---Brendan Eich
Node 的特点
1.异步 I/O
2.事件与回调函数
3.单线程
4.跨平台
与其他流行的 Web 服务器(IIS、Apache)的不同之处
- 搭建和配置非常容易
- 解释型语言,没有单独的编译步骤,减少了维护和部署的麻烦
- 单线程
- 平台无关性
在哪些场合应该考虑使用 Node ?
- I/O 密集型
- 需要保留原有的系统
- 分布式应用
待续。。。
参考资料:
《Node.js 权威指南》
《深入浅出 Node.js》
《七天学会 NodeJS》
网友评论