node.js--遵循 CommonJS的模块化规范。
1、导入模块:requrie();
模块对外共享成员:module.exports对象
ES6模块化---
2、ES6模块化规范的定义:
每个js文件都是一个独立的模块
导入其他模块成员使用 import 关键字
向外共享模块成员使用 export 关键字
3、node.js体验ES6模块化
①. 版本需高于v14.15.1
②. 在package.json的根节点中添加"type":"module"
4、(1)默认导出的语法:
// 语法:export defalut 默认导出的成员
let n1 = 10;
let n2 = 20;
function show() {
}
export default {
n1,
show
}
//export defalut
//每个模块中,只能使用唯一一次,否则会报错
(2)默认导入的语法:
语法: import 接收名称 from "模块标识符"
import m1 from "./01默认导出.js";
(3)按需导出的语法:
export let s1 = 'aaa'
export let s2 = 'ccc'
export function say() { }
(4)按需导入的语法:
import { s1, s2 } from "./03按需导出.js"
import { s1, s2 as str2 } from "./03按需导出.js"
// as关键字---重命名
// s2改为str2
(5)直接运行模块中的代码
语法:import "模块标识符"
import "./05直接运行模块中的代码.js"
按需导入和导出的区别(注意事项):
1.默认导出只可使用一次,但按需导出可以使用多次
2.按需导入的成员名称必须和按需导出的名称保持一致
3.按需导入时,可以使用as作为关键字进行重命名
4.按需导入可以和默认导入一起使用
回调地狱:多层回调函数的相互嵌套。(回调套回调) 面试
解决回调地狱的方法:ES6新增的Promise
Promise---
①.一个构造函数
new出来的Promise 实例对象,代表一个异步操作。
const p= new Promise();
②.Promise.prototyp e 上包含 .then()方法
实例对象可以通过原型链的方式访问到.then()方法
③. .then()方法用来预先指定成功和失败的回调函数
p.then(成功的回调函数,失败的回调函数) 成功的回调函数必选。失败的回调函数可选 (无法保证文件的读取顺序)
then()方法的特性---
上一个.then()方法返回了一个新的Promise实例对象,可以通过下一个.then()继续处理。-----链式调用,用来解决回调地狱的问题
通过promise.prototype.catch()的方法捕获到错误
.catch((err) => {
console.log(err.message);
})
①..catch()可以放在最后边
②.如果不希望前面的错误导致后边的代码不再执行,可将.catch()向前提
promise.all()方法:等所有的异步操作全部结束之后去执行下一步的.then()操作(等待机制)按顺序返回所有的结果
promise.race()方法:返回最快的结果
基于promise封装读文件的方法:
import fs from 'fs'
function getFile(fpath) {
return new Promise(function (resolve, reject) {
fs.readFile(fpath, 'utf8', (err, dataStr) => {
if (err) return reject(err)
resolve(dataStr);
})
})
}
getFile('./files/1.txt').then((r1) => {
console.log(r1);
}, (err) => {
console.log(err.message);
});
async和await的基本使用:
import thenFs from 'then-fs';
async function getAllFile() {
const r1 = await thenFs.readFile("./files/1.txt", 'utf8');
console.log(r1);
const r2 = await thenFs.readFile("./files/2.txt", 'utf8');
console.log(r2);
const r3 = await thenFs.readFile("./files/3.txt", 'utf8');
console.log(r3);
}
getAllFile()
注意事项:
1、如果function内部有用到await,则function必须被async修饰
2、在async 方法中,第一个 await 之前的代码会同步执行,之后的代码会异步执行
同步任务和异步任务:
① 同步任务---非耗时任务
主线程上排队执行的任务(前一个任务执行完毕,才能执行下一个任务)
② 异步任务----耗时任务
异步任务由javascript委托给宿主环境进行执行(异步任务执行完成后,会通知javascript主线程执行异步任务的回调函数)
EvenLoop(事件循环)
宏任务和微任务:
宏任务和微任务的执行顺序:
宏任务执行完后,检查是否有微任务,如果有微任务,则执行微任务,后继续执行宏任务。
宏任务:
1、异步的Ajax请求
2、setTimeout setInterval
3、文件操作
4、其他宏任务
微任务:
1、Promise.then() .catch .finally
2、process.nextTick
3、其他微任务