一、Node.js简介
1.1 安装与运行
Node.js是一个基于Google V8引擎的、跨平台的JavaScript运行环境
node程序:
const { readFile } = require('fs'); readFile('./package.json', { encoding: 'utf-8' }, (err,data) => { if(err) { throw err; } console.log(data) }) 复制代码
该段代码的作用就是输出package.json文件内容。
1.2 版本管理
在同一个设备上如何切换Node.js版本
版本管理工具:
- n:一个npm 全局的开源包,是依赖
npm
来全局安装、使用的 - fnm:快速简单,兼容性支持
.node-version
和.nvmrc
文件 - nvm:独立的软件包,
Node Version Manager
1.3 Node.js特点
异步I/O,单线程,跨平台
异步I/O
当Node.js执行I/O操作时,会在响应返回并恢复操作,而不是阻塞线程并浪费CPU循环等待。
![image.png](p1-juejin.byteimg.com/tos-cn-i-k3… 15774042845a472c3f83866d~tplv-k3u1fbpfcp-watermark.image)
单线程
Node.js保持了JavaScript在浏览器中单线程的特点
优点:
- 不用处处在意状态同步问题,不会发生死锁
- 没有线程上下文切换带来的性能开销 缺点:
- 无法利用多核CPU
- 错误会引起整个应用退出,健壮性不足
- 大量计算占用导致CPU,无法继续执行
以浏览器为例,浏览器是多进程,JS引擎单线程
- Brower进程:浏览器主进程,只有一个
- 插件进程:插件使用时才创建
- GPU进程:最多一个用于3D绘制
- 渲染进程:页面渲染、JS执行、事件处理 GUI渲染线程+JS引擎线程+V8+事件触发线程+定时器触发线程+异步请求线程
跨平台
兼容Windows和Linux平台,主要得益于在操作系统与Node上层模块系统之间构建了一层平台架构。
应用场景
Node.js在大部分领域都占用一席之地,尤其是I/O密集型的
- Web应用: Express / Koa
- 前端构建:Webpack
- GUI 客户端软件:VSCode / 网易云音乐
- 其他:实时通讯、爬虫、CLI等
二、模块化机制
- 何为模块化? 根据功能或业务将一个大程序拆分成互相依赖的小文件,再用简单的方式拼装起来
- 为什么模块化?无模块化问题
- 所有script标签必须保证顺序正确,否则会依赖报错
- 全局变量存在命名冲突,占用内存无法被回收
- IIFE/namespace会导致代码可读性低等诸多问题
2.1 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都需要重新遍历查找,性能会比较查;
- 在实际开发中,模块可能包含副作用代码
2.2 其他模块化规范
- AMD是RequireJS在推广过程中规范化产出,异步加载,推崇依赖前置;
- CMD是SeaJS在推广过程中规范化产出,异步加载,推崇就近依赖;
- UMD规范兼容AMD和CommonJS模式
- ES Modules(ESM),语言层面的模块化规范,与环境无关,可借助babel编译
2.3 ES Modules(ESM)
ESM是在ES6语言层面提出的一种模块化标准;
ESM中主要有import、export两个关键词,不能console.log打印两个关键字。
2.5 CommonJS VS ESM
- CommonJS模块输出的是一个值的拷贝;ESM模块输出的是值的引用
- CommonJS模块是运行时加载;ESM模块是编译时输出(提前加载)
可以混用,但是不建议(import commonjs || imprt 中的require)
2.6 常用模块介绍
三、包管理
3.1 npm介绍
NPM 是Node.js中的包管理,提供了安装、删除等其它命令来管理包
3.2 私有npm
- 镜像公司内部私有npm
- 镜像公司设置npm config set registry=bnpm.byted.org
3.4 其他
- 并行安装
- 扁平管理
- 锁文件(lockfile)
- 缓存优化
- npm | yarn => lock/扁平/缓存
- pnpm => monorepo/硬、符号链接/安全性高...
四、异步编程
4.1 Callback
4.2 Promise
Promise是具有四个状态的有限状态机,其中三个核心为Pending(挂起),Fulfilled(完成)、Rejected(拒绝),以及还有一个未开始状态。
使用Promise,实现读取package.json中main字段对应的文件内容。
Promise解决了回调地狱的问题。
4.3 Event
发布订阅模式,Node.js内置events模块,比如HTTP server on('request')事件监听
五、Web应用开发
5.1 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/') }) 复制代码
5.2 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 ...'); }) 复制代码
5.3 Koa中间件
Koa应用程序是一个包含一组中间件函数的对象,它是按照洋葱模型组织和执行的
5.4 基于Koa的前端框架
开源:ThinkJS / Egg ...
内部:Turbo、Era、Gulu ...
它们做了什么?
- Koa对象 response / request / context / application 等扩展
- Koa常见中间库
- 公司内部服务支持
- 进程管理
- 脚手架
- ...
七、线上部署
7.1 利用多核CPU
7.2 进程守护
Node.js进程管理工具:
- 多进程
- 自动重启
- 负载均衡
- 日志查看
- 性能监控
- ...
7.3 复杂计算
总结
最后
⚽本文介绍的Node.js入门知识~
⚾如果你对这篇文章感兴趣欢迎点赞关注+收藏,更多精彩知识正在等你!😘