(一)初识NodeJs

说明:该学习笔记参考《深入浅出Node.js》在学习过程中,添加了自己的理解和适当的补充!仅供参考!

NodeJs的出现,让JavaScript工程师实现了独自完成全栈的梦想。NodeJs作为后端JavaScript的运行平台,保留了前端浏览器中那些熟悉的接口,没有改写语言本身的任何特性,依然基于作用链原型链

NodeJs有以下几个特点:

异步I/O

异步I/O的最常见实现场景就是发起Ajax调用。这里演示的是一个Ajax请求:

$.post("/url", {"title": "这是参数"}, function(data){
    console.log("收到响应");
});
console.log("发送Ajax结束");

这里,我们会注意到,输出“发送Ajax结束”并不一定是在输出“收到响应”之后,因为“收到响应”的执行时间是不被预期的。这里是比较重要的异步的原则:‘Don`t call me, I will call you’,注重结果,不关心过程

在NodeJs中,绝大多数的操作都是以异步的方式进行调用。在NodeJs中,我们可以从语言层面很自然的进行并行I/O操作,每个调用之间无需等待其他调用结束,在编程模型上可以极大的提升效率

这里是两个文件读取任务的耗时取决于最慢的那个文件读取的耗时:

var fs = require("fs");
fs.readFile("/path1", function(err, file){
    console.log("读取文件1完成");
});
fs.readFile("/path2", function(err, file){
    console.log("读取文件2完成");
});

事件与回调函数

NodeJs是将前端浏览器中广泛且成熟的事件引入后端,配合异步I/O,将事件点暴露给业务逻辑。

var http = require("http");
var querystring = require("querystring");

// 侦听服务其的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('server start at port:8080')

在web服务器绑定request事件,对于请求对象,为其绑定data事件和end事件。相应的在前端Ajax请求中绑定success事件,在发出请求后,只需关心请求成功时执行相应的业务逻辑即可。

$.ajax({
  'url': '127.0.0.1:8080',
  'method': 'POST',
  'data': {},
  'success': function(data){
    console.log(data);
  }
})

以上代码只是演示,此处的ajax并不能运行。在此只是说明“事件”。

事件的编程方式具有轻量级松耦合只关注事务点等优势。但是也会造成在多个异步任务的场景下,事件和事件之间各自独立,如何协作是一个重要的问题。

回调函数无处不在。在JavaScript中,是将函数作为第一等公民来对待的,可以将函数作为对象传递给方法作为参数进行调用(这里说的是不是闭包?可以去深揪一下!)

回调函数是最好的接受异步调用、返回数据的方式,但是这种编程方式对于同步思路编程的人来说,是一大挑战。代码的编写顺序与执行顺序并无关系,在流程控制方面,由于穿插了异步和回调使得变得不是那么一目了然。但是对于业务的划分和对事件的提炼上复杂度与同步方式是一致的。

单线程

NodeJs保持了JavaScript在浏览器中的单线程的特点。而且在NodeJs中,JavaScript与其他线程是无法共享任何状态的

单线程的最大好处就是:不用向多线程那样处处在意状态的同步问题,没有死锁的的存在,也没有线程上下文交换(这点需要深入解释下)所带来的性能上的开销

当然单线程也是有很大的弱点,但是必须要积极面对才能享受到node带来的好处。主要有以下三大方面:

  • 无法利用多核CPU。
  • 错误会引起整个应用的退出,应用的健壮性值得考验
  • 大量计算占用CPU导致无法继续调用异步I/O

在浏览器中JavaScript与UI共用一个线程,JavaSript长时间执行会导致UI的渲染和相应被终端(这里思考浏览器加载资源的方式是并行还是串行,如何提高这方面的性能!)

第三个弱点,有相应的解决方案,这里暂时先不提!

跨平台

兼容于Windows和Linux平台。

应用场景

I/O密集型

NodeJs擅长I/O密集型的应用场景,面向网络且擅长并行I/O,能够有效的组织更多的硬件资源,

I/O密集的优势主要在于NodeJs利用事件循环的处理能力,而不是启动每一个线程为每一个请求服务,资源占用极少。

分布式应用

与遗留系统和平相处

是否不擅长CPU密集型业务

这里简单的认识NodeJs,了解了其特性和应用场景,接下来,需要深入了,加油哦!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,113评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,644评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,340评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,449评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,445评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,166评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,442评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,105评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,601评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,066评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,161评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,792评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,351评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,352评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,584评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,618评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,916评论 2 344

推荐阅读更多精彩内容

  • 1 nodejs 中的异步存在吗? 现在有点 javascript 基础的人都在听说过 nodejs ,而只要与 ...
    htoo阅读 6,473评论 4 51
  • 五十三:请解释 JavaScript 中 this 是如何工作的。1.方法调用模式当一个函数被保存为一个对象的属性...
    Arno_z阅读 569评论 0 2
  • Node.js® is a JavaScript runtime built on Chrome's V8 Jav...
    水雨田阅读 927评论 0 3
  • 母亲的一生是艰辛的一生,但她的性格强势容易灼伤人,自己的骨子里是有点遗传她。 从我懂事起...
    梦梵_福州阅读 279评论 2 2
  • 我有一个梦想, 当这个世界所有人都开始长胖, 是否, 我就不用为减肥而起床。 我有一个梦想, 当这个世界所有人都长...
    郝先森瑞康阅读 422评论 2 1