Nodejs 基础
理解 Nodejs
什么是 Nodejs
- 本质是一个 js 解析器,js是脚本语言,需要解释器才能运行,Nodejs 就是这种解释器
- js 的运行时环境,js 一般在浏览器通过 js 引擎才能解释运行,而 Nodejs 让 js 脱离 了浏览器
- Node.js 是一个服务器程序,可以让 js 代码运行在服务器上,让 js 能做服务端的事情,比如操作文件、搭建 http 服务器
特点
事件驱动,IO 性能强大:js 主线程是单线程的,借助 nodejs 的事件循环,处理的 IO 都是异步的(异步任务丢给其它线程来执行),并不会阻塞主线程任务代码的执行,所以 Nodejs 适合 I/O 密集型的服务,不适合 CPU 密集型的服务
多线程
优势:可以同时处理多个任务,但是需要考虑资源争抢(锁)的问题;利用多核 CPU
劣势:比较消耗内存资源,线程间通信复杂
单线程
- 优势:节约内存,不会出现同时操作多个资源情况
使用场景
- 写后端服务:Koa、Express、nestjs
- 中间层,BFF
- 即时通讯、爬虫
- 服务端渲染,React、Vue
- 写构建工具:Webpack、gulp、rollup
- 前端工具包、脚手架
模块化
为什么需要模块化:
- 解决命名冲突,代码隔离
- 利于模块间复用、组合,方便扩展
Nodejs 使用的是 Commonjs 模块化规范
Commonjs
Npm
npm 是 nodejs 的包管理工具,用来管理和运行 nodejs 安装包的
npm 安装的包分为:
- 全局模块:在命令行使用的命令
- 局部模块:项目里面安装的模块
全局模块
全局模块安装后,就可以在命令行使用该模块提供的功能了,什么原理呢?
比如 npm i http-server -g ,会将包安装到全局的 node_modules ,具体安装位置,可以使用 npm -h 查看一下 npm 的安装位置,其他的全局包都是在 npm 同级的目录下 /Users/xxx/.nvm/versions/node/v16.20.0/lib/node_modules
$ npm -h
.....
npm@8.19.4 /Users/xxx/.nvm/versions/node/v16.20.0/lib/node_modules/npm
为什么安装到 /Users/xxx/.nvm/versions/node/v16.20.0/lib/node_modules 下的模块,可以全局使用模块提供的命令呢?是因为主机的环境变量里配置了命令的加载路径,可以使用env 命令看一下 PATH 环境变量
$ env
....
PATH=...:/Users/xiangliu/.nvm/versions/node/v16.20.0/bin:...
.......
当安装全局模块时,模块 package.json 的bin 配置的,都是主机可执行的命令文件, 会被软链到和 lib 同级的 bin 目录下,所以就能使用全局模块提供的 bin 命令了
局部模块
在项目里安装的包,都会被放到项目的 node_modules 目录下。
在项目里我们可以通过,npm run 的方式来运行 npm 包提供的命令,原理其实和全局模块的方式差不多。可以在项目目录下,使用 npm run env 看一下环境变量 PATH
$ npm run env
PATH=/Users/xiangliu/Documents/work-fe/authing/yanfa/serve-docs/node_modules/.bin:.......
在使用 npm run 执行命令时,npm 会在环境变量的最前面,临时添加项目的 ./node_modules/.bin 路径,所以 package.json 配置的 scripts 才可以执行 。npm 执行完后 会消除项目的 ./node_modules/.bin 路径