对于node.js的学习,感谢菜鸟教程与慕课网提供的优秀资料
随着学习的深入,此文章持续更新...
CommonJS
- 支持
js json node
扩展名,不写依次尝试 - 不写路径则认为是
build-in
模块或各级node_modules
内的第三方模块 -
module
被加载的时候执行,加载后缓存 - 一旦出现某个模块被循环加载,就只输出已经执行的部分,还未执行的部分不会输出
const exports = module.exports
global
node里面没有window
全局变量,取代的是global
全局变量,例如:
global.a = 200
// 暴露到全局中
console.log(a) // 200
process
- 挂载在全局
global
下的方法,可以读取node命令参数
输出到控制台
process.stdout
argv = [node命令, main.js路径, --test, a=1, b=2]
const argv = process
node main.js --test a=1 b=2
当前进程执行路径(执行node脚本的路径)
console.log(process.cwd())
插入当前事件队列的最后一个 发生顺序 nextTick
> setTimeout
> `setImmediate
process.nextTick(() => {})
buffer
- Buffer类似于数组,挂载在全局
global
下的方法,操作二进制数据流
创建一个长度10且不可改变长度的Buffer,默认用0填充
const buf = Buffer.alloc(10)
buf[2] = 4
Buffer.alloc(5, 1) // 用1填充
定义一个长度为10 的Buffer,内容随机.因为没有清空值,所以创建速度更快
Buffer.allocUnsafe(10)
创建指定内容的Buffer,默认使用utf-8 编码
Buffer.from([1, 2, 3])
Buffer.from('test')
Buffer长度
Buffer.byteLength('test') // 4
Buffer.byteLength('测试') // 6
判断Buffer类型
Buffer.isBuffer({}) // false
Buffer.isBuffer(Buffer.from([1,2,3])) // true
拼接Buffer类型
const buf = Buffer.concat([Buffer.from('hello'), Buffer.from(' world')])
- Buffer类型的一些实例方法:
转换字符串类型,默认utf-8编码
console.log(buf.toString('base64'))
Buffer类型初始定义长度,与内容无关
console.log(buf.length) // 10
填充Buffer类型内容,第一个参数为填充内容,第二三个参数为填充位置
console.log(buf.fill(10, 2, 6)) // 10
判断Buffer类型的内容是否一样
console.log(Buffer.from('test').equals(Buffer.from('test')) // true
判断Buffer类型包含的内容位置,类似于数组的方法
console.log(Buffer.from('test').indexOf('es') // 1
console.log(Buffer.from('test').indexOf('es!') // -1
拷贝Buffer类型,参数buf2
开始拷贝位置,buf
拷贝区间
汉字长度为3,有时候会导致copy
乱码,可以用内置包string_decode
解决
const buf = Buffer.from([1, 2, 3, 4, 5, 6])
const buf2 = Buffer.alloc(3)
buf.copy(buf2, 0, 2, 3)
const StringDecoder = require('string_decode').StringDecoder
const decoder = new StringDecoder('utf8')
decoder.write(buf2)
常用api
path
合并出文件路径/usr/local/bin/
const path = require('path')
path.join('/usr', 'local', 'bin/')
解析出绝对路径
path.resolve('./')
文件名 文件夹名 扩展名
console.log(path.basename)
console.log(path.dirname)
console.log(path.extname)
(总是)解析出文件绝对路径 文件夹绝对路径
console.log(__dirname)
console.log(__filename)
./
有两种情况:
- 当在
require
里面使用时,等同于__dirname
(总是文件绝对路径) - 当在其他地方使用时,等同于
process.cwd()
(相对于进程绝对路径)
events
const EventEmitter = require('events')
class CustomEvent extends EventEmitter {}
const ce = new CustomEvent()
on
绑定事件与触发函数,一个事件可以绑定多个函数
emit
触发事件,填入参数
removeListener
移除单个事件函数
removeAllListener
移除所有事件函数
var fn1 = function() {
console.log('remove')
}
ce.on('error', (err, time) => {
console.log(err)
console.log(time)
})
ce.on('error', fn1)
ce.emit('error', new Error('oops!'), Date.now())
ce.removeListener('error', fn1)
once
绑定的事件只会触发一次
ce.once('test', () => {
console.log('test event once')
})
fs 文件操作
读取文件,分同步与异步方法,可设置读取格式参数utf8
默认为Buffer
类型
const fs = require('fs')
fs.readFile('./main.js', 'utf8', (err, data) => {
if (err) throw err
console.log(data)
})
// 同步
const data = fs.readFileSync('./main.js', 'utf8')
console.log(data)
创建写入文件,默认类型utf8
也可以传入Buffer
类型
fs.writeFile('./text', 'hello world', 'uft8', err => { })
const content = Buffer.from('this is a test!')
fs.writeFile('./text', content, err => {})
// 添加文件内容
fs.appendFile('file', '你好 python', (err) => {})
读取文件状态 监视文件状态
fs.stat('./main.js', (err, stats) => {
if (err) {
console.log('文件不存在')
return
}
console.log(stats.isFile())
console.log(stats)
})
fs.watch('./', {
recursive: true // 递归监视
}, (eventType, filename) => { //事件类型 文件名
console.log(eventType, filename)
})
文件流相关 读与写
const rs = fs.createReadStream('./main.js')
// 打印到控制台,pipe可以链式使用
rs.pipe(process.stdout).pipe(...)
const ws = fs.createWriteStream('./text.txt')
const tid = setInterval(() => {
const num = parseInt(Math.random() * 10)
console.log(num)
if (num < 8) {
ws.write(num + '')
} else {
clearInterval(tid)
// 结束写入流
ws.end()
}
}, 200)
// 结束时触发 finish 事件
ws.on('finish', () => {
console.log('done!')
})
压缩文件
const {createGzip, createDeflate} = require('zlib')
const inp = fs.createReadStream('input.txt');
const out = fs.createWriteStream('input.txt.gz');
inp.pipe(createGzip()).pipe(out);
改名 删除
fs.rename('./main.js', 'index.js', err => {})
fs.unlink('./main.js', err => {})
读取文件列表 创建文件夹 删除文件夹
fs.readdir('./', (err, files) => {
if (err) throw err
console.log(files)
})
fs.mkdir('test', err => {})
fs.rmdir('test', err => {})
异步操作
目前解决异步的方法promise
与 async await
// promise化工具
const promisify = require('util').promisify
const read = promisify(fs.readFile)
read('./main.js').then(data => {
console.log(data)
}).catch(err => {
console.log(err)
})
// async await
const test = async function() {
try {
const content = await read('./main.js')
console.log(content.toString())
} catch (err) {
console.log(err)
}
}