博客原文地址: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. BP神经网络测试MNIST记录

    约定: 所有的初始化权值范围,如下,就是说更换激活函数的情况,没有过大的调整初始权重. if(randomMode==1): numpy.random.seed(seedWih) self.wih = ...

  2. 核心一:IoC

    IoC 1.中文名称:控制反转 2.英文名称:(Inversion of Control) 3.IoC是什么? 3.1 IoC 完成的事情原先由程序员主动通过new 实例化对象事情,转交给Spring ...

  3. Apache和nginx 域名配置

    apache配置 一.hosts配置: 1.用编辑器打开hosts文件,位置:C:\Windows\System32\drivers\etc目录下 2.在hosts文件里添加自己的域名配置,配置规则如 ...

  4. 4. Father's Impact on a Child's Language Development 父亲对孩子语言发展的影响

    4. Father's Impact on a Child's Language Development 父亲对孩子语言发展的影响 (1)Im families with two working pa ...

  5. 师弟推荐软件-/mathpix

    将公式扫描为latex:https://mathpix.com/api.html mathtype与latex转换:http://www.mathtype.cn/jiqiao/zhuanhua-gon ...

  6. centos6上安装jenkins

    一.安装jdk 1.下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...

  7. UVaLive 3357 Pinary (Fib数列+递归)

    题意:求第 k 个不含前导 0 和连续 1 的二进制串. 析:1,10,100,101,1000,...很容易发现长度为 i 的二进制串的个数正好就是Fib数列的第 i 个数,因为第 i 个也有子问题 ...

  8. Vue上传文件:ElementUI中的upload实现

    一.上传文件实现 两种实现方式: 1.直接action <el-upload  .利用before-upload属性 此种方式有个弊端,就是action是必选的参数,那么action如果和pos ...

  9. noip第6课作业

    1.    数据统计 [问题描述] 输入N个整数,求出它们的最小值.最大值和平均值(保留3位小数).输入保证这些数都是不超过1000的整数.(1<=N<=1000) [样例输入] 8 2 ...

  10. std::set 中内部元素有序条件删除的理解

    std::set 中内部元素有序条件删除的理解 1. std::set中的元素是有序排列的 注意:Set集合中的元素通过iterator的引用,但是不能修改. 元素排序: (1)元素中实现比较oper ...