如何实现按需加载,需要使用动态加载
webpack 如何实现异步加载
动态加载
需要使用 import()
import 是ES6的草案
webpack会认为用这个导入的模块是需要异步导入的,可以实现动态加载
浏览器会使用JSOP的方式远程去读取一个js模块import() 会返回一个promis
案例1
动态加载插件
index.html的源码
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><button class="box">button</button></body></html>
index.js的源码
let box = document.getElementsByClassName('box')[0];box.onclick = async function(){console.log("box的单击事件触发")const { compact } = await import(/* webpackChunkName:"lodash" */"lodash-es"); // lodash-es是使用es6导出的方式导出的,lodash是commonJs的方式导出的let a = compact([0,"",1,2,false,50])console.log(a)}
案例二
动态加载自己的代码
index.html 代码与上面的不变
index.js的代码
let box = document.getElementsByClassName('box')[0];box.onclick = async function(){console.log("box的单击事件触发")const {cons} = await import("./a")console.log(cons)cons()}
a.js 的代码
export function cons(){console.log("异步函数启动")}
案例三
先导入,在动态加载
index.js 的代码
let box = document.getElementsByClassName('box')[0];box.onclick = async function(){console.log("box的单击事件触发")const {cons} = await import("./util") // 此处不再导入a.js 而是导入util.jsconsole.log(cons)cons()}
a.js 的代码
export function cons(){console.log("异步函数启动")}
util.js的代码
export { chunk } from "lodash-es";
