01.Node.js简介
Node.js是一个基于Chrome V8引擎的JavaScript运行时环境
安装与运行
创建项目
mkdir node
cd node
npm init -y
复制代码
新建 index.js 文件
该段代码的作用就是输出package.json文件内容。
版本管理
在同一个设备上如何切换Node.js版本
版本管理工具:
- n:一个npm 全局的开源包,是依赖
npm
来全局安装、使用的 - fnm:快速简单,兼容性支持
.node-version
和.nvmrc
文件 - nvm:独立的软件包,
Node Version Manager
特点
异步I/O,单线程,跨平台
异步I/O
当Node.js执行I/O操作时,会在响应返回并恢复操作,而不是阻塞线程并浪费CPU循环等待。
当Node.js
执行I/O操作时,会在响应返回并恢复操作,而不是阻塞线程并浪费CPU循环等待
*代码编写顺序与执行顺序无关
const { readFile } = require('fs');
readFile('./package.json', { encoding: 'utf-8' }, (err, data) => {
if (err) {
throw err;
}
console.log(data);
});
console.log(123456);
复制代码
单线程
Node.js保持了JavaScript在浏览器中单线程的特点
优点:
- 不用处处在意状态同步问题,不会发生死锁
- 没有线程上下文切换带来的性能开销
缺点:
- 无法利用多核CPU
- 错误会引起整个应用退出,健壮性不足
- 大量计算占用导致CPU,无法继续执行
浏览器为例,浏览器是多进程,JS 引擎单线程
Browser 进程:浏览器主进程,只有一个
插件进程:插件使用时才创建
GPU 进程:最多一个用于3D 绘制
渲染进程:页面渲染、JS执行、事件处理
- GUI 渲染线程+
JS 引擎线程+ V8
- 事件触发线程
- 定时器触发线程
- 异步请求
跨平台
兼容Windows和Linux平台,主要得益于在操作系统与Node上层模块系统之间构建了一层平台架构。
应用场景
Node.js在大部分领域都占用一席之地,尤其是I/O密集型的
- Web应用: Express / Koa
- 前端构建:Webpack
- GUI 客户端软件:VSCode / 网易云音乐
- 其他:实时通讯、爬虫、CLI等
02.模块化机制
1.何为模块化?
根据功能或业务将一个大程序拆分成互相依赖的小文件,再用简单的方式拼装起来
2.为什么模块化?无模块化问题
- 所有script标签必须保证顺序正确,否则会依赖报错
- 全局变量存在命名冲突,占用内存无法被回收
- IIFE/namespace会导致代码可读性低等诸多问题
Common.JS规范
Node.js支持CommonJS模块规范,采用同步机制加载模块
加载方式:
- 加载内置模块 require(‘fs’)
- 加载 相对|绝对 路径的文件模块
-
require('/User/.../file.js') 复制代码
-
require('./file.js') 复制代码
- 加载npm 包 require(‘lodash’)
npm 包查找原则:require(‘lodash’)
- 当前目录 node_modules
- 如果没有,父级目录的ndoe_modules
- 如果没有,沿着路径向上递归,直到根目录下node_modules
- 找到之后会加载package.json.main指向的文件,如果没有package.json则依次查找Index.js、index.json、index.node
require.cache中缓存着加载过的模块,缓存的原因:同步加载
- 文件模块查找耗时,如果每次require都需要重新遍历查找,性能会比较查;
- 在实际开发中,模块可能包含副作用代码
其他模块化规范
- AMD是RequireJS在推广过程中规范化产出,异步加载,推崇依赖前置;
- CMD是SeaJS在推广过程中规范化产出,异步加载,推崇就近依赖;
- UMD规范兼容AMD和CommonJS模式
- ES Modules(ESM),语言层面的模块化规范,与环境无关,可借助babel编译
ES Modules(ESM)
ESM是在ES6语言层面提出的一种模块化标准;
ESM中主要有import、export两个关键词,不能console.log打印两个关键字。
CommonJS VS ESM
- CommonJS模块输出的是一个值的拷贝;ESM模块输出的是值的引用
- CommonJS模块是运行时加载;ESM模块是编译时输出(提前加载)
可以混用,但是不建议(import commonjs || imprt 中的require)
2.6 常用模块介绍
03.包管理
npm介绍
NPM 是Node.js中的包管理,提供了安装、删除等其它命令来管理包
私有npm
- 镜像公司内部私有npm
- 镜像公司设置npm config set registry=bnpm.byted.org
其他
- 并行安装
- 扁平管理
- 锁文件(lockfile)
- 缓存优化
- npm | yarn => lock/扁平/缓存
- pnpm => monorepo/硬、符号链接/安全性高…
04. 异步编程
Callback
Promise
Promise是具有四个状态的有限状态机,其中三个核心为Pending(挂起),Fulfilled(完成)、Rejected(拒绝),以及还有一个未开始状态。
使用Promise,实现读取package.json中main字段对应的文件内容。
Promise解决了回调地狱的问题。
Event
发布订阅模式,Node.js内置events模块,比如HTTP server on(‘request’)事件监听
05. Web应用开发
HTTP模块
搭建一个最简单的HTTP服务?Node.js内置HTTP模块
const http = require('http');
http.createServer((req,res)=>{
res.end('Hello World\n');
}).listen(3000,()=>{
console.log('App running at http://127.0.0.1:3000/')
})
复制代码
Koa介绍
Koa —— 基于Node.js平台的下一代Web开发框架
Koa它不仅仅提供了一个轻量优雅的函数库,使得编写Web应用变得得心应手,不在内核方法中绑定任何中间件
const app = new Koa();
app.use(async ctx => {
ctx.body = 'Hello World';
});
app.listen(3000,() =>{
console.log('App start at http://localost:3000 ...');
})
复制代码
Koa中间件
Koa应用程序是一个包含一组中间件函数的对象,它是按照洋葱模型组织和执行的
基于Koa的前端框架
开源:ThinkJS / Egg …
内部:Turbo、Era、Gulu …
它们做了什么?
- Koa对象 response / request / context / application 等扩展
- Koa常见中间库
- 公司内部服务支持
- 进程管理
- 脚手架
- …
06. 开发调试
日志调试-断点调试
npm install ndb -g
复制代码
ndb node bootstrap.js
07. 线上部署
利用多核CPU
进程守护
Node.js进程管理工具:
- 多进程
- 自动重启
- 负载均衡
- 日志查看
- 性能监控
- …