第一章 Node.js简介

  • Node.js是什么

    1. Node.js 是一个让 JavaScript 运行在服务端的开发平台。
    2. Node.js 中所谓的 JavaScript 只是 Core JavaScript,或者说是 ECMAScript 的一个实现,不包含 DOM、BOM 或者 Client JavaScript。这是因为 Node.js 不运行在浏览器中,所以不需要使用浏览器中的许多特性。
    3. Node.js 的 JavaScript 引擎是 V8
  • Node.js能做什么

    1. Node.js 内建了 HTTP 服务器支持,也就是说你可以轻而易举地实现一个网站和服务器的组合。这和 PHP、Perl 不一样,因为在使用 PHP 的时候,必须先搭建一个 Apache 之类的
      4 第1章 Node.js简介HTTP 服务器,然后通过 HTTP 服务器的模块加载或 CGI 调用,才能将 PHP 脚本的执行结果呈现给用户。而当你使用 Node.js 时,不用额外搭建一个 HTTP 服务器,因为 Node.js 本身就内建了一个。这个服务器不仅可以用来调试代码,而且它本身就可以部署到产品环境,它的性能足以满足要求。
  • 异步式I/O与事件驱动

    1. Node.js 最大的特点就是采用异步式 I/O 与事件驱动的架构设计。Node.js 使用的是单线程模型,对于所有 I/O 都采用异步式的请求方式,避免了频繁的上下文切换。Node.js 在执行的过程中会维护一个事件队列,程序在执行时进入事件循环等待下一个事件到来,每个异步式 I/O 请求完成后会被推送到事件队列,等待程序进程进行处理
  • Node.js的性能

    • Node.js架构简介
      在这里插入图片描述
  • CommonJS

    1. CommonJS 试图定义一套普通应用程序使用的API,从而填补 JavaScript 标准库过于简单的不足。CommonJS 的终极目标是制定一个像 C++ 标准库一样的规范,使得基于 CommonJS API 的应用程序可以在不同的环境下运行
    2. Node.js 是目前 CommonJS 规范最热门的一个实现

第二章 安装和配置Node.js

  • 安装前的准备

    1. Node.js 起初不支持 Windows,只能运行在 cygwin 上,而0.6版本以后就支持Windows 了
    2. Node.js 从0.6版本开始可以运行在原生的 Windows 上了
    3. Node.js 与 Windows 的兼容性仍然不如 POSIX 操作系统
  • 编译源代码

    1. 获取源码包:访问http://nodejs.org,点击Download链接,然后选择Source Code,下载正式发布的源码包
    2. 获取开发中的版本:https://github.com/joyent/node/zipball/master 获得,或者在命令行下输入git clone git: //github.com/joyent/node.git从git获得最新的分支。

第三章 Node.js快速入门

  • 开始用Node.js编程

    • hello world
    1. console.log是我们最常用的输出指令,它和 C 语言中的printf 的功能类似,也可以接受任意多个参数,支持 %d、%s 变量引用,例如:
      //consolelog.js
      console.log('%s: %d', 'Hello', 25)
    • Node.js 命令行工具
    1. 输入node --help可以看到详细的帮助信息
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      Usage: node [options] [ -e script | script.js ] [arguments]         
      node debug script.js [arguments]
      Options:
      -v, --version print node s version
      -e, --eval script evaluate script
      -p, --print print result of --eval
      --v8-options print v8 command line options
      --vars print various compiled-in variables
      --max-stack-size=val set max v8 stack size (bytes)

      Environment variables:
      NODE_PATH ';'-separated list of directories
      prefixed to the module search path.
      NODE_MODULE_CONTEXTS Set to 1 to load modules in their own
      global contexts.
      NODE_DISABLE_COLORS Set to 1 to disable colors in the REPL
      Documentation can be found at http://nodejs.or
    2. 另一种运行方法
      $ node -e "console.log('Hello World');"
      Hello World
    3. 使用node的REPL模式
      运行无参数的 node 将会启动一个 JavaScript 的交互式 shell:(类似于python的shell)
      在这里插入图片描述
    • 建立http服务器
    1. 在成功运行 PHP 之前先要配置一个功能强大而复杂的 HTTP 服务器,譬如 Apache、IIS 或 Nginx,还需要将 PHP 配置为 HTTP 服务器的模块,或者使用FastCGI 协议调用 PHP 解释器。这种架构是“浏览器 HTTP 服务器 PHP 解释器”的组织方式
    2. Node.js 将“HTTP服务器”这一层抽离,直接面向浏览器用户
      在这里插入图片描述
    3. 创建一个http服务器
      建立一个名为app.js的文件
      在这里插入图片描述
      最后运行node app.js,打开浏览器访问http://127.0.0.1:3000
      在这里插入图片描述
    4. 使用supervisor
      PHP可以在修改PHP脚本后直接刷新浏览器以观察结果
      Node.js修改代码后,必须终止Node.js再重新运行才会奏效。
      因为 Node.js 只有在第一次引用到某部份时才会去解析脚本文件,以后都会直接访问内存,避免重复载入,而 PHP 则总是重新读取并解析脚本(如果没有专门的优化配置)
      supervisor可以实现在Node.js中监视你对代码的改动,并自动重启Node.js在这里插入图片描述
  • 异步式I/O与事件式编程

    • 阻塞与线程
    1. 阻塞的含义:线程在执行过程中遇到耗时长的,操作系统会剥夺这个线程的CPU控制权,使其暂停执行,同时将资源让给其他的工作线程。
    2. 异步的含义:当线程遇到 I/O 操作时,不会以阻塞的方式等待 I/O 操作的完成或数据的返回,而只是将 I/O 请求发送给操作系统,继续执行下一条语句。当操作系统完成 I/O 操作时,以事件的形式通知执行 I/O 操作的线程,线程会在特定时候处理这个事件。为了处理异步 I/O,线程必须有事件循环,不断地检查有没有未处理的事件,依次予以处理。
      在这里插入图片描述
    • 事件
      在这里插入图片描述
      运行这段代码,1秒后控制台输出了 some_event occured.。其原理是event 对象注册了事件some_event 的一个监听器,然后我们通过setTimeout 在1000毫秒以后向event 对象发送事件some_event,此时会调用 some_event的监听器。
  • 模块和包

    • 什么是模块
      一个Node.js 文件就是一个模块,这个文件可能是 JavaScript 代码、JSON 或者编译过的 C/C++ 扩展。
    • 创建及加载模块
    1. 创建模块
      一个文件就是一个模块,在Node.js中通过exports和require来传递和获取模块
      在这里插入图片描述
      在这里插入图片描述
    2. 单次加载
      require不会重复加载模块,也就是说无论调用多少次require,获得的模块都是同一个。
    3. 覆盖exports
      在这里插入图片描述
      在这里插入图片描述
    • 创建包
      Node.js 的包是一个目录,其中包含一个 JSON 格式的包说明文件 package.json。
      严格符合CommonJS规范的包应该具备以下特征
      在这里插入图片描述
    1. 作为文件夹的模块(把文件夹封装成一个模块)
      模块与文件是一一对应的。文件不仅可以是 JavaScript 代码或二进制代码,还可以是一个文件夹。最简单的包,就是一个作为文件夹的模块。
      在这里插入图片描述
      运行 node getpackage.js,控制台将输出结果 Hello.
    2. package.json
      在somepackage文件夹下,创建一个叫 package.json 的文件(如下所示),然后将index.js重命名为interface.js并放入lib子文件夹下。以同样的方式再次调用这个包,依然可以正常使用
      Node.js 在调用某个包时,会首先检查包中 package.json 文件的 main 字段,将其作为包的接口模块,如果 package.json 或 main字段不存在,会尝试寻找 index.js 或 index.node 作为包的接口。
      在这里插入图片描述
      完全符合规范的package.json文件应该含有以下字段:
      在这里插入图片描述
      在这里插入图片描述
    • Node.js包管理器
      npm是 Node.js 官方提供的包管理工具
    1. 获取一个包
      在这里插入图片描述
    2. 本地模式和全局模式
      npm在默认情况下会从http://npmjs.org搜索或下载包,将包安装到当前目录的node_modules子目录下。
      本地模式:默认情况下我们使用npm install命令就是采用本地模式,即把包安装到当前目录的node_modules子目录下。本地模式不会注册PATH环境变量,就不能直接在命令行中调用
      全局模式:npm [install/i] -g [package_name]。会将包安装到系统目录,譬如 /usr/local/lib/node_modules/,同时 package.json 文件中 bin 字段包含的文件会被链接到 /usr/local/bin/。/usr/local/bin/ 是在PATH环境变量中默认定义的,因此就可以直接在命令行中运行 supervisor script.js命令了。使用全局模式安装的包并不能直接在JavaScript文件中用require获得,因为require不会搜索 /usr/local/lib/node_modules/。
      在这里插入图片描述
  • 调试(暂时略过)

    • 命令行调试
    • 远程调试
    • 使用Eclipse调试Node.js
    • 使用node-inspector调试Node.js