node.js学习小记

一、作者选择JavaScript的原因:

1.作者Ryan Dahl的最初目标是写一个基于事件驱动非阻塞I/O的Web服务器

2.JavaScripot比C的开发门槛低,比Lua的历史包袱少,且在为后端没有市场,可以说历史包袱为0,为其导入非阻塞I/O可以说阻塞为0;

3.JavaScript在浏览器中有广泛的事件驱动方面的应用,当时,第二次浏览器大战也逐渐分出高下,Chrome浏览器的JavaScript引擎V8摘得了性能第一的桂冠。

总而言之,考虑到高性能,符合事件驱动,没有历史包袱这3个主要原因,JavaScript成为了Node的实现语言。

二、Node给JavaScript带来的意义

        Node打破了过去JavaScript只能在浏览器中运行的局面。前后端编程环境统一,可以大大降低前后端转换所需要的上下文转换代价。

三、Node的特点

1、异步I/O

      在Node中,异步I/O很常见,以读取文件为例,我们可以看到它与前端Ajax调用的方式极其相似:

var fs = require('fs');

fs.readFile('/path',function(err,file){
    console.log("读取文件完成");//结束时间无法预期,得到结果时触发
})
console.log("发起文件读取")//先执行

2、事件与回调函数

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

       事件的编程方式具有轻量级、轻耦合、只关注事务点等优势,但是在多个异步任务的场景下,事件与事件之间各自独立,如何协作是一个问题。在JavaScript中,回调函数无处不在,这是因为在js里,函数是第一等公民,可以将函数作为对象传递给方法作为实参进行调用。

       与其他的web后端编程语言相比,Node除了异步和事件外,回调函数是一大特色,回调函数也是最好的接受异步调用返回数据的方式。

3、单线程

        Node保持了JavaScript在浏览器中单线程的特点。而且在Node中,JavaScript与其余线程是无共享状态的。单线程的最大好处是不用像多线程编程那样处处在意状态的同步问题,这里没有死锁的存在,也没有线程上下文交换所带来的性能上的开销。但是单线程也存在弱点,具体有以下三个方面:

      ①无法利用多核CPU;

      ②错误会引起整个应用退出,应用的健壮性值得考虑;

      ③大量计算占用CPU导致无法继续调用异步I/O;

       像浏览器中JavaScript与UI共用一个线程一样,JavaScript长时间折行会导致UI的渲染和响应被中断。在Node中,长时间的CPU占用也会导致后续的异步I/O发不出调用,已完成的异步I/O的回调函数也会得不到及时执行。

       解决办法:HTML5定制了Web Workers的标准,Web Workers能够创建工作线程来进行计算,以解决JavaScript大计算阻塞UI渲染的问题。工作线程为了不阻塞主线程,通过消息传递的方式来传递运行结果,这也使得工作线程不能访问到主线程中1的UI。Node采用了与Web Workers相同的思路来解决单线程中大计算量的问题:child_process。子进程的出现,意味着Node可以从容地应对单线程在健壮性和无法利用多核CPU的问题。通过将计算分发到各个子进程,可以将大量计算分解掉,然后再通过进程之间的事件消息来传递结果,这可以很好的保持应用模型的简单和依赖性。通过Master-Worker的管理方式,也可以很好地管理各个工作进程,以达到更多的健壮性。

    如果想认真研究JavaScript为什么是单线程,可以看看阮一峰先生的这篇文章:http://www.ruanyifeng.com/blog/2014/10/event-loop.html

4、跨平台

       兼容Windows和*nix平台。

5、Node的应用场景

      高并发,I/O密集,非CPU密集,但是并不是不擅长CPU密集型业务。

四、Node的模块实现

       在Node中,模块分为两类:一类是Node提供的模块,成为核心模块;另一类是用户编写的模块,称为文件模块。

后续继续完善。

      核心模块部分在Node源代码的编译过程中,编译进了二进制执行文件。在Node进程启动时,部分核心模块就被直接加载进内存中,所以这部分核心模块引入时,文件定位和编译执行这两个步骤可以省略,并且在路径分析中优先判断,所以它的加载速度是最快的。例如:var fs=require('fs');

     文件模块则是在运行时动态加载,需要完整的路径分析文件定位编译执行过程,速度比核心模块速度慢。

     Node对引入过的模块都会进行缓存,以减少二次引入时的开销。不同的地方在于,浏览器仅仅缓存文件,而Node缓存的是编译和执行之后的对象。不论是核心模块还是文件模块,require()方法读相同模块的二次加载都一律采用缓存优先的方式,这是第一优先级的。不同之处在于核心模块的缓存检查先于文件模块的缓存检查。

    所以加载优先级是:缓存>核心模块>文件模块

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值