github.com/songlindong… 代码在这可以参考
nodejs可以做什么
- 轻量级、高性能的web服务
- 前后端javaScript同构开发
- 便捷高效的前端工程化
node底层
NodeJS的架构分为三个部分,Natives modules, Builtin modules, 底层
- V8: 执行JS代码,提供桥梁接口
- Libuv: 事件循环、事件队列、异步IO
- 第三方功能模块:zlib、http、c-ares等
nodejs异步IO
- IO是应用程序的瓶颈所在
- 异步IO提高性能无采原地等待结果返回
- IO操作属于操作系统级别,平台都有对应实现
- nodejs单线程配合时间驱动架构及libuv实现了异步IO
事件驱动、发布订阅、观察者
const EventEmitter = require('events')
const myEvent = new EventEmitter()
myEvent.on('事件1', ()=>{
console.log('事件执行了')
})
myEvent.emit('事件1') // 事件执行了
nodejs的单线程
nodejs主线程是单线程
const http = require('http')
function sleepTime (time) {
const sleep = Date.now() + time * 1000
while(Date.now() < sleep){}
return
}
sleepTime(4)
const server = http.createServer((req, res) =>{
res.end('server starting.....')
})
server.listen(8080, ()=>{
console.log('服务启动了')
})
nodejs应用场景
- IO密集型高并发请求
- 操作数据库提供API服务
- 实时聊天应用程序
Nodejs全局对象
nodejs中的全局对象GLobal,全局对象可以看做事全局变量的宿主
- 与浏览器平台的window不完全相同
- nodejs全局对象上挂载很多属性
nodejs常见全局变量
- __filename: 返回正在执行脚本文件的绝对路径
- __dirname: 返回正在执行脚本所在目录
- __timer类函数: 执行顺序与事件循环间的关系
- __process: 提供与当前进程互动的接口
- require: 实现模块的加载
- module、exports: 处理模块的导出
process
// CPU 内存
// console.log(process.memoryUsage())
// console.log(process.cpuUsage())
// 运行环境、运行目录、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.PATH);
// console.log(process.env.USERPROFILE); // MAC系统 是HOME
// console.log(process.platform);
// 运行状态:启动参数、PID、运行时间
// console.log(process.argv)
// console.log(process.argv0)
// console.log(process.pid)
// console.log(process.uptime())
// setTimeout(() => {
// console.log(process.uptime())
// }, 3000)
// 事件
// process.on('exit', (code) =>{
// console.log('exit' + code) // 此函数内不能执行异步代码
// })
// process.on('beforeExit', (code) =>{
// console.log('beforeExit' + code) //此函数内可以执行异步代码
// })
// process.exit() // 主动执行退出
// console.log('代码执行完了')
// 标准输出 输入 错误
// console.log = function(data){
// process.stdout.write('---' + data + '\n')
// }
// console.log(22)
// console.log(33)
// const fs = require('fs')
// fs.createReadStream('test.txt').pipe(process.stdout)
// process.stdin.pipe(process.stdout)
// process.stdin.setEncoding('utf-8')
// process.stdin.on('readable', ()=>{
// let chunk = process.stdin.read()
// if(chunk){
// process.stdout.write('data' + chunk)
// }
// })
path 模块中常用的API
- basename()获取路径中基础名称
- dirname()获取路径中目录名称
- extname()获取路径中扩展名称
- isAbsolute()获取路径是否为绝对路径
- join()拼接多个路径片段
- resolve()返回绝对路径
- pasre()解析路径
- format()序列化路径
- normalize()规范化路径
Buffer总结
- 无须require的一个全局变量
- 实现nodejs平台下的二进制数据操作
- 不占据V8堆内存大小的内存空间
- 内存的使用由Node来控制,由V8的GC回收
- 一般配合Stream流使用,充当数据缓冲区
创建Buffer实例
Buffer是nodejs的内置类
- alloc: 创建指定字节大小的buffer
- allocUnsafe: 创建指定大小的buffer(不安全)
- from: 接收数据,创建buffer
Buffer实例方法
- fill:使用数据填充buffer
- write: 向buffer中写入数据
- toString: 从buffer中提取数据
- slice:截取buffer
- indexOf: 在buffer中查找数据
- copy: 拷贝buffer中的数据
Buffer静态方法
- concat: 将多个buffer拼接成一个新的buffer
- isBuffer: 判断当前数据是否为buffer
FS模块
FS是内置核心模块,提供文件系统操作的API
基本操作类
- stat -stat()
- write -createWriteStream()
- read -createReadStream()
- watcher -watch()
常用方法
- 权限操作 -> chmod、chgrp
- 文件增删改查 -> (打开/关闭-open/close)、(读取-readdir/readFile/readlink)、(写入-wrirte/writeFile/appendFile)、(删除)
工具方法
文件操作API
- readFile: 从指定文件中读取数据
- writeFile: 向指定文件中写入数据
- appendFile: 追加的方式向指定文件中写入数据
- copyFile: 将某个文件中的数据拷贝至另一文件
- watchFile: 对指定文件进行监控
常见目录操作API
- access: 判断文件或目录是否具有操作权限
- stat: 获取目录及文件信息
- mkdir: 创建目录
- rmdir:删除目录
- readdir: 读取目录中内容
- unlink: 删除指定文件