如何才能学好Node.js

从接触Node.js到现在,一路摸爬滚打,虽然也谈不上精通,但对于如何学习Node.js,还是有一些个人见解的,现在拿出来与大家共勉。一是对自己的总结,二呢也希望能帮助到大家。

本文将包含以下内容:

  • 什么是Node.js
  • Node.js的应用场景
  • Node.js的学习指南
  • 扩展延伸

什么是Node.js

Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台, 用来方便地搭建快速的, 易于扩展的网络应用。 Node.js 借助事件驱动, 非阻塞 I/O 模型变得轻量和高效,可以完美地处理时时数据, 非常适合 运行在分布式设备 的 数据密集型 的实时应用。通俗点就是 node.js是一个可以让javascript运行在后端的上下文环境+很多方便的现成库。

node.js最大的卖点在于完全异步的I/O模型。比于阻塞I/O,异步I/O模型极大提高web服务的并发性,对于I/O密集型应用来说,会有明显的性能提升。例如对于大量采用Ajax long-polling的网站(典型的如聊天室,知乎的通知推送)能带来很大的提升;因为每一个的long-polling请求都会占用服务器的连接数,虽然大部分连接处在空闲状态,但并发性不强的web框架最终会被大量的连接耗死。而node.js的异步I/O模型最适合于处理这样的情形。

单线程不仅没有降低吞吐率(因为异步),也远离了死锁等同步不当导致的问题。node.js可以通过多进程来提高并发能力;其次单进程多线程的程序往往在内存中共享数据,而内存不能跨机器访问,因此限制了扩展到集群的能力。但是因为异步也带来的一些问题:层层嵌套的回调,异常难以处理。由于程序的模型变成了异步,node.js的代码风格亦偏函数式,对此没有经验的需要一定的时间来适应。因为node.js是基于javascript的,对于想成为全栈道同学,是个很不错的选择。

目前使用Nodejs的公司有 LinkedIn, Yahoo, Paypal, eBay, Walmart,Groupon 还有很多的中小型公司,国内的公司如雪球、淘宝、网易、百度等也都有很多项目运行在 Node.js 之上。

Node.js的应用场景

适合

  1. JSON APIs——构建一个Rest/JSON API服务,Node.js可以充分发挥其非阻塞IO模型以及JavaScript对JSON的功能支持(如JSON.stringfy函数)

  2. 单页面、多Ajax请求应用——如Gmail,前端有大量的异步请求,需要服务后端有极高的响应速度

  3. 基于Node.js开发Unix命令行工具——Node.js可以大量生产子进程,并以流的方式输出,这使得它非常适合做Unix命令行工具

  4. 流式数据——传统的Web应用,通常会将HTTP请求和响应看成是原子事件。而Node.js会充分利用流式数据这个特点,构建非常酷的应用。如实时文件上传系统transloadit

  5. 准实时应用系统——如聊天系统、微博系统,但Javascript是有垃圾回收机制的,这就意味着,系统的响应时间是不平滑的(GC垃圾回收会导致系统这一时刻停止工作)。如果想要构建硬实时应用系统,Erlang是个不错的选择

不适合

  1. CPU使用率较重、IO使用率较轻的应用——如视频编码、人工智能等,Node.js的优势无法发挥

  2. 简单Web应用——此类应用的特点是,流量低、物理架构简单,Node.js无法提供像Ruby的Rails或者Python的Django这样强大的框架

Node.js的学习指南

对于刚接触Node.js的新手来说,第一步无非是打好基础,你需要弄明白JavaScript 的特性语法和node的基本原理。通过一些博文和书籍的学习,对node.js有了一个基本的了解后,可以尝试搭建一个 HTTP 服务器,返回 hello world (使用 HTTP 模块);读取一个 txt 文件,将内容显示到命令行中(使用 fs 模块)等等。以提高自己的自信心。

Node.js 的活力所在是npm 上近 7W 的第三方模块,当你对Node.js已经了解的差不多了,不妨用 Node.js 的第三方模块做些好玩的事情。如搭建一个微博网站;写一个简单的爬虫;调用一些网站的API做一些好玩的东西等等。对一门技术有了足够的信心后,此时应该深入了解下 Node.js 核心模块的用法。好好看下Node.js 官方 API 文档。在此基础上多加实践。不管是用核心模块还是外部模块,尝试用 Node.js 解决某个问题或者替换掉以前用其他语言写过的代码。

读源码可以先挑一些简单的只实现某个特定功能的工具模块的源码读,这种模块的代码通常在几百行,阅读起来并不是很困难,但是却能涨不少的姿势。比如:underscore (学习 JavaScript 的语法和技巧)。在使用 Node.js 时发现没有合适的模块选择或者选择的模块功能不尽人意,这个时候你可以尝试去创建一个模块或者修改现有的模块,并且使用 npm 发布自己的模块或者去该模块的 GitHub 上提 PR 。不断的重复演练,想学不会都难。对于其它技术,也是如此。

最后,要明白学习node最关键的是学习node的核心,也就是node本身,而不是仅仅纠结于大量彼此没有紧密联系的工具和库,因为他们不能帮助你加深对node本身的理解,如果你理解了核心,尤其是核心的概念(未必是语法和实现),理解整个生态系统的其他工具,库,应用也就成竹在胸了。事在人为,把您和大众区分开来的不就是理解的深度吗?

扩展延伸

没有人是无师自通,把一些常用的网站整理下,分享给大家,也算是对自己的一个总结吧。希望对需要的人能有些帮助。

学习网站

代码示例

  • N-blog--nswbmw的基于node.js的个人博客源码
  • awesome-nodejs--用node写的很不错的代码集合

书籍

有些人不太爱看书,但一本好书是对一门技术的最系统的解释。