如何实现按需加载,需要使用动态加载
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.js
console.log(cons)
cons()
}
a.js 的代码
export function cons(){
console.log("异步函数启动")
}
util.js的代码
export { chunk } from "lodash-es";