Nodejs

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,采用 C++ 语言来编写而成。提供了很多系统级的 API,如文件操作、网络处理等,主要用于创建快速的、可扩展的网络应用。 同时,Node.js 的包管理器 npm 是全球最大的开源库生态系统。也正是因为 Nodejs,JavaScript 从仅仅在浏览器运行,到可以在客户端、服务端运行。

Nodejs 特性

Java、PHP、ASP.NET 等服务器端语言,会为每个 HTTP 连接创建一个新的进程,而每个进程大约消耗 2MB 内存。为了支持更多的并发连接,需要增加服务器内存,服务器成本也就随之增加。Node.js 以单进程、单线程的模式运行。操作系统有非常成熟的线程调度机制,当 Node.js 线程遇到非常复杂的操作的时候,可以通过事件的调度把操作委派给系统线程完成,实现非阻塞I/O。事件驱动机制是 Node.js 通过内部单线程高效率地维护事件队列实现的,没有多线程的资源占有和上下文切换,意味着面对大规模的 http 请求的时候有非常好的性能。

  • 非阻塞I/0

在客户端环境下的 JavaScript 是单线程执行,但浏览器是多线程的,可以调度管理 JavaScript 代码,让它们在恰当的时机执行。在服务器环节下,Node.js 也没有赋予我们创建线程的能力,代码还是运行在单线程中。但 Node.js 的宿主环节并不是单线程,Node.js 的设计中就是将耗时的操作代理给操作系统或者宿主的多线程,例如磁盘I/O和网络I/O。

  • 事件驱动

事件驱动的设计思想是通过事件或者状态的变化来进行应用程序的流程控制,一般通过事件监听完成,事件被检测到则调用相应的回调函数。例如当进来一个新的请求时,请求会被压入队列,然后哦你给过一个循环来检测队列中的事件状态变化,如果检查到有状态变化的事件,就执行该事件对应的处理代码。

文档

Nodejs官网 下载对应版本并安装,Win 用户需要下载 Gitbash 作为命令行终端使用。

安装完毕后在终端输入,如果显示了 node 版本,证明安装成功,例如:

node -v
>> v8.11.1

初体验

npm 是随同 Node.js 一起安装的包管理工具,我们可以通过 npm 共享和分发代码、管理项目中的依赖项,达到代码的有效复用。以下我们体验 Nodejs 中 http 模块的应用。

  1. 在桌面新建开发目录并进入
cd ~/Desktop && mkdir nodedemo && cd nodedemo
  1. 初始化 package 包管理,按提示输入,也可以一路回车。这样就可以通过 npm install 下载开源项目包。
npm init
  1. 创建并配置 .gitignore,避免上传依赖包。
touch .gitignore

.gitignore

node_modules
  1. 创建 app.js
touch app.js

app.js

// 引入 Nodejs 中 http 网络工具包
const http = require('http');

// 定义地址及端口
const hostname = '127.0.0.1';
const port = 3000;

// 开启 http 服务
const server = http.createServer((req, res) => {
  // 定义返回状态码为 200
  res.statusCode = 200;
  // 定义返回类型为文本类型
  res.setHeader('Content-Type', 'text/plain');
  // 定义返回内容
  res.end('Hello World\n');
});

// 开启监听端口
server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});
  1. 开启服务
node app.js

打开地址http://127.0.0.1:3000/

就可以看到浏览器中的 Hello world

  1. 修改app.js
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  // 修改为 Hello Jax
  res.end('Hello Jax\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

修改后刷新浏览器,发现浏览器显示依然为 Hello world。因为我们虽然修改了代码,但是服务的进程还是之前的开启的进程,我们需要在命令行中使用 ctrl + c 终止进程,再输入 node app.js 。重新刷新页面,这样页面才会发生变化。

  1. 安装全局依赖包 nodemon

下载全局依赖包的命令为 npm install -g packname,下载之后包的地址在用户目录上,win 用户需要自行配置本地环境指向。然后在终端中可以直接使用该包提供的服务,安装全局依赖包多数为工具类型的包。

以下我们安装 nodemon ,为开发常用监听工具,这样我们就不需要修改了服务代码之后每次都自己手动重启,在代码发生修改后,nodemon会自动帮助我们重启服务, nodemon 的文档

npm install -g nodemon
  1. 使用 nodemon 重启服务
nodemon app.js

修改 Hello, Jax 为,Hello, Jay。刷新浏览器,会发现我们不需要手动重启服务,页面内容也发生了变化。

  1. 安装本地依赖包 express

下载本地依赖包的命令为 npm install -save packname,下载之后包的名称会在 package.json 文件上显示为次项目依赖包,方便他人 clone 项目使用使用 npm install 直接安装。本地依赖包多数为本项目提供服务,多数为封装好的库。

以下我们安装 Express,高度包容、快速而极简的 Node.js Web 框架。我们使用过 BootStrap 可以理解为 css 的库,封装了很多 css 的代码,使用过 jQuery,可以为 JavaScript H5 的库,封装了很多 H5 操作 DOM 的代码,而 Express 可以理解为 Nodejs 的库,封装了 Nodejs 的各类 API,让开发 Nodejs Web,更具的便捷。Express 的文档

npm install -save express
  1. 使用 Express 修改 app.js
// 引用 express 依赖包
const express = require('express');
// 实例化 express
const app = express();

// 监听地址返回信息
app.get('/', (req, res) => {
  // 返回 Hello World
  res.send('Hello World!');
});

// 监听 3000 端口
app.listen(3000, () => {
  console.log('Example app listening on port 3000!');
});

刷新浏览器,再次显示回 Hello World 。