01. Node.js 简介

什么是 Node?

Node(正式名称 Node.js)是一个开源的、跨平台的运行时环境,有了它,开发人员可以使用  JavaScript  创建各种服务器端工具和应用程序。此运行时主要用于浏览器上下文之外(即可以直接运行于计算机或服务器操作系统上)。据此,该环境省略了一些浏览器专用的 JavaScript API,同时添加了对更传统的 OS API(比如 HTTP 库和文件系统库)的支持。

从 web 服务器开发的角度来看,Node 有很多好处:

  • 卓越的性能表现!Node 为优化 web 应用的吞吐量和扩展度而生,对常见的 web 开发问题是一套绝佳方案(比如实时 web 应用)。
  • 代码还是熟悉的老伙伴 JavaScript,这意味着在客户端和服务器端“上下文切换”的时间成本更低。
  • 与传统的 web 服务器语言(例如 Python、PHP 等)相比,JavaScript 理念更新,语言设计的改进带来了诸多好处。许多其它新近流行的语言也可编译/转换成 JavaScript,所以 TypeScript、CoffeeScript、ClojureScript、Scala、LiveScript 等等也可以使用。
  • Node 包管理工具(node package manager,NPM)提供了数十万个可重用的工具包。它还提供了一流的依赖解决方案,可实现自动化工具链构建。
  • Node.js 是可移植的,可运行于 Microsoft Windows、macOS、Linux、Solaris、FreeBSD、OpenBSD、WebOS 和 NonStop OS。此外,许多 web 主机供应商对其提供了良好支持(包括专用的基础框架和构建 Node 站点的文档)。
  • 它有一个非常活跃的第三方生态系统和开发者社区,很多人愿意提供帮助。

可以用 Node.js 的 HTTP 包来创建一个简单的 web 服务器。

Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境,基于 Google 的 V8 引擎,V8 引擎执行 Javascript 的速度非常快,性能非常好。

查看使用的版本

1
node - v

或者

1
node --version

第一个 Node.js 程序:Hello World

1
2
3
# 创建 hello.js 文件并执行
echo console.log("hello node"); > hello.js
node hello.js

一个稍微复杂的 Node.js 程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*代码示例*/
var http = require("http")

http
.createServer(function (request, response) {
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead(200, { "Content-Type": "text/plain" })
// 发送响应数据 "Hello World"
response.end("Hello, Universe! I'm running on Cloud Studio!\n")
})
.listen(8888)

// 终端打印如下信息
console.log("Server running at http://127.0.0.1:8888/")

也可使用新的语法形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 调用 HTTP 模块
const http = require("http")

// 创建 HTTP 服务器并监听 8000 端口的所有请求
http
.createServer((request, response) => {
// 用 HTTP 状态码和内容类型来设定 HTTP 响应头
response.writeHead(200, { "Content-Type": "text/plain" })

// 发送响应体 "Hello World"
response.end("Hello World\n")
})
.listen(8000)

// 在控制台打印访问服务器的 URL
console.log("服务器运行于 http://127.0.0.1:8000/")

Node.js 回调函数

Node.js 异步编程的直接体现就是回调。

异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。

回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。

例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。

回调函数一般作为函数的最后一个参数出现:

1
2
function foo1(name, age, callback) {}
function foo2(value, callback1, callback2) {}

非阻塞代码实例

1
2
3
4
5
6
7
8
var fs = require("fs")

fs.readFile("input.txt", function (err, data) {
if (err) return console.error(err)
console.log(data.toString())
})

console.log("程序执行结束!")

我们不需要等待文件读取完,这样就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。

因此,阻塞是按顺序执行的,而非阻塞是不需要按顺序的,所以如果需要处理回调函数的参数,我们就需要写在回调函数内。

参考

Express/Node 入门
https://developer.mozilla.org/zh-CN/docs/Learn/Server-side/Express_Nodejs/Introduction

Node.js 安装配置 | 菜鸟教程
https://www.runoob.com/nodejs/nodejs-install-setup.html

Node.js 简介
http://nodejs.cn/learn