Node基础
Node.js是什么
- Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,不是一门语言,不是库,不是框架,是可以解析和执行JavaScript代码,就像浏览器一样,现在的JavaScript可以完全脱离浏览器来运行。
- Node.js是服务端,后端开发的。学习Node.js就是在学习web服务器开发的过程。Node.js是构建与Chrome的V8引擎之上。
Node.js架构
1. Natives modules(内置核心模块)
2. Buitin modules “胶水层”(可以理解为函数,我们使用的时候直接去调用)
3. v8引擎:执行js代码,提供桥梁接口(js与c/c++的转换)
4. libuv:事件循环、事件队列、异步IO,node环境下处理代码具体执行细节
5. 第三方模块:zlib、http、c-ares等
Node.js为什么慢慢演化为一门服务端“语言”
1. 用户发送请求到获取数据的过程
在 Node.js 里运行 JavaScript 跟在 Chrome 里运行 JavaScript 有什么不同?
1. Node.js 没有浏览器 API ,即 document ,window 等
2. 加了许多 Node.js API
3. 对于开发者来说,Node.js :
-
- 在浏览器里写 JavaScript 是在控制浏览器。
- 而 Node.js 让你用类似的方式,控制整个计算机
- 在浏览器端开发页面,是和用户打交道、重交互,浏览器还提供了各种Web Api供我们使用。Node.js主要面向数据,收到请求后,返回具体的数据。这是两者在业务路径上的区别。
Node.js异步IO
1. 为什么要使用异步IO
-
- 同步任务: 任务1 ----> 任务2
- 异步任务: 任务1 + 任务2
2. 阻塞IO
-
- 优点:代码好理解,且阻塞时不会占用系统资源;
- 缺点:高并发场景需要较高的线程数,资源占用大,且线程切换有成本
3. 非阻塞IO
-
- 可以立即返回状态处理其他事物对于性能很友好,但是不一定是我们业务的需要数据只是当前调用状态,操作系统为了获取完整的数据就会重复调用IO操作(轮询read、select、poll等)。我们期望是的不需要主动判断的非阻塞IO,所以node.js的libuv就出来了。nodejs单线程配合事件驱动架构及libuv实现异步IO
4. node实现异步IO过程
如果处理的是网络io就会调用相应操作系统接口出来,如果是文件io就会把代码放到线程池去处理,最后都会放到事件队列去处理
Nodejs应用场景
-
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。这种模型使得Node.js 可以避免了由于需要等待输入或者输出(数据库、文件系统、Web服务器...)响应而造成的 CPU 时间损失。所以,Node.js适合运用在高并发、I/O密集、少量业务逻辑的场景。
node.js简单实现api服务
// 在node环境下结合ts简单实现RESTful风格api服务,感受node开发带给前端工程师的更多可能
// 新建一个工程空文件夹即可
// 通过npm init -y 初始化得到package.json文件
// 当前我们需要的是什么需要在node环境下结合ts实现代码的书写,提供一个服务然后根据路径去匹配服务通过接口把数据返回
// 全局安装typescript npm i typescript -g
// 使用tsc tsc--init 配置修改配置文件
// 安装ts-node npm i ts-node -D/npm install -g ts-node 直接在项目内运行ts代码
// 利用第三方框架快速起一个服务安装express模块,npm i express 和npm i @types/express -d
import express from 'express'
// 调用方法开启服务
const app=express()
app.get('/',(req,res)=>{
res.end("1231")
})
app.listen('8080',()=>{
console.log("启动")
})
const express = require("express");
// 创建服务器
const app = express();
app.use((req,res,next) => {
if(req.headers['content-type'] === 'application/json') {
req.on('data', data => {
const userInfo = JSON.parse(data.toString())
req.body = userInfo
})
req.on('end', () => {
next()
})
} else {
}
})
app.listen(8000, () => {
console.log("服务器启动成功~");
});
Node.js常见全局变量
1.__filename:返回正在执行脚本文件的绝对路径
2.__dirname:返回正在执行脚本所在目录
3.timer类函数:执行顺序与事件循环间的关系
4.process:提供与当前进程互动的接口
5.require:实现模块的加载
6.module、exports:处理模块的导出
7.全局变量-process
1.资源:内存和cpu占用
console.log(process.memoryUsage())
// {
// rss: 153358336,
// heapTotal: 130035712,
// heapUsed: 109214344,
// external: 2990366,
// arrayBuffers: 1497482
//
console.log(process.cpuUsage())
// { user: 1968000, system: 234000 }
2.运行环境:运行目录、node环境、cpu架构、用户环境、系统平台
console.log(process.cwd())
console.log(process.version)
console.log(process.arch)
console.log(process.env.NODE_ENV)
console.log(process.env.PATH)
3.运行状态:启动参数、PID、运行消耗时间
console.log(process.argv)
// [
// 'D:\Program Files\nodejs\node_modules\ts-node\dist\bin.js',
// 'C:\Users\admin\Desktop\cli\test\api.ts'
// ]
console.log(process.pid)
console.log(process.uptime());
转载自:https://juejin.cn/post/7246266523559329849