博客原文地址:Claiyre的个人博客 https://claiyre.github.io/

博客园地址:http://www.cnblogs.com/nuannuan7362/

如需转载,请在文章开头注明原文地址

前言

作为一名前端er,即便没有用过,想必也听说过很多次Node了。在接触Node前,我对它印象大致有:

- 问世不久就迅速风靡web界

- 前端用js就可以写后端了

- 速度快

鉴于它的火热程度和前端er特有的好奇心,博主决定深入了解一下这个神奇的Node。并在此将学习心得记录下来,用于巩固和分享。

正文

Node的作者Ryan Dahl在2009年5月在github上发布了其最初的版本,除了Node这个名字外,它还有很多别称,如Nodejs,NodeJS,Node.js等。它是通过通信协议来组织许多个Node,非常容易通过扩展构建大型应用。每一个Node进程都构成这个网络应用的节点,这也是node名称的由来。

Node的特征

Node只是将前端中广泛应用的思想迁移到了服务器端,它没有改变JavaScript语言本身的任何特性,依旧基于作用域和原型链。它有如下特点:

  1. 异步I/O

    和Ajax原理类似,Node也应用了异步I/O,大多数的Node操作都异步的方式进行调用,无需等待前一调用的结束,极大的提升了效率。以Ajax异步调用为例,下面这张图清楚的阐释了异步I/O的原理:

  2. 事件与回调函数

    Node将前端浏览器中应用广泛且较成熟的引入后端,配合异步I/O,将事件点暴露出来,形成整体逻辑。

    如下面这个例子,服务器端处理Ajax异步提交的过程:

var http = require('http');

//侦听服务器的request事件
http.createServer(function (req,res){
var postData = " ";
req.setEncoding = ('utf8');
//侦听请求的data事件
req.on("data",function (chunk){
postData += chunk;
});
//侦听请求的end事件
req.on("end",function (){
res.end(postData);
});
}).listen(8080);
console.log('服务器已启动');

事件的编程方式具有轻量级,松耦合,只关注事物点等优势,但在多个异步场景下,事件与事件相互独立,如何协作是一个问题。从上面可以看到,回调函数无处不在。Node除了异步和事件外,回调函数也是一大特色。纵观下来,回调函数也是最好的接受异步调用返回数据的方式。

3. 单线程

Node保持了JavaScript在浏览器中是单线程的特点。单线程的最大好处是不用像多线程编程那样处处在意状态的同步问题,既没有死锁的存在,也没有线程上下文切换所带来的性能上的开销。但单线程也有它的缺点,如

- 无法利用多核CPU

- 错误会引起整个应用退出

- 大量计算长时间占用CPU,导致无法继续调用异步I/O

Node利用“子进程机制”来解决这些问题。通过将计算分发到各个子进程,可以将大量计算分解掉。然后再通过进程之间的事件消息传递结果,很好得保持应用模型的简单和低依赖。

4. 跨平台

起初,Node只能在Linux平台上。随着Node的发展,微软注意到了它的存在并投入了一个团队帮助Node实现Windows平台的兼容。下图是Node基于libuv实现跨平台的架构示意图:

Node的使用者

  • 前后端编程环境的统一。这类的代表是雅虎。雅虎开放了Cocktail框架,利用自身身后的前端沉淀,将YUI3这个前端框架的能力要借助Node延伸到了服务器端,使得使用者摆脱了日常工作中一边写JavaScript一边写PHP带来的上下文交换负担。
  • Node带来的高性能I/O用于实时应用。典型代表有腾讯,花瓣网,蘑菇街等。腾讯将NOde应用在长连接中已提供实时功能。后两者通过socket.io实现实时通知。
  • 并行I/O使得使用者可以更高效地利用分布式环境。 阿里巴巴与ebay是这方面的典型。
  • 并行I/O,有效利用稳定接口提升web渲染能力。 放弃同步等待式的顺序请求,大胆采用并行I/O,加速数据获取,从而提升Web的渲染速度。
  • 云计算平台提供Node支持。 微软将Node引入Azure的开发中,阿里云、百度纷纷在云服务器上提供Node应用托管服务。
  • 游戏开发领域。 游戏领域对实时和并发有很高的要求。网易pomelo实时框架,可以应用在游戏和高实时应用中。
  • 工具类应用。过去依赖Java或其他语言编写的工具类应用,纷纷被一些前端工程师用Node重写,用前端熟悉的语言构建熟悉的工具。

结语

Node在开发高并发、高性能的后端服务程序上有着极大的优势,也正是Node,让JavaScript这门仅活跃于网页编程的脚本语言可以驱动复杂的后端程序。个人认为,Node的出现,对前端领域而言,是一次极大的飞跃,值得每一位前端工程师认真对待并学习。

Node学习笔记---初识Node的更多相关文章

  1. node的重点学习笔记(1)————node

    node的重点学习笔记(1)----node 提到node就必须提一下他的npm了,npm是世界上最大的开放源代码的生态系统.通俗来说这就如同亚马逊丛林,要啥物种有啥物种,一个巨大的生态圈,里面有一堆 ...

  2. node学习笔记(二)(ajax方式向node后台提交数据)

    通过ajax向node后台提交数据过程(附手写前后台代码),并总结post与get的区别 POST 前台代码 //CSS简单给点样式 <style> form{ width: 200px; ...

  3. Nodejs全站开发学习系列 & 深入浅出Node学习笔记 & Spider抓取

    https://course.tianmaying.com/node 这个系列的文章看起来很不错,值得学习一下. /Users/baidu/Documents/Data/Interview/Web-S ...

  4. node 学习笔记 - fs 文件操作

    本文同步自我的个人博客:http://www.52cik.com/2015/12/03/learn-node-fs.html 最近看到群里不少大神都开始玩 node 了,我感觉跟他们步伐越来越大了, ...

  5. 将js进行到底:node学习笔记1

    废话:自高中以来一直对编程充满激情,磨剑五年,如今要毕业了,我不想用我已经擅长的知识敷衍,而想以一个全新的领域去面向我的毕设--是时候学习一下node.js node.js基础 对于JavaScrip ...

  6. Node.js学习笔记(1) - Node.js简介

    近期在看一些Node.js的知识,看完后觉得,一些前面的东西忘记了,于是整理一下,方便自己查阅,也希望对学习Node.js的朋友有些帮助: 当然以下只是我个人的观点和理解,不喜勿喷,也望大神指教. 一 ...

  7. node学习笔记第一天

    ES6---* JavaScript语言随着使用的人越来越多,ECMA语法规范:if/else* 为了让js语言更适应大型应用的开发.旨在消除一些怪异的行为 ### 包含内容(strict严格模式)- ...

  8. node.学习笔记(关于http2的讲解)

    个人总结:读完这篇文章需要30分钟 http2部分很有学习价值,可以好好看.  用node搭建TCP服务器 用node搭建HTTP服务器 用node文件fs模块对文件读取,并用流的方式写入 用url路 ...

  9. node学习笔记(一)本地文件目录查看器

    Node.js 新闻 nw.js 前端开发桌面应用 内容 node.js实战 照例提供百度云链接,本来以为是实战系列的那本,但不是,不过这本也不错 链接:https://pan.baidu.com/s ...

随机推荐

  1. NOIP2016原题终结测试(2017081801)

    NOIP2016还有几道原题没有写掉,今天就一并布置掉. 答案的问题,有部分会先放到NOIP题解中,是单独发布的. 最后会汇总放在答案中,各位不要急. 还有,后期会有原创题测试,这个不急,反正11月才 ...

  2. idea下启动tomcat时,打印的日志中文乱码

    idea2018.2+tomcat8+java8+win10 异常:将编码方式全都修改为UTF-8后,且tomcat的VM启动参数中配置了:-Dfile.encoding=UTF-8.导致控制台日志打 ...

  3. mac os 卸载android studio 从新安装遇到的一些问题

    http://blog.csdn.net/elonspace/article/details/51800949 google中国论坛 http://www.android-studio.org lin ...

  4. Tomcat入门

    1.JavaWeb概念 Java web,是用java技术来解决相关web互联网领域的技术的总称.web包括:web服务器和web客户端两部分.java在最早web客户端的应用有java applet ...

  5. 微信小程序之下拉加载和上拉刷新

    微信小程序下拉加载和上拉刷新两种实现方法 方法一:onPullDownRefresh和onReachBottom方法实现小程序下拉加载和上拉刷新 首先要在json文件里设置window属性       ...

  6. VB网络编程中Winsock的使用

    原文链接:http://tech.163.com/06/0407/14/2E46BB930009159S.html 如同上面的内容所描述的,不论您使用UDP协议或是TCP协议,Winsock控件都可以 ...

  7. 1105 Spiral Matrix

    This time your job is to fill a sequence of N positive integers into a spiral matrix in non-increasi ...

  8. 闭合浮动的方法css

    浮动是一个有意思(你也可以说它很麻烦)的CSS属性,任何元素设置了浮动,层级就提高了,会影响它后面没设置浮动的元素,这些倒霉的被影响者会跑到浮动层的下面去(当然IE6.IE7除外),那解决方法呢? 常 ...

  9. bzoj5109(图论好题)

    我的参考题解:https://www.cnblogs.com/ccz181078/p/7907022.html: 不过我感觉题解的压位有问题,(1<<x)还不炸上天.不过这题数据水,好像怎 ...

  10. Java并发编程:线程池的使用(转载)

    文章出处:http://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...