Node.js

本文最后更新于:2 年前

Node.js

Node 介绍

1.命令行窗口(小黑屏)、CMD 窗口、终端、shell

开始菜单 –> 运行 –> CMD –> 回车

常用的指令:

1
2
3
4
dir	列出当前目录下的所有文件
cd 目录名 进入到指定的目录
md 目录名 创建一个文件夹
rd 目录名 删除一个文件夹

目录

. 表示当前目录
.. 表示上一级目录

环境变量(windows 系统中变量)

path

1
2
3
4
5
6
7
8
9
C:\work\jdk\jdk1.7.0_75/bin;
%CATALINA_HOME%/bin;
C:\work\soft\tools\AppServ\Apache24\bin;
C:\work\soft\tools\AppServ\php5;
C:\Users\lilichao\AppData\Local\Programs\Fiddler;
C:\work\environment\Egret\Egret Wing 3\bin;
C:\Users\lilichao\AppData\Roaming\npm;
C:\Program Files\MongoDB\Server\3.2\bin;
C:\Users\lilichao\Desktop\hello

当我们在命令行窗口打开一个文件,或调用一个程序时,系统会首先在当前目录下寻找文件程序,如果找到了则直接打开
如果没有找到则会依次到环境变量 path 的路径中寻找,直到找到为止如果没找到则报错
所以我们可以将一些经常需要访问的程序和文件的路径添加到 path 中,这样我们就可以在任意位置来访问这些文件和程序了

I/O (Input/Output)

I/O 操作指的是对磁盘的读写操作

Node

Node 是对 ES 标准一个实现,Node 也是一个 JS 引擎,通过 Node 可以使 js 代码在服务器端执行
Node 仅仅对 ES 标准进行了实现,所以在 Node 中不包含 DOM 和 BOM
Node 中可以使用所有的内建对象
String Number Boolean Math Date RegExp Function Object Array
而 BOM 和 DOM 都不能使用,但是可以使用 console 也可以使用定时器(setTimeout() setInterval())
Node 可以在后台来编写服务器
Node 编写服务器都是单线程的服务器
进程
进程就是一个一个的工作计划(工厂中的车间)
线程
线程是计算机最小的运算单位(工厂中的工人)线程是干活的
传统的服务器都是多线程的
每进来一个请求,就创建一个线程去处理请求
Node 的服务器单线程的
Node 处理请求时是单线程,但是在后台拥有一个 I/O 线程池

Node 的用途

  • Web 服务 API,比如 REST
  • 实时多人游戏
  • 后端的 Web 服务,例如跨域、服务噐端的请求
  • 基于 Web 的应用
  • 多客户端的通信,如即时通信

为什么要学习 Node.js

  • 企业需求

    • 具有服务端开发经验更改

    • front-end

    • back-end

    • 全栈开发工程师

    • 基本的网站开发能力

      • 服务端
      • 前端
      • 运维部署
    • 多人社区

Node.js 是什么

  • Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine.

    • Node.js 不是一门语言
    • Node.js 是 JavaScript 运行时的环境
    • Node.js 既不是语言,也不是框架
    • 简单点来讲就是 Node.js 可以解析和执行
    • Javascript 代码以前只有浏览器可以可以解析执行 Javascript 代码
    • 也就是说现在的 Javascript 可以完全脱离浏览器来运行,一切都归功于: Node.js
  • 浏览器中的 JavaScript

    • ECMAScript
      • 基本语法
      • if
      • var
      • function
      • Object
      • Array
    • BOM
    • DOM
  • Node.js 中的 JavaScript

    • 没有 BOM,DOM
    • ECMAScript
    • 在 Node 中这个 JavaScript 执行环境为 JavaScript 提供了一些服务器级别的 API
      • 例如文件的读写
      • 网络服务的构建
      • 网络通信
      • http 服务器
  • 构建与 Chrome 的 V8 引擎之上

    • 代码只是具有特定格式的字符串
    • 引擎可以认识它,帮你解析和执行
    • Google Chrome 的 V8 引擎是目前公认的解析执行 JavaScript 代码最快的
    • Node.js 的作者把 Google Chrome 中的 V8 引擎移植出来,开发了一个独立的 JavaScript 运行时环境
  • Node.js uses an envent-driven,non-blocking I/O mode that makes it lightweight and efficent.

    • envent-driven 事件驱动
    • non-blocking I/O mode   非阻塞 I/O 模型(异步)
    • ightweight and efficent.   轻量和高效
  • Node.js package ecosystem,npm,is the larget scosystem of open sourcr libraries in the world

    • npm 是世界上最大的开源生态系统
    • 绝大多数 JavaScript 相关的包都存放在 npm 上,这样做的目的是为了让开发人员更方便的去下载使用
    • 例如:npm install jquery

Node 能做什么

  • web 服务器后台

  • 命令行工具

    • npm(node)
    • git(c 语言)
    • hexo(node)
    • 游戏服务器
    • 接口服务器
  • 对于前端工程师来讲,接触 node 最多的是它的命令行工具

    • 自己写的很少,主要是用别人第三方的
    • webpack
    • gulp
    • npm

参考书籍

Node 入门书籍:http://www.nodebeginner.org/index-zh-cn.html
官方 API 文档(中文):http://nodejs.cn/api/

开始

安装 Node 环境

  • 查看 Node 环境的版本号

  • 下载:https://nodejs.org/en/

  • 安装:

    • 傻瓜式安装,一路next
    • 安装过再次安装会升级
  • 确认 Node 环境是否安装成功

    • 查看 node 的版本号:node --version
    • 或者node -v
  • 配置环境变量

解析执行 JavaScript

  1. 创建编写 JavaScript 脚本文件
  2. 打开终端,定位脚本文件的所属目录
  3. 输入node 文件名执行对应的文件

注意:文件名不要用node.js来命名,也就是说除了node这个名字随便起,最好不要使用中文。

文件的读写

文件读取:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//  1.使用fs核心模块
var fs = require('fs');

// 2.读取文件
fs.readFile('./data/a.txt', function (err, data) {
if (err) {
console.log('文件读取失败');
} else {
// console.log(data);
// <Buffer 31 32 33 0d 0a 68 65 6c 6c 6f 20 6e 6f 64 65 ef bc 81>
// 文件中存储的其实都是二进制数据0 1
// 这里为什么看到的不是0和1呢?原因是二进制转为16进制了
// 但是无论是二进制还是16进制,人类都不认识
// 所以我们可以通过 tostring方法把其转为我们能认识的字符
console.log(data.toString());
}
});
1.使用 fs 核心模块
1
var fs = require('fs');

浏览器中的 JavaScript 是没有文件操作能力的//但是 Node 中的 JavaScript 具有文件操作能力
fs 是 file-system 的简写,就是文件系统的意思
在 Node 中如果想要进行文件的操作就必须引用 fs 这个核心模块
在 fs 这个和兴模块中,就提供了人所有文件操作相关的 API
例如 fs.readFile 就是用来读取文件的

  • 成功
    • data 数据
    • error null
  • 失败
    • data undefined 没有数据
    • error 错误对象
2.读取文件readFile
1
fs.readFile('./data/a.txt',function(err,data){}

文件写入:

1
2
3
4
5
6
7
8
9
10
11
//  1.使用fs核心模块
var fs = require('fs');

// 2.将数据写入文件
fs.writeFile('./data/a.txt', '我是文件写入的信息', function (err, data) {
if (err) {
console.log('文件写入失败');
} else {
console.log(data.toString());
}
});
1.使用 fs 核心模块
1
var fs = require('fs');
2.将数据写入文件
1
2
3
4
fs.writeFile('./data/a.txt','我是文件写入的信息',function(err,data){}
// 第一个参数:文件路径
// 第二个参数:文件内容
// 第三个参数:回调函数

error

  • 成功:
    • 文件写入成功
    • error 是 nu11
  • 失败:
    • 文件写失败
    • error 就是错误对象

http

http

1.创建 Server 2.监听 request 请求事件,设置请求处理函数 3.绑定端口号,启动服务器
服务器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 1.加载http核心模块
var http = require('http');

// 2.使用http.createServer()创建一个web服务器
var server = http.createServer();

// 3.服务器要做的事儿
// 提供服务:对数据服务
// 发请求
// 接收请求
// 处理请求
// 反馈(发送响应)
// 当客户端请求过来,就会自动触发服务器的request请求事件,然后执行第二个参数:回调处理函数
server.on('request', function () {
console.log('收到客户的请求了');
});

// 4.绑定端口号,启动服务
server.listen(3000, function () {
console.log('runing... 服务器启动成功,可以通过 http://127.0.0.1:3000/ 来进行访问');
});

你可以使用 Node 非常轻松的构建一个 web 服务器
在 Node 中专门提供了一个核心模块 http
http 这个模块的职贡就是帮你创建编写服务器的

1.加载 http 核心模块
1
var http = require('http');
2.使用 http.createServer()创建一个 web 服务器

返回一个 Server 实例

1
var server = http.createServer();
3.服务器要做的事儿
1
server.on('request',function(){}

提供服务:对数据服务

  • 发请求
    • 接收请求
    • 处理请求
    • 反馈(发送响应)
  • 注册 request 请求事件
    • 当客户端请求过来,就会自动触发服务器的 request 请求事件,然后执行第二个参数:回调处理函数
4.绑定端口号,启动服务
1
server.listen(3000,function(){}

在浏览器中输入地址回车,控制台就会有反应,说明启动成功了一个最简单的 http 服务

ctrl+c 关闭服务

http-res

request 请求事件处理函数,需要接收两个参数
  • Request 请求对象
    • 请求对象可以用来获取客户端的一些请求信息,例如请求路径
  • Response 响应对象
    • 响应对象可以用来给客户端发送响应消息
1
2
3
4
5
6
7
8
9
10
server.on('request', function (request, response) {
// http://127.0.0.1:3000/
console.log('收到客户的请求了,请求路径是:' + request.url);
// response对象有一个方法: write可以用来给客户端发送响应数据
// write可以使用多次,但是最后一定要使用end来结束响应,否则客户端会一直等待
response.write('hello ');
response.write('nodejs');

response.end();
});

http-url-res

根据不同的请求路径发送不同的响应结果 1.获取请求路径
res.url 获取到的是端口号之后的那一部分路径
也就是说所有的 url 都是以 / 开头的 2.判断路径处理响应
响应内容只能是二进制数据或者字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
var http = require('http');

// 1.使用http.createServer()创建一个web服务器
var server = http.createServer();
// 2.监听 request 请求事件,设置请求处理函数
server.on('request', function (req, res) {
console.log('收到客户的请求了,请求路径是:' + req.url);

// response.write('hello ');
// response.write('nodejs');
// response.end();
//上面的方式比较麻烦,推荐使用更简单的方法,直接end的同时发送响应
// res.end('hello nodejs');
var url = req.url;
if (url === '/') {
res.end('index page');
} else if (url === '/login') {
res.end('login page');
} else if (url === '/products') {
var products = [
{ name: '苹果', price: 4 },
{ name: '香蕉', price: 2 },
];
// 响应内容只能是二进制数据或者字符串
// 数字
// 对象
// 数组
// 布尔值
res.end(JSON.stringify(products));
} else {
res.end('404 Not Found');
}
});

// 3.绑定端口号,启动服务
server.listen(3000, function () {
console.log('服务器启动成功,来进行访问');
});

Node 中的模块系统

使用 Node 编写应用程序主要就是在使用:

  • ECMAScript 语言

    • 和浏览器一样,在 Node 中没有 Bom 和 Dom
  • 核心模块

    • 文件操作的 fs
    • http 服务操作的 http
    • url 路径操作模块
    • path 路径处理模块
    • os 操作系统信息
  • 第三方模块

    • art-template
    • 必须通过 npm 来下载才可以使用
  • 自己写的模块

    • 自己创建的文件

相对路径中的 ./ 不能省略,后缀名可以省略

什么是模块化

概念:将一个复杂的程序依据一定的规则(规范)封装成几个块(文件),并组合在一起。
模块的内部数据、实现是私有的, 只是向外部暴露一些接口(方法)与外部其它模块通信。
最早的时候,我们会把所有的代码都写在一个 js 文件里,那么,耦合性会很高(关联性强),不利于维护;而且会造成全局污染,很容易命名冲突。

模块化的好处

  • 避免命名冲突,减少命名空间污染
  • 降低耦合性;更好地分离、按需加载
  • 高复用性:代码方便重用,别人开发的模块直接拿过来就可以使用,不需要重复开发类似的功能。
  • 高可维护性:软件的声明周期中最长的阶段其实并不是开发阶段,而是维护阶段,需求变更比较频繁。使用模块化的开发,方式更容易维护。
  • 部署方便

文件作用域
(模块是独立的,在不同的文件使用必须要重新引用)
【在 node 中没有全局作用域,它是文件模块作用域,外部访问不到内部,内部也访问不到外部】
通信规则

  • 加载 require
    • 加载文件模块并执行里面的代码
    • 拿到被加载文件模块导出的接口对象
  • 导出 exports
    • 每个文件模块中都提供了一个对象 exports
    • exports 默认是空对象 [ ]
    • 我们需要做的就是把所有需要被外部访问的成员挂载到这个 exports 这个对象中

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!