至简 · Node.js

   一直以来个人做的项目都在使用Node.js做服务端,一直以来也想说一说Node.js,但是个人的知识储备有限,不敢妄谈这个点,即便是我现在积累了一些东西,对于Node.js我也只能是以一个学习者的身份去说道,此文仅用以对自己知识点的梳理与总结。

   Node.js是由Ryan Dahl于2009年开发而成的,由Joyent公司维护,Ryan Dahl也正是这家公司的员工,后来Ryan Dahl离开了开发者社区,2015年由于对es6的新特性集成问题产生了分歧,分裂出了iojs,最终致使Node基金会的成立。基金会成员包括谷歌、微软、Joyent、Linux等等,由原本的一家掌控,到现在的基金会成员共同管理。
   最初我对Node.js的理解就是这是一门后端语言,语法上与javascript一致,现在的我在看当初的理解,这个理解简直大错特错!!!
Node.js不是一门语言,不是框架,更不是服务器也没有什么与谁一致的说法。Node.js只是一个运行时,它是基于google的V8引擎的javascript runtime,它是一个运行时环境,它结合libuv扩展了javascript的功能,使得js拥有了操作文件读写,操作数据库,I/O的能力,最终javascript同时具有了操作DOM、I/O、文件读写、操作数据库这是服务端的能力,当真是集大成于一体呀。不禁让我想到著名的阿特伍德定律:“任何能够使用javascript实现的程序,最终都必将使用javascript实现”。每次想到这句话,我都想喊一声:牛逼啊!,不过这个定律只是被业界当作一个茶余饭后的笑料看待了。不过我还是充满着憧憬。

   Node.js是由事件驱动的,非阻塞I/O模型,由事件循环处理异步的I/O任务,轻量并且高效,最重要的是Node.js是I/O密集型的,这就意味着它非常擅长处理高并发。可以轻松编写出高性能的web应用,这也就是很多购物网站,微服务,微博等采用node.js来做后台开发的原因,例如淘宝、新浪微博、腾讯等等,都在使用Node.js。这些都是Node.js的优点,并且由node.js编写的包管理器npm已经不能再流行了,它已经形成了开源包管理领域里最好的生态。周下载量超过30多亿次,拥有超过60多万个模块,可见这火热程度。
   而Node.js的缺点也是出了名的,就是回调地狱,在早期的Node版本中回调地狱没有得到较好的解决方案,致使写出来的异步回调代码可读性,以及可维护性非常差,可以自行百度回调地狱,回调地狱带来的影响,不仅仅如同它所带来的笑料那么简单,还有一点,就是多数人认为Node.js不擅长处理CPU密集型的任务,之所以这样说还是因为Node.js接收任务是单线程的,不过,这种问题,最终都会被解决。处理CPU密集型任务的也不是没有,例如fibjs,它是基于纤程的,处理更加高效,不过我没有用过,只是了解过。
所以还是说说,脍炙人口的回调问题吧。异步回调的callback会带来怎样的影响呢

  • 首先一点:回调一旦定义下来,将难以复用,牵一发而动全身,可维护性相当差。
  • 再者:堆栈信息会被断开,我们知道核心引擎维护了一个执行期上下文,函数执行时,会生成自己的执行期上下文,并压入上下文栈中,函数执行完毕,再将该执行期上下文出栈。举个栗子,如果在foo函数内调用了bar函数,会将foo的执行期上下文先入栈,再将bar
    的执行期上下文入栈,bar执行结束,bar的执行期上下文出栈,然后foo执行结束,foo的执行期上下文出栈,这种形式
    的好处是我们可以获取任何我们需要的堆栈信息,如果有错,就可以检索完整的堆栈信息寻找到哪里出了问题。而异步回调不是这种执行方式,异步任务返回I/O后,会进入任务队列中等待,只有执行栈为空了,才会将任务队列中的代码加入到执行栈中,此时栈里面除了全局上下文,就这么一个执行期上下文,如果回调出错了,就无法获取异步操作的完整堆栈信息,不容易判断错误的位置。并且因为是异步的缘故,错误使用try…catch无法捕获。
  • 最后一点,因为如果存在多个异步回调,无法预期完成的顺序,就得借助外层变量,我之前在执行多条查询语句时就使用过,说实话这种方式对于一两个异步还可以算是取巧解决,但是对于多个异步,就得定义多个变量,写起来相当麻烦,而且这种要保持变量绝对不出错,万一出错,就会造成误操作。
  • 其它问题有待深入

   类似的这些早期的异步回调问题,在ES6的Promise中得到了较好的解决,采用流程控制的方式解决了异步回调的问题。并且在ES7中通过async await的方式解决更加清晰明了。

   说着说着就跑偏了,嘿嘿嘿…,总之Node.js会越来越好,对于Node.js我们应当乐于去接受它,尝试它,很多人其实没有使用过Node.js,说一说我最初看待Node.js的态度吧,当初对于Node.js我与大多数的人估计一样,也就听听,并提不起兴趣,感觉没有java的火热,没有C++的老成,心里总有一种看待历史文物一样的感觉,觉得一种技术存在的时间够长,够火,才会让人注意。但在我接触了Node.js之后,我才觉得自己之前是多么无知与可笑,当真是固步自封的感觉,Node.js还年轻,所以它的可能性,以及发展空间没法衡量,但是至少有一点可以确定,它一直在进步,成为一种趋势,需要融入新的血液与推动者。对于Node.js与我都还有很长的一段路要走。

路漫漫其修远兮,吾将上下而求索…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值