ES6 模块化
-
nodeJs 如何将文件里面的成员向外暴露
-
module.exports
-
exports
-
-
nodeJs 导入模块
-
require() 用户自定义模块需要加路径
-
-
什么是
es6模块化
规范-
ES6 模块化规范是
浏览器端
与服务器端
通用的模块化开发规范
-
-
es6 模块化规范的定义
-
每一个
js
文件都是一个独立的模块 -
向外共享成员使用
export
-
导入成员使用
import
-
在 node.js 中体验 ES6 模块化
-
确保安装了
v14.15.1
或更高版本的 node.js -
在 package.json 的根节点中添加
"type": "module"
节点
ES6 模块化语法
-
默认导出与默认导入
-
按需导出与按需导入
-
直接导入并执行模块中的代码
默认导出与默认导入
-
默认导出语句:export default 需要导出的成员
const n1 = 10 const n2 = 20 const show = () => { console.log('hello') } export default { n1, show }
-
默认导入语法:import 接收的名字 from '需要导入模块的路径'
import m1 from './1.默认导出.js' console.log(m1)
-
默认导出与默认导入的注意事项
-
每个模块中,只允许使用唯一的一次 export default,否则会报错!
-
默认导入时的接收名称可以任意名称,只要是合法的成员名称即可
-
按需导入与按需导出
-
按需导出的语法
-
按需导出的语法: export 按需导出的成员
export const n1 = 10 export const n2 = 20
-
-
按需导入的语法:
-
按需导入的语法: import { m1 } from '模块标识符'
import { n1 } from './3.按需导出.js' console.log(n1)
-
-
按需导入与按需导出的注意事项:
-
每个模块中可以使用多次按需导出
-
按需导入的成员名称必须和按需导出的名称保持一致
-
按需导入时,可以使用 as 关键字进行重命名
-
按需导入可以和默认导入一起使用
-
直接导入并执行模块中的代码
-
如果只想单纯地执行某个模块中的代码,并不需要得到模块中向外共享的成员。此时,可以直接导入并执行模 块代码
es6 模块化语法小结
-
默认导入与默认导出
-
默认导出语法:export default 需要导出的成员
-
默认导入语法: import 要接受的名称 from '模块标识符'
-
-
按需导入与按需导出:
-
按需导出语法:export 需要导出的成员
-
按需导入语法: import {要接受成员的名称} from '模块标识符'
-
-
直接导入
-
直接导入的语法:import '要直接导入的模块'
-
回调地狱
什么是回调地狱:多层回调函数的相互嵌套,就形成了回调地狱
-
如何解决回调地狱?
-
使用
promise
来解决回调地狱的问题
-
promise的基本概念
-
promise是一个构造函数,就可以通过 new Promise() 得到promise实例对象
-
Promise.prototype 上包含一个 .then() 方法 实例化对象可以访问
then
方法 -
then() 方法用来预先指定成功和失败的回调函数
promise的基本用法
const p1 = new Promise((resolve,reject) => { // 成功的时候 可以调用 resolve()方法 // 失败的时候 可以调用 reject()方法 })
const fs = require('fs') const path = require('path') const p1 = new Promise((resolve,reject) => { fs.readFile(文件的路径,'utf8',(err,data) => { // err 是一个对象 就表示读取失败 // err 是 null 就表示读取成功 if (err) return reject(err.message) resolve(data) }) }) p1.then(res => console.log(res), err => console.log(err))
.then() 方法的特性
-
如果上一个 .then() 方法中返回了一个新的 Promise 实例对象,则可以通过下一个 .then() 继续进行处理。通 过 .then() 方法的链式调用,就解决了
回调地狱
的问题。
通过 .catch 捕获错误
-
在 Promise 的链式操作中如果发生了错误,可以使用 Promise.prototype.catch 方法进行捕获和处理
Promise.all() 方法
Promise.all() 方法会发起并行的 Promise 异步操作,等所有的异步操作全部结束后才会执行下一步的 .then 操作(等待机制)
Promise.race() 方法
Promise.race() 方法会发起并行的 Promise 异步操作,只要任何一个异步操作完成,就立即执行下一步的 .then 操作(赛跑机制)
async 与 await (重点 必用)
async/await 是 ES8(ECMAScript 2017)引入的新语法,用来简化 Promise 异步操作。在 async/await 出 现之前,开发者只能通过链式 .then() 的方式处理 Promise 异步操作
-
语法
async function fn() { const r1 = await Promise对象 } const fn = async () => { const r1 = await Promise对象 }
-
注意事件
-
await关键字后面要跟
Promise对象
-
await关键字仅仅只能出来在被
async
修饰的函数里面 -
在 async 方法中,第一个 await 之前的代码会同步执行,await 之后的代码会异步执行
-
EventLoop
进行任务队列的监听,如果在任务列表中有任务需要执行,就会依次执行
-
js是单一线程,会造成线程死锁,同步会阻塞后面代码的执行
-
js将非耗时任务在主线程来执行,耗时任务就让委托给宿主环境来执行
-
宿主环境有:浏览器 nodejs
-
如果在主线程中有异步操作,就会将异步操作委托给宿主环境来执行,宿主环境中执行完异步操作之后,会将回调函数添加到任务队列中,主线程如果执行完所有非耗时任务,就会自动的扫描任务队列中是否有任务需要执行,如果有,就会依次执行