node.js
node知识点
-
console
-
__dirname 当前文件所在的目录。
-
__filename 文件的全路径。
-
eventLoop
-
宏任务、微任务
javascript
//宏任务 主体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目录下(一般用于第三方库)
```javascript //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内置模块:
javascript let fs = require('fs') //如果自己定义的模块和核心模块冲突,则默认加载核心模块。
-
-
模块文件后缀处理机制:
.js>.json>.node
- es6模块化
```javascript //导出 export var a = 10; //每个模块只能存在一个default export default 100 //导入 import {a} from './m1' import * as m1 from './m1' //导入默认,直接赋值 import a from './m1'
```
-
内置对象
-
events
```javascript 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(全局对象,不需要引入)
```javascript //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
```javascript 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