《深入浅出NodeJS》读书笔记(一):node.js简介

363 阅读6分钟

前言

在咕了一个多月之后,我又回来了。这一次的文章也是一个系列的文章,内容是朴灵老师写的《深入浅出NodeJS》的读书笔记。node的诞生,将Javascript从浏览器当中剥离出来,不再仅仅是用于在浏览器端设计动态网页和进行用户交互的工具,而有了更多的用途。
这篇文章是《深入浅出NodeJS》读书笔记系列文章的第一篇。因此,首先需要先来介绍一下朴灵老师是如何安排这本书的内容的。接下来,对nodeJs进行一个简单的介绍。最后,梳理一下比较容易被忽略的几个概念。

本书架构

这本书有十一个章节,我觉得可以把它分成七个部分:

  • 第一部分->第1章:简单介绍了nodeJS的发展历程和背景
  • 第二部分->第2章:介绍nodeJS的模块机制,从代码组织结构来了解nodeJS
  • 第三部分->第3章、第4章:介绍异步IO的运行原理以及异步编程,从运行结构来了解nodeJS
  • 第四部分->第5章、第6章:介绍nodeJS内存管理相关的内容
  • 第五部分->第7章、第8章:介绍网络编程相关的内容,即如何使用nodeJS实现TCP、UDP、HTTP等网络协议
  • 第六部分->第9章:介绍node多进程技术,以及如何利用多进程提升应用的性能
  • 第七部分->第10章、第11章:介绍测试和工程化相关的内容 对于一个像我这样对nodeJS的接触不是很多的初学者而言,我觉得上来就看nodeJS的运行机制,代码组织有点儿困难。因此,我决定从应用入手,不管三七二十一,先能够把这个东西用起来,然后再去纠结它内部的实现原理。于是,这边的读书笔记的顺序就变成了:第一部分、第五部分、第六部分、第七部分、第二部分、第三部分、第四部分。

node简介

关于node简介这个部分,正常来讲,首先应该给nodeJS下一个定义,然而这个定义我反复思索,感觉无法找到恰当的定义。因此,这里就借用一个博客上面的定义:简单来讲node.js就是可以运行在服务端的JavaScript。这里就衍生出一个问题,它为什么可以运行在服务端?接下来,就跟随朴灵老师的脚步,来一点点揭晓node的奥秘。

node的诞生

了解一个东西,首先要知道它是怎么来的。关于node是怎么来的这件事情,我就做一个搬运工,搬一下朴灵老师的内容:

  • 2009年3月,Ryan Dahl在其博客上宣布准备基于V8创建一个轻量级的Web服务器并提供一套库
  • 2009年5月,Ryan Dahl再Github上发布了最初的版本
  • 2009年12月和2010年4月,两届JSConf大会都安排了Node的讲座
  • 2010年底,Node获得硅谷云计算服务商Joyent公司的资助,其创始人Ryan Dahl加入Joyent公司全职负责Node的发展
  • 2011年7月,Node再微软的支持下发布了其Windows版本
  • 2011年11月,Node超过Ruby on Rails,成为Github上关注度最高的项目(随后被Bootstrap超越)
  • 2012年1月底,Ryan Dahl在对Node架构设计满意的情况下,将掌门人的身份转交给Isaac Z。Schlueter,自己转向一些研究项目。Isaac Z. Schlueter是Node的包管理器NPM的作者,之后Node的版本发布和bug修复等工作由他接手。

node与JavaScript

要说node和JS的关系,一句话就可以说明:node是运行在服务端的JS,本质还是JS,只不过驱动的殷引擎不再是浏览器了而已。那么问题来了,为什么要用JS来写服务端呢?这个问题要从作者说起了,node的作者Ryan Dahl是一个资深的c/c++程序员,在创造出node之前,他的工作是围绕高性能web服务器进行的。经过他的研究发现,设计高性能web服务器的几个要点:事件驱动、非阻塞IO
通过对比其他语言:c开发门槛高、Haskell作者自己都玩不转、Lua自身已经含有很多阻塞IO的库、Ruby虚拟机性能不好。这个时候,JavaScript凭借它的开发门槛低、没有历史包袱(因为他自己也比较新),最关键的是它很符合高性能(V8引擎的支持)和事件驱动这两个特点。因此,JavaScript成了新的宠儿。
前面我们介绍了JS之于node,接下来我们介绍node之于JS。 一个很显然的结论,那就是node将JS从浏览器当中剥离出来,使其能在服务端运行。首先,我们来对比一下,chrome和node的构成区别: chrome和node的组件构成.png 从上图可以看出,node和chrome浏览器之间的区别就是差了一个webkit引擎。其中,webkit引擎是一个布局引擎。换句话说,对于JS代码的处理部分,node和chrome在组成结构上是极其相似的。本来JS是需要浏览器支持的,但是node的出现将JS从浏览器中剥离出来,让JS也可以完成处理数据库,搭建websocket服务端,等等一些直接跟操作系统打交道的服务端的工作。

node的特点

node是后端的JavaScript运行平台,它保留了前端浏览器JavaScript中的一些接口,呈现了与其他语言不同的特性。

  1. 异步IO
  2. 事件驱动
  3. 单线程

一些概念

页面渲染流程

前端的页面渲染流程,如下图所示。主要分为三个阶段:

  1. URL -> DOM树
  2. DOM -> webkit绘图上下文
  3. 绘图上下文 -> 最终呈现 前端页面渲染流程.png

JS引擎

JS引擎处理JS代码的流程如下: JS引擎.png

关于网络的几个基本概念

  • socket: 简单来说,socket可以理解为收发数据的两台计算机之间链接了一条数据通道,数据沿着这条通道流动,最终到达目的地。收发数据的操作可以分为4各阶段:
    1. 创建socket(创建socket阶段)
    2. 将管道连接到服务器端的socket上(连接阶段)
    3. 收发数据(通信阶段)
    4. 断开管道并删除socket(断开阶段)
  • TCP/UDP: 传输层的两种协议,TCP是面向连接的,而UDP是非面向连接的。因此,TCP更加稳定,而UDP更加高效。
  • HTTP: 应用层的协议。HTTP是对TCP协议的进一步封装。
  • ajax: ajax不是JavaScript规范,只是一个缩写:Asynchronous Javascript and XML,意思就是JavaScript执行异步网络请求。

写在后面的话

这篇文章是《深入浅出NodeJS》读书笔记系列的第一篇文章,个人感觉有点儿像科普类型的文章。