node.js
node知识点
console
__dirname 当前文件所在的目录。
__filename 文件的全路径。
eventLoop
宏任务、微任务
//宏任务 主体script setTimeout setInterval (new Promise) //微任务 Promise.then process.nextTick() setTimeout(()=>{ //宏任务 new Promise(resolve =>{ console.log("promise") resolve() }).then(()=>{ //微任务 console.log("then") }) //宏任务 console.log(1) //宏任务 setTimeout(()=>{ console.log(222) }) })
模块化(commonjs规范)
一个文件就是一个独立的模块。每个模块都有自己的独立作用域—模块作用域
模块加载采用同步模式。
通过require导入,exports导出。module.exports == exports 返回true,但是使用上有一定的注意事项:
每一个模块中都有一个内置的对象:module,该对象包括当前模块文件的一些信息
- id 当前模块的唯一标识,默认id为当前文件的绝对路径
- filename 当前模块的文件
- parent
- children
- loaded
- paths
模块类型
文件
文件夹
当我们导入的模块是一个文件夹的时候,就会引入文件夹模块导入机制:1.读取该文件夹下的package.json文件。2.导入文件中main选项指定的文件。3.如果不存在,则导入文件夹下的index.js。
node_modules文件夹:如果我们的模块在node_modules目录下(一般用于第三方库)
//let m2 = require('./node_modules/m2') let m2 = require('m2')//和上面的效果一样 //如果模块的加载是以./ ../ /开头的,就是路径模块加载模式 //不以./ ../ /开头的,按照另外一种加载机制,非路径加载模式,按照以下规则查找: //在module对象有一个属性paths,里面保存的是非路径模式下的查找列表。 paths: [ '/Users/haominglfs/Documents/es6/node_modules', '/Users/haominglfs/Documents/node_modules', '/Users/haominglfs/node_modules', '/Users/node_modules', '/node_modules' ]
global 文件夹:所有项目都可以使用的模块,在node安装目录下node_modules文件夹。
核心模块:node内置模块:
let fs = require('fs') //如果自己定义的模块和核心模块冲突,则默认加载核心模块。
模块文件后缀处理机制:
.js>.json>.node
es6模块化
//导出 export var a = 10; //每个模块只能存在一个default export default 100 //导入 import {a} from './m1' import * as m1 from './m1' //导入默认,直接赋值 import a from './m1'
内置对象
events
const eventEmitter = require('events') class Person extends eventEmitter{ constructor(name){ super() this.name = name; this.age = 0; this.growup(); } growup(){ setInterval(() => { this.age++; this.emit('growup') //触发事件 }, 1000); } } const p1 = new Person('郝明'); p1.addListener('growup',function(){ //注册监听器 console.log('growup 1') }) console.log(p1.eventNames())
process(全局对象,不需要引入)
//process.argv 属性返回一个数组,其中包含当启动 Node.js 进程时传入的命令行参数。 console.log(process.argv) //环境变量 console.log(process.env) //标准输入输出 process.stdout.write('hello') process.stdin.on('data',(e)=>{ console.log('用户输入'+e.toString()) })
stream
- 四种基本类型
- Writable 可写入数据的流。 fs.createWriteStream()
- Readable 可读取数据的流。 fs.createReadStream()
- Duplex 可读又可写的流。 Net.Socket()
- Transform 在读写过程中可以修改后转换
- 四种基本类型
buffer
filesystem
const fs = require('fs') //First Error :node 中的一种约定,如果一个回调可能有错误发生,那么约定回调函数的第一个参数用来做//错误对象 // fs.writeFile('./1.txt','你好我好',(err)=>{ // if(err) throw err // console.log('文件已保存') // }) // let res = fs.writeFileSync('./2.txt','你好','utf8') // console.log(res) //返回buffer fs.readFile('./1.txt',(err,data)=>{ if(err) throw err console.log(data.toString()) }) let content = fs.readFileSync('./2.txt') console.log(content) try{ let st = fs.statSync('./1.txt') console.log(st) console.log(st.isFile()) console.log(st.isDirectory()) }catch(e){ console.log(e) } //删除 //fs.unlinkSync('./1.txt') //文件夹 //fs.mkdirSync('./a') //不能递归创建文件夹 //fs.mkdirSync('./a/b/c') //不能删除非空文件夹 fs.rmdirSync('./a'); let dir = './a'; // let files = fs.readdirSync(dir); // files.forEach(child=>{ // fs.unlinkSync(dir+'/'+child); // }) rmdir(dir) //递归删除文件夹 function rmdir(dirpath){ let files = fs.readdirSync(dirpath); files.forEach(child=>{ let childPath = dirpath+'/'+child; let st = fs.statSync(childPath) if(st.isDirectory()){ rmdir(childPath) }else{ fs.unlinkSync(childPath); } }) fs.rmdirSync(dirpath) } //监听文件或目录 const fs = require('fs') fs.watchFile('./2.txt',(e)=>{ console.log(e) })
npm
- 能不安装全局就不安装全局。
- 命令行工具(第三方模块):
- commander
- chalk
- Inquirer
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 haominglfs的博客!