nodejs 是什么
nodejs is a JavaScript runtime built on Chrome's V8
nodejs 并不是一门语言,而是一个运行环境
特点:
- 事件驱动
- 非阻塞 I/O
非阻塞I/O
- 阻塞:I/O时进程休眠等待I/O完成后进行下一步。
- 非阻塞:I/O时函数立即返回,进程不等待I/O完成。
事件驱动
- I/O等异步操作结束后的通知
- 观察者模式
为什么前端偏爱nodejs
- 前端职责范围变大,统一开发体验
- 在处理高并发,I/O密集场景性能优势明显
CPU密集 VS I/O密集
- CPU密集: 压缩、解压、加密、解密
- I/O密集: 文件操作、网络操作、数据库
web 常见场景
- 静态资源读取
- 数据库操作
- 渲染页面
高并发应对之道
- 增加机器数
- 增加每台机器的CPU数——多核
进程
- 进程:是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位
- 多进程:启动多个进程,多个进程可以一块执行多个任务
nodejs 环境
-
nodejs 官网:
https://nodejs.org/en/
- CommonJS: 模块化规范
- global: 全局对象,nodejs 没有 DOM、BOM,全局是global
- process: 进程
一个栗子
nodejs 自动帮我们做了,外面包了一个函数,实现模块化。
CommonJS
- 每个文件是一个模块,有自己的作用域,比如上面栗子,外面包裹了一个函数,就变成了局部作用域了。
- 在模块内部
module
变量代表模块本身。 -
module.exports
属性代表模块对外的接口
require 规则
-
/
表示绝对路径,./
表示相对于当前文件的相对路径 - 支持
js、json、node
拓展名,不写的话就会依次尝试。 - 不写路径则认为是
build-in
内部自带的模块或者各级node_modules
内的第三方模块。
require 特性
- module 被加载的时候执行,加载后缓存,也就第一次加载并执行,第二次有缓存就不加载了。
- 一旦出现某个模块被循环加载,就只输出已执行的部分,还未执行的部分不会输出。(太绕了,要避免循环引用)
nodejs 内置模块
-
fs
文件系统模块,用来做文件的读写,
第三方模块 node_modules
-
chalk
模块,可以让输出带颜色。
module.exports 与 exports 的区别
const exports = modules.exports
//exports 是 module.exports 的快捷方式
exports.test = 100;
//可以给 exports 添加属性。
exports = {
test: 150
} //这是错误的用法,因为改变了 exports 的指向,模块输出找不到。
module.exports = {
test: 200
} //这是可以的,因为输出的模块是 module.exports
global 全局对象
- CommonJS
- Buffer:处理二进制数据流
- process:进程
- console
- timer
把变量赋给 global 对象作为属性,则所有的文件都能拿到该变量。
timer
-
setImmediate
:下一个事件队列的队首。 -
setTimeout
:定时执行,最快是在两个事件队列之间。 -
process.nextTick
:当前事件队列的队尾。
来看一下三个的执行顺序
可以看到,执行顺序是 nextTick
比 setImmediate
要早,而setTimeout
由设定的时间来决定,如果时间为0,则是在两个事件队列之间。