跳到主要内容

Nodejs 基础

理解 Nodejs​

什么是 Nodejs​

  1. 本质是一个 js 解析器,js是脚本语言,需要解释器才能运行,Nodejs 就是这种解释器
  2. js 的运行时环境,js 一般在浏览器通过 js 引擎才能解释运行,而 Nodejs 让 js 脱离了浏览器
  3. Node.js 是一个服务器程序,可以让 js 代码运行在服务器上,让 js 能做服务端的事情,比如操作文件、搭建 http 服务器

特点​

事件驱动,IO 性能强大:js 主线程是单线程的,借助 nodejs 的事件循环,处理的 IO 都是异步的(异步任务丢给其它线程来执行),并不会阻塞主线程任务代码的执行,所以 Nodejs 适合 I/O 密集型的服务,不适合 CPU 密集型的服务

多线程

  • 优势:可以同时处理多个任务,但是需要考虑资源争抢(锁)的问题;利用多核 CPU

  • 劣势:比较消耗内存资源,线程间通信复杂

单线程

  • 优势:节约内存,不会出现同时操作多个资源情况

使用场景​

  1. 写后端服务:Koa、Express、nestjs
  2. 中间层,BFF
  3. 即时通讯、爬虫
  4. 服务端渲染,React、Vue
  5. 写构建工具:Webpack、gulp、rollup
  6. 前端工具包、脚手架

模块化​

为什么需要模块化:

  • 解决命名冲突,代码隔离
  • 利于模块间复用、组合,方便扩展

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 路径