前端的代码分片,或许说是按需加载,本质上是因为前端页面愈来愈庞杂,代码体积愈来愈大,程序员需要对页面资本的加载做细粒度的掌握。按需加载当然是好东西,然则会让页面逻辑变得越发庞杂。幸亏webpack
涌现,让按需加载变得简朴多了。
我们来做一个简朴的demo,完全代码
demo的功用很简朴,单击一个按钮,然后去加载一个js文件并实行。
index.html文件:
<button id="btn">load script</button>
index.js文件
document.getElementById('btn').addEventListener('click',function(){
require.ensure([],()=>{
let hello = require('./Hello').default;
hello();
},'Hello')
})
Hello.js文件
export default function hello(){
alert('hello.')
}
在 click 的事宜处置惩罚函数中,经由过程 require.ensure
标记支解点,然后加载Hello.js
并赋值给变量hello
,末了挪用该要领。这里需要说一下的是require.ensure
的第三参数,是这个分片chunk的name。假如不加这个参数,默许会以chunkid
来定名该文件。这个参数在开辟环境照样很有效的,毕竟1.js
的文件名,让人很难定位文件。
因为 ES2015 Loader spec 定义了 import()
要领来在运行时动态的加载javascript
文件,所以webpack也把import()
作为split code
的支解点。
假如想用酷炫的import()
语法,还需要装置一个插件:npm i babel-plugin-syntax-dynamic-import --save-dev
。然后,就能够把上面的 index.js
文件改成:
document.getElementById('btn').addEventListener('click',function(){
import('./Hello').then((Hello) => {
let hello = Hello.default;
hello();
}).catch(err => console.log('Failed to load moment', err))
})
import()
支撑promise语法,所以可以用catch
来处置惩罚加载文件引发的异常。然则,它也有它的缺点,import()
没法给这个文件定名(类似于require.ensure
的第三个参数),如许打包出来的文件都是用数字来标示的,异常难以辨别,在开辟环境下,会使定位毛病变的越发难题。
另外,这两种语法在援用文件时,文件途径都不可所以表达式。比方:
require.ensure([],()=>{
let path = './Hello';
let hello = require(path).default;
hello();
},'Hello')
如许会报错,没法一般加载文件。