文章目录
  1. 1.概述
    1. 1.1 简介
    2. 1.2 历史
    3. 1.3 用户
  2. 2.安装
    1. 2.1 Windows 环境
      1. 2.1.1 下载(16M)
      2. 2.1.2 安装
    2. 2.2 CentOS 环境
    3. 2.3 结果确认
  3. 3.npm(包管理工具)
    1. 3.1 设置国内镜像
      1. 3.1.1 Windows 环境
      2. 3.1.2 CentOS 环境
    2. 3.2 模块的可见范围选项(-g):
    3. 3.3 基本命令
    4. 3.4 创建自定义模块
  4. 4.常用模块
  5. 5.编码
    1. 5.1 输出日志
    2. 5.2 引入模块并实例化
    3. 5.3 回调函数
    4. 5.4 事件循环

Node.js 是一个基于 Chrome V8 引擎、跨平台、开源的 JavaScript 运行时。它使用高效、轻量级的事件驱动、非阻塞 I/O 模型,可使用 JavaScript 代码构建高效的 WEB 服务器端,或者磁盘文件操作等。本文总结了 Node.js 的安装、包管理工具 npm 的使用,以及代码示例。

作者:王克锋
出处:https://kefeng.wang/2017/02/18/nodejs/
版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。

1.概述

1.1 简介

官网: https://nodejs.org/zh-cn/
维基: https://zh.wikipedia.org/wiki/Node.js
中文网: http://nodejs.cn/
Node.js® 是一个基于 Chrome V8 引擎、跨平台、开源的 JavaScript 运行时。
Node.js 使用高效、轻量级的事件驱动、非阻塞 I/O 模型。
它的包生态系统 npm(也是一个包管理器),是目前世界上最大的开源库生态系统。

Chrome V8: Google 开源的 JavaScript 运行引擎,用C++写成,它将JavaScript源代码编译成本地机器码而不是随时解释。

在Node.js出现之前,JavaScript通常作为客户端程序设计语言使用,以JavaScript写出的程序常在用户的浏览器上运行。
Node.js的出现使JavaScript也能用于服务器端编程(类似于 PHP/Python)。Node.js含有一系列内置模块,使得程序可以脱离Apache HTTP Server或IIS,作为独立服务器运行。开发者可以在不使用线程的情况下开发出一个能够承载高并发的服务器。
此外,Node.js 还常用于网络、磁盘文件等应用。

Node.js大部分基本模块都用JavaScript语言编写。
核心模块包括文件系统I/O、网络(HTTP、TCP、UDP、DNS、TLS/SSL等)、二进制数据流、加密算法、数据流等。

1.2 历史

  • Node.js于2009年写成,其原始作者是瑞安·达尔(Ryan Dahl)。Node.js的开发和维护工作由达尔本人主持,而他所在的Joyent公司也提供了赞助。
  • 2009年11月8日,Dahl在欧洲JSConf大会上展示了Node.js项目,并受到了观众赞赏。
  • 2010年1月,一款名为 npm 的软件包管理系统诞生。使程序员能够更方便地发布和分享Node.js类库及源代码,而且简化了类库安装、升级与卸载的过程。npm 支持 Windows/Linux/MAC 等操作系统。
  • Node.js 曾经出现了分支版本 io.js,但后来又合并到 Node.js。

1.3 用户

IBM, Microsoft, Yahoo, Walmart, Groupon, SAP, LinkedIn, Rakuten, PayPal, Voxer, GoDaddy 等

2.安装

2.1 Windows 环境

2.1.1 下载(16M)

下载 LTS(Long Term Support,长期支持) 的最新版本。
https://nodejs.org/zh-cn/
https://nodejs.org/dist/v8.9.4/node-v8.9.4-x64.msi

2.1.2 安装

双击 node-v8.9.4-x64.msi,安装目录保持默认为 C:\Program Files\nodejs
完成安装后,安装目录 C:\Program Files\nodejs 自动被加入到系统的环境变量 PATH 中,node.exenpm.cmd可直接使用。

方便起见,可设置环境变量:

1
2
set NODEJS_HOME=C:\Program Files\nodejs
set PATH=%PATH%; %NODEJS_HOME%/bin

2.2 CentOS 环境

1
2
3
## sudo vim /etc/profile
export NODEJS_HOME=/opt/node-v8.11.3-linux-x64
export PATH=$PATH:$NODEJS_HOME/bin
1
2
3
4
5
6
7
8
cd /home/admin/installer

## https://nodejs.org/zh-cn/download/
## 版本选择(v8.11.3): LTS / Linux 二进制文件 (x86/x64) / 64-bit
wget https://nodejs.org/dist/v8.11.3/node-v8.11.3-linux-x64.tar.xz

sudo tar -xf node-v8.11.3-linux-x64.tar.xz -C /opt
sudo chown -R root:root $NODEJS_HOME

需要注意的是,下面两种安装方式都有问题:
(1) sudo yum -y install nodejs:安装的版本过低(v6.14.2)
(2)官方提供的方法(Enterprise Linux and Fedora):报错说该操作系统版本不支持

1
2
curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
sudo yum -y install nodejs

2.3 结果确认

Node.js 命令试用:

1
2
node -v ## 查看版本
node ## 进入调试环境,退出时用命令 .exit

3.npm(包管理工具)

npm 是 Node.js 附带的包管理器,也是一个命令行工具。
它用于从 NPM Registry 中下载、安装 Node.js 模块,同时解决依赖问题,并可以发布自己的模块。
npm 提高了开发的速度,因为它能够负责第三方Node.js 程序的安装与管理。

3.1 设置国内镜像

为了保证模块版本最新,尽量使用默认镜像(国外 npmjs 官方),如果无法连接,可尝试使用 Shadowsocks;如果仍然无法使用默认镜像,可调整为国内镜像(国外 taobao)重试。

3.1.1 Windows 环境

1
2
3
4
5
# set REGISTRY=https://registry.npmjs.org ## 默认镜像(国外)
set REGISTRY=https://registry.npm.taobao.org ## 国内镜像
echo registry=%REGISTRY% > %USERPROFILE%\.npmrc
type %USERPROFILE%\.npmrc ## 查看文件内容(初始时不存在)
npm --registry %REGISTRY% info underscore

3.1.2 CentOS 环境

1
2
3
4
5
6
## export REGISTRY=https://registry.npmjs.org
export REGISTRY=https://registry.npm.taobao.org
echo registry=$REGISTRY | sudo tee /root/.npmrc
echo registry=$REGISTRY > ~/.npmrc
sudo cat /root/.npmrc ~/.npmrc
npm --registry $REGISTRY info underscore

3.2 模块的可见范围选项(-g):

  • 本地模块(local, 无 -g):模块只能通过 require() 使用,安装在命令行当前目录的 node_modules中,各模块的属性定义在文件 node_modules\npm\package.json 中;
  • 全局模块(global, 有 -g):模块可以直接在 DOS/Linux 命令行使用,模块安装在目录 %USERPROFILE%\AppData\Roaming\npm中(该目录已经加入环境变量 PATH,而且目录下生成 shell/batch 文件,可以在命令行下直接执行)。

3.3 基本命令

命令帮助: npm help [command]
查看版本: npm -v
列出模块: npm ls [-g]
安装模块: npm install [-g] [--force] <ModuleName>,选项 --force 表示模块已存在时是否强制重装
卸载模块: npm uninstall <ModuleName>
更新模块: npm update <ModuleName>
搜索模块: npm search <ModuleName>
常用模块: (1)nmp 工具自身(需要-g选项);(2)WEB框架模块: express

3.4 创建自定义模块

  • npm init; 然后输入模块相关参数;
  • npm adduser
  • npm publish
  • npm unpublish <package>@<version>:模块版本约定格式为 x.y.z, 分别是主版本号(大变不向下兼容)、次版本号(新增功能且向下兼容)、补丁版本号(修复Bug)

4.常用模块

官方文档: https://nodejs.org/api/
中文文档: http://nodejs.cn/api/

5.编码

注意:源码文件必须使用 UTF-8 编码,特别是包含汉字时。

5.1 输出日志

1
2
// DOS> node
console.log('hello!');

5.2 引入模块并实例化

Node.js 通过JSON提供一个统一的接口,将浏览器、数据(MongoDB/CouchDB)等组合到一起。由于前端框架和一些基本的后端开发技术(如MVC、MVP、MVVM等)变得流行,Node.js也支持客户端和服务器端重新利用相同的模型和接口。

保存为文件 script.js 并执行 node script.js
会自动打开默认浏览器并访问 http://localhost:8888/

1
2
3
4
5
6
7
8
9
10
// 启动 HTTP 服务(监听端口 8888)
var http = require("http");
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World!');
}).listen(8888);

// 启动系统默认浏览器
var process = require('child_process');
process.exec("start http://localhost:8888/");

5.3 回调函数

Node.js 所有 API 都支持回调函数,以便实现异步编程。
保存为文件 script.js 并执行 node script.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var fs = require("fs");
var file = 'C:\\Windows\\system.ini';

// 阻塞调用
var text = fs.readFileSync(file, 'utf8');
console.log(text);

// 非阻塞调用
fs.readFile(file, 'utf8', function (err, text) {
if (err) {
return console.error(err);
} else {
console.log(text);
}
});

5.4 事件循环

Node.js 是单进程单线程的应用程序,它通过事件驱动和异步回调支持并发,性能非常高。
这种模式的缺点是无法充分利用CPU多核,此时可借助于模块 cluster, strongloop, pm2
所有的事件机制都是用设计模式中观察者模式实现(事件相当于主题,回调函数相当于观察者订阅主题)。

1
2
3
4
5
6
7
8
var events = require('events');
var eventEmitter = new events.EventEmitter();

eventEmitter.on('onEvent', function() {
console.log("onEvent OK.");
});

eventEmitter.emit('onEvent');
文章目录
  1. 1.概述
    1. 1.1 简介
    2. 1.2 历史
    3. 1.3 用户
  2. 2.安装
    1. 2.1 Windows 环境
      1. 2.1.1 下载(16M)
      2. 2.1.2 安装
    2. 2.2 CentOS 环境
    3. 2.3 结果确认
  3. 3.npm(包管理工具)
    1. 3.1 设置国内镜像
      1. 3.1.1 Windows 环境
      2. 3.1.2 CentOS 环境
    2. 3.2 模块的可见范围选项(-g):
    3. 3.3 基本命令
    4. 3.4 创建自定义模块
  4. 4.常用模块
  5. 5.编码
    1. 5.1 输出日志
    2. 5.2 引入模块并实例化
    3. 5.3 回调函数
    4. 5.4 事件循环