likes
comments
collection
share

Node基础

作者站长头像
站长
· 阅读数 12

Node.js是什么

  • Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,不是一门语言,不是库,不是框架,是可以解析和执行JavaScript代码,就像浏览器一样,现在的JavaScript可以完全脱离浏览器来运行。
  • Node.js是服务端,后端开发的。学习Node.js就是在学习web服务器开发的过程。Node.js是构建与Chrome的V8引擎之上。

Node.js架构

Node基础

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基础

Node基础


在 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

Node基础

4. node实现异步IO过程

Node基础

如果处理的是网络io就会调用相应操作系统接口出来,如果是文件io就会把代码放到线程池去处理,最后都会放到事件队列去处理

Nodejs应用场景

Node基础

  • 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());