node相关

186 阅读3分钟

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: 删除指定文件