node.js学习

对于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)

./有两种情况:

  1. 当在require里面使用时,等同于__dirname(总是文件绝对路径)
  2. 当在其他地方使用时,等同于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 => {})

异步操作

目前解决异步的方法promiseasync 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)
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容