Node学习笔记---初识Node
博客原文地址: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语言本身的任何特性,依旧基于作用域和原型链。它有如下特点:
异步I/O
和Ajax原理类似,Node也应用了异步I/O,大多数的Node操作都异步的方式进行调用,无需等待前一调用的结束,极大的提升了效率。以Ajax异步调用为例,下面这张图清楚的阐释了异步I/O的原理:

事件与回调函数
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的更多相关文章
- node的重点学习笔记(1)————node
node的重点学习笔记(1)----node 提到node就必须提一下他的npm了,npm是世界上最大的开放源代码的生态系统.通俗来说这就如同亚马逊丛林,要啥物种有啥物种,一个巨大的生态圈,里面有一堆 ...
- node学习笔记(二)(ajax方式向node后台提交数据)
通过ajax向node后台提交数据过程(附手写前后台代码),并总结post与get的区别 POST 前台代码 //CSS简单给点样式 <style> form{ width: 200px; ...
- Nodejs全站开发学习系列 & 深入浅出Node学习笔记 & Spider抓取
https://course.tianmaying.com/node 这个系列的文章看起来很不错,值得学习一下. /Users/baidu/Documents/Data/Interview/Web-S ...
- node 学习笔记 - fs 文件操作
本文同步自我的个人博客:http://www.52cik.com/2015/12/03/learn-node-fs.html 最近看到群里不少大神都开始玩 node 了,我感觉跟他们步伐越来越大了, ...
- 将js进行到底:node学习笔记1
废话:自高中以来一直对编程充满激情,磨剑五年,如今要毕业了,我不想用我已经擅长的知识敷衍,而想以一个全新的领域去面向我的毕设--是时候学习一下node.js node.js基础 对于JavaScrip ...
- Node.js学习笔记(1) - Node.js简介
近期在看一些Node.js的知识,看完后觉得,一些前面的东西忘记了,于是整理一下,方便自己查阅,也希望对学习Node.js的朋友有些帮助: 当然以下只是我个人的观点和理解,不喜勿喷,也望大神指教. 一 ...
- node学习笔记第一天
ES6---* JavaScript语言随着使用的人越来越多,ECMA语法规范:if/else* 为了让js语言更适应大型应用的开发.旨在消除一些怪异的行为 ### 包含内容(strict严格模式)- ...
- node.学习笔记(关于http2的讲解)
个人总结:读完这篇文章需要30分钟 http2部分很有学习价值,可以好好看. 用node搭建TCP服务器 用node搭建HTTP服务器 用node文件fs模块对文件读取,并用流的方式写入 用url路 ...
- node学习笔记(一)本地文件目录查看器
Node.js 新闻 nw.js 前端开发桌面应用 内容 node.js实战 照例提供百度云链接,本来以为是实战系列的那本,但不是,不过这本也不错 链接:https://pan.baidu.com/s ...
随机推荐
- Find the location of libmysqlclient.so.X file in Linux environments
I'm putting together a script that has a requirement of knowing libmysqlclient.so.[15|16|18] .so fil ...
- MySQL查找SQL耗时瓶颈 SHOW profiles
http://blog.csdn.net/k_scott/article/details/8804384 1.首先查看是否开启profiling功能 SHOW VARIABLES LIKE '%pro ...
- java web实践
语言:java.javascript 软件:eclipse.mysql 环境配置:下载jdk:配置jdk环境变量.相关教程:https://jingyan.baidu.com/article/db55 ...
- 2019.01.22 bzoj3875: [Ahoi2014&Jsoi2014]骑士游戏(spfa+dp)
传送门 题意简述:nnn个怪物,对于编号为iii的怪物可以选择用aia_iai代价将其分裂成另外的bib_ibi个怪物或者用cic_ici代价直接消灭它,现在问消灭编号为1的怪物用的最小代价. ...
- 2018.10.27 洛谷P2915奶牛混合起来Mixed Up Cows(状压dp)
传送门 状压dp入门题. 按照题意建一个图. 要求的就是合法的链的总数. 直接f[i][j]f[i][j]f[i][j]表示当前状态为jjj,下一位要跟iii连起来的方案数. 然后从没被选并且跟iii ...
- [转]图解CSS的padding,margin,border属性(详细介绍及举例说明)
图解CSS的padding,margin,border属性 W3C组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落.列表.标题.图片以及层 ...
- Win7 VS2013环境编译boost1_58_0
备忘,发现好多不常用的东西不记笔记再想用要重新花时间找,所以试着开始记笔记,写入博客吧. 首先去官网下最新的版本 http://www.boost.org/ 写本文时boost最新版本为1_58_0, ...
- BZOJ 1059 [ZJOI2007]矩阵游戏 (二分图最大匹配)
1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5281 Solved: 2530[Submit][Stat ...
- Location对象的查询字符方法实现
function getQueryStringArgs(){ /*如果location.search有则删除第一个字符,并返回删除后的字符串*/ var gs = (location.search.l ...
- Java潜在的坑持续总结
1.Java里如果有if (foo == 0),如果foo是null这里居然是会抛NPE异常而不是返回false: 2.Java里整形数值不能用==来比较,因为只有区间是[-128,127]的才能这么 ...