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)

安装

$ 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 大体一样

基本模块

// 输出变量
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 非对称加密