一、概述
NodeJs可以做什么?
- 轻量级、高性能的web服务器
- 前后端javsscript同构开发
- 便捷高效的前端工程化
二、nodejs架构
- 当前层内容由js实现
- 提供应用程序可直接调用库,例如fs、path、http等
- JS语言无法直接操作底层硬件设置
底层
- V8:执行 JS 代码,提供桥梁接口
- Libuv:事件循环、事件队列、异步IO
- 第三方模块:zlib、http、c-area等
三、为什么是nodejs
Nodejs 慢慢演化为了一门服务端“语言”
IO是计算机操作过程中最缓慢的环节
Reactor模式,单线程完成多线程工作
Reactor模式下实现异步IO、事件驱动
Nodejs更适用于IO密集型高并发请求
四、Nodejs 异步IO
五、事件驱动
事件驱动、发布订阅、观察者
发布订阅
const EventEmitter = require('events')
const myEvent = new EventEmitter()
myEvent.on('事件1', () => {
console.log('事件1执行了')
})
myEvent.on('事件1', () => {
console.log('事件1-2执行了')
})
myEvent.emit('事件1')
六、nodejs实现api服务
ts-node是直接运行ts的第三方包
server.ts
// 需求:希望有一个服务,可以依据请求的接口内容返回相应的数据
import express from 'express'
import {
DataStore } from './data'
// console.log(DataStore.list)
const app = express()
app.get('/', (req, res) => {
// res.end('1122')
res.json(DataStore.list)
})
app.listen(8080, () => {
console.log('服务已经开启了')
})
ts-node .\server.ts
七、nodejs全局对象
- __filename:返回正在执行脚本文件的绝对路径
- __dirname:返回正在执行脚本所在目录
- timer类函数:执行顺序与事件循环间的关系
- process:提供与当前进程互动的接口
- require:实现模块的加载
- module、exports:处理模块的导出
八、全局对象process - 1
// 1 资源: cpu 内存
// console.log(process.memoryUsage())
// console.log(process.cpuUsage())
// 2 运行环境:运行目录、node环境、cpu架构、用户环境、系统平台
/* console.log(process.cwd())
console.log(process.version)
// console.log(process.versions)
console.log(process.arch)
console.log(process.env.NODE_ENV)
// console.log(process.env.PATH)
console.log(process.env.USERPROFILE) // HOME
console.log(process.platform) */
// 3 运行状态: 启动参数、PID、运行时间
console.log(process.argv) // 可以获取执行脚本命令传入的参数
console.log(process.argv0) // execArgv
console.log(process.pid) // ppid
console.log(process.uptime()) // 脚本运行时间
案例 对一个文件进行md5加密
md5.js
const crypto = require('crypto');
const fs = require('fs');
function md51(path) {
let buffer = fs.readFileSync(path);
let fsHash = crypto.createHash('sha1');
fsHash.update(buffer);
return fsHash.digest('hex');
}
function md52(path) {
let buffer = fs.readFileSync(path);
let fsHash = crypto.createHash('sha256');
fsHash.update(buffer);
return fsHash.digest('hex');
}
console.log(md51(process.argv[2]));
console.log(md52(process.argv[2]));
执行 node md5.js 律动v0_4_3_20220808_mac_M1.zip
九、全局对象process - 2
脚本执行事件
process.on('exit', (code) => {
console.log('exit' + code)
})
process.on('beforeExit', (code) => {
console.log('exit' + code)
})
console.log('代码执行完了')
process.exit() //主动退出
console.log(1111) //不会执行