目录
一、Node 基础
1、课程概述
Node.js可以做什么 ?
2、Node.js 架构
- Native modules
- Builtin modules "胶水层"
- 底层
3、为什么是Node.js ?
Node 慢慢演化为一门服务端“语言”
IO 是计算过程操作过程中最缓慢的环节
Reactor 模式,单线程完成多线程工作
Reactor 模式下实现异步IO、事件驱动
Node.js 更适用于 IO 密集型高并发请求
4、Node.js 的 异步IO
分为非阻塞 IO 和阻塞 IO
重复调用 IO 操作,判断 IO 是否结束
read、select 、poll、kqueue、event ports
期望实现无须主动判断非阻塞 IO
异步 IO 总结
- IO 是应用程序的瓶颈所在
- 异步 IO 提高性能无采原地等待结果返回
- IO 操作属于操作系统级别,平台都有对应实现
- Node.js 单线程配合事件驱动架构及 libuv 实现了异步 IO
5、Node.js 主线程是单线程
6、Node.js 应用场景
IO 密集型高并发请求
Node.js 作为中间层
操作数据库提供API服务
实时聊天应用程序
Node.js 更加适合 IO 密集型任务
7、 Nodejs实现API服务
(1)npm init -y
(2)npm i typescript -g
(3)tsc --init
(4)npm i ts-node -D // 用于运行 ts 脚本
(5)npm i express
(6)npm i @types/express -D // 用于编译 ts 中未定义的变量
(7)编写 api_server.ts
(8)启动文件 ts-node .\api_server.ts
8、Node.js 全局对象
- 与浏览器平台的 window 不完全相同
- Node.js 全局对象上挂载许多属性
全局对象是 Javascript 中的特殊对象
Node.js 中全局对象是 global
Global 的根本作用就是作为宿主
全局对象可以看作是全局变量的宿主
9、Node.js 常见全局变量
- __filename:返回正在执行脚本文件的绝对路径
- __dirname:返回正在执行脚本所在目录
- timer 类函数:执行顺序与事件循环间的关系
- process:提供与当前接口互动的接口
- require:实现模块的加载
- module、exports:处理模块的导出
10、全局变量之 process
- 无需 require 可直接使用
- 获取进程信息
- 执行进程操作
(1)资源:CPU 内存
console.log(process.memoryUsage())
console.log(process.cpuUsage())
(2)运行环境
- process.cwd() // 运行目录
-
process.version // 运行版本 process.versions // 详细的运行版本
-
process.arch // cpu架构
-
process.env.NODE_ENV // node环境
-
process.env.PATH // 路径
-
process.env.USERPROFILE // 用户环境 mac是HOME
-
process.platform // 系统平台
(3)运行状态
-
process.argv // 启动参数
-
process.argv0 // 获取第一个启动参数
-
process.pid // PID
-
process.uptime // 运行时间
(4)事件
process.on('beforeExit', (code) => {
console.log('before exit' + code)
})
process.on('exit', (code) => { // 退出程序
console.log('exit' + code)
})
console.log('代码执行完了')
process.exit()
// 代码执行完了
// exit0
(5)标准输出 输入 错误
console.log = function(data) {
process.stdout.write('---' + data + '\n')
}
console.log(11)
console.log(22)
// 11
// 22
const fs = require('fs')
fs.createReadStream('test.txt') //读取文件内容
.pipe(process.stdout)
// 拉钩教育
process.stdin.pipe(process.stdout) // 自定义输入输出
// 123
// 123
process.stdin.setEncoding('utf-8') // 自定义文本格式输入输出
process.stdin.on('readable', () => {
let chunk = process.stdin.read()
if (chunk !== null) {
process.stdout.write('data' + chunk)
}
})
// 123
// data123
二、核心模块
1、内置模块之 PATH(用于处理文件/目录的路径)
path 模块中常见的 API
- basename() 获取路径中基础名称‘
const path = require('path')
console.log(__filename); // F:\lagou\05-01\5-1-课程资料\Code\01Base\06-path.js
// 1 获取路径中的基础名称
// 01 返回的就是接收路径当中的最后一部分
// 02 第二个参数表示扩展名,如果说没有设置则返回完整的文件名称带后缀
// 03 第二个参数作为后缀时,如果没有在当前路径中被匹配到,那么就被会忽略
// 04 处理目录路径的是哦胡如果说,结尾处有路径分隔符,则也会被忽略掉
console.log(path.basename(__filename)); // 06-path.js
console.log(path.basename(__filename, '.js')); // 06-path
console.log(path.basename(__filename, '.css')); // 06-path.js
console.log(path.basename('a/b/c')); // c
console.log(path.basename('a/b/c/')); // c
- dirname() 获取路径中目录名称
// 2、获取路径目录名(路径)
// 01 返回路径中最后一个部分的上一层目录所在路径
console.log(path.dirname(__filename)) // F:\lagou\05-01\5-1-课程资料\Code\01Base
console.log(path.dirname('a/b/c')) // a/b
console.log(path.dirname('a/b/c/')) // a/b
- extname() 获取路径中扩展名称
// 3、获取路径的扩展名
// 01 返回 path 路径中相应文件的后缀名
// 02 如果 path 路径当中存在多个点,它匹配的是最后一个点,到结尾的内容
console.log(path.extname(__filename)); // .js
console.log(path.extname('a/b')); // 空
console.log(path.extname('a/b/index.html.js.css')); // .css
console.log(path.extname('a/b/index.js.')); // .
- isAbsolute() 获取路径是否为绝对路径
// 6、判断当前路径是否为绝对
console.log(path.isAbsolute('foo')); // false
console.log(path.isAbsolute('/foo')); // true
console.log(path.isAbsolute('///foo')); // true
console.log(path.isAbsolute('')); // false
console.log(path.isAbsolute('.')); // false
console.log(path.isAbsolute('../bar')); // false
- join() 拼接多个路径片段
// 7、拼接路径
console.log(path.join('a/b', 'c', 'index.html')); // a\b\c\index.html
console.log(path.join('/a/b', 'c', 'index.html')); //