学习前端系列-node.js

Node.js

Node.js是一个事件驱动I/O服务端,基于V8引擎的JavaScript运行环境。

node.js单线程是指主线程是单线程, 主线程执行程序代码, 形成执行栈。
主线程之外, 还维护一个事件队列(Event queue), 当用户异步操作时, 就放入其中, 但不会立即执行。
主线程继续执行, 直到执行完毕, 然后通过事件循环(Event Loop), 从Event queue的开头取出第一个事件, 从线程池中分配一个线程去执行, 然后第二个… 当线程池里的线程执行完, 会通知主线程, 主线程执行回调, 线程归还给线程池

整个Event Loop就是一个while

联想python:
python中的asyncio也是使用事件循环驱动的协程, 其中的事件循环不是用线程池, 而是将函数注册到事件循环上, 当满足事件发生时, 调用相应的协程函数。
python线程池: 如创建2000线程, python进程使用9GB的虚拟内存(swap), 当创建一个线程时,操作系统会预留一个虚拟内存区域来 放置线程的执行栈(通常是8MB大小)。但是这个内存只有一小片段被实际映射到真实内存中。 因此,Python进程使用到的真实内存其实很小 (比如,对于2000个线程来讲,只使用到了70MB的真实内存,而不是9GB)

安装

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
$ sudo apt install nodejs
$ node -v
$ npm -v # npm是node.js的包管理,相当于python的pip

$ npm install express # 本地安装, 在npm命令的目录的node_modules目录, 用equire引入
$ npm install express -g # 全局安装, 在/usr/local下, 可以直接在命令行里用
$ var express = require('express');

$ npm list -g # 全局 npm list 本地 npm list express 查看某个模块
# package.json 位于模块的目录下, 用于定义包的属性
$ npm uninstall/update/search express

$ npm init # 创建模块, 生成package.json文件
$ npm adduser
$ npm publish

$ node hello.js
$ node # 进入命令行

# 版本管理
$ npm -g install n # n
$ n stable # 安装最新的稳定版
$ n lts # 安装最新的TLS版
$ n 11.1.0 # 安装特定版本
$ n rm 11.1.0
$ n # 选择版本
$ n use 11.1.0 index.js # 特定的版本运行
# nvm 大体一样

基本模块

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
// 输出变量
module.exports = {
hello: hello,
greet: greet
};

js全局对象 window对象
node.js全局对象 global对象

process 表示node.js进程
> process.version platform arch
> process.cwd(); // 返回当前工作目录
> process.chdir('/home/wcg'); // 切换当前工作目录

// fs
'use strict';

var fs = require('fs');

fs.readFile('wcg.txt', 'utf-8', function (err, data) { // 标准回调函数, err, data
if (err) {
console.log(err);
} else {
console.log(data);
}
});

var data = fs.readFileSync('wcg.txt', 'utf-8'); // 同步
fs.stat(); 获取文件详细信息

var http = require('http');
var url = require('url');
var crypto = require('crypto');

// 加密
AES 对称加密
RSA 非对称加密
----------本文完,感谢您的阅读----------