Node.js高级编程【一】node 基础

本文详细介绍了Node.js的基础知识,包括其架构、异步IO、应用场景和实现API服务的方法。此外,还探讨了核心模块,如PATH、Buffer、FS模块以及事件循环机制,为深入学习Node.js打下坚实基础。
摘要由CSDN通过智能技术生成

目录

一、Node 基础

1、课程概述

2、Node.js 架构

3、为什么是Node.js ?

4、Node.js 的 异步IO

5、Node.js 主线程是单线程

6、Node.js 应用场景

7、 Nodejs实现API服务

8、Node.js 全局对象

9、Node.js 常见全局变量

10、全局变量之 process

二、核心模块

1、内置模块之 PATH(用于处理文件/目录的路径) 

2、全局变量之 Buffer

3、FS 模块

4、文件的打开与操作

5、大文件读写操作

6、 文件拷贝自定义实现

7、FS 之目录操作 API

8、创建目录之同步实现

9、 目录创建之异步实现

10、目录删除之异步实现

11、模块化历程

12、Commonjs 规范

13、 Nodejs与CommonJS

14、模块分类及加载流程

15、模块加载源码分析

16、内置模块之 VM 模块

17、模块加载模拟实现

18、核心模块之 Events

19、浏览器中的 Eventloop 事件环

20、Nodejs 下的事件环


一、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')); // 
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值