Node.js

Node.js常用模块和工具

工具:
nvm和n
cloud9

全局模块:
express
koa
meteor
hexo:静态博客框架,支持Markdown

项目模块:
Pomelo:网易开源基于 Node.js 的游戏服务端框架
bluebird/q/then/when/async/eventproxy:异步库, promise
coffee-script
colors:unix终端下显示颜色的库,利于调试和一些特殊场景
mkdirp:一次性建立目标文件夹,而不是mkdir…cd…mkdir…cd…mkdir这样的模式

npm国内镜像介绍

镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在):

淘宝镜像

1.通过config命令

1
npm config set registry https://registry.npm.taobao.org 
npm info underscore (如果上面配置正确这个命令会有字符串response)

2.命令行指定

1
npm --registry https://registry.npm.taobao.org info underscore

3.编辑 ~/.npmrc 加入下面内容

1
registry = https://registry.npm.taobao.org

深入浅出Node.js - 异步编程(4.1-)

1.函数式编程

  • 高阶函数:将函数作为参数或返回值的函数
  • 偏函数:参数和变量已经预置的函数的函数,如:
1
2
3
4
5
6
7
8
9
var isType = function(type) {
return function(obj) {
var toString = Object.prototype.toString;
return toString.call(obj) == '[object' + type + ']';
}
}
//创建isString()、isFunction()
var isString = isType('String');
var isFunction = isType('Function');

深入浅出Node.js - 异步I/O(3.2-3.4)

1.异步I/O与非阻塞I/O

  • 异步与非阻塞都能达到并行I/O的目的
  • 从计算机内核I/O而言,异步/同步于阻塞/非阻塞不是一码事
  • 系统内核I/O只有两种方式:阻塞于非阻塞(阻塞I/O造成CPU等待浪费,非阻塞I/O让CPU处理状态判断,所以是对CPU的浪费)
    • 在调用阻塞I/O时,应用程序需要等待I/O完成才返回结果,造成CPU等待I/O,不能充分利用CPU,所有内核提供非阻塞I/O
    • 在调用非阻塞I/O时会立即返回,CPU的时间片可以用来处理其他事务,但是由于返回的不是业务层期望的数据,而只是当前调用的状态,那么应用程序需要通过轮询获取数据

深入浅出Node.js - 核心模块(2.3)

1.核心模块分为C/C++编写的和JavaScript编写的两部分,C/C++文件存放在src目录下,js文件存放在lib目录下,C\C++编写的部分称为内建模块,JavaScript编写的称为核心模块

2.核心模块的编译过程

  • 编译C\C++前,编译程序需要将所有的JavaScript模块文件编译为C/C++代码
    • 转存为C/C++代码:先采用V8附带的js2c.py工具编译js模块文件为C/C++代码,并以字符串的形式存储到node命名空间,不可直接执行
    • 编译JavaScript核心模块到缓存
  • 编译译C\C++

3.核心模块的引入流程,已os模块为例:
require('os')-->NativeModule.require("os")-->process.binding("os")-->get_builtin_module("node_os")-->NODE_MODULE(node_os, reg_gunc)

深入浅出Node.js - 模块加载(2.2)

1.加载模块的3个步骤

  • 路径分析
  • 文件定位
  • 编译执行

2.加载顺序

  • 优先从缓存加载(无论是核心模块还是文件模块,都优先从缓存加载)
  • 核心模块的缓存检查先于文件模块的缓存检查
  • 缓存中没有的再通过路径分析、文件定位、编译执行加载

3.路径分析、文件定位、模块编译

深入浅出Node.js - 特点与应用场景(1.4、1.5)

1.Node的特点

  • 异步I/O
  • 基于事件和回调函数
  • 单线程与子进程child_process
    • 这里的单线程仅仅只是javascript执行在单线程中而已,内部I/O另有线程池
  • 跨平台
    • Node基于libuv实现跨平台

2.Node的应用场景

  • I/O密集型
  • CPU密集型 可以通过编写C/C++扩展及子进程的方式实现
  • 分布式