美文网首页
webpack ensure异步加载的原理

webpack ensure异步加载的原理

作者: AizawaSayo | 来源:发表于2019-04-24 21:02 被阅读0次

webpack ensure有人称它为异步加载,也就人称为代码切割。其实它就是把js模块给独立导出一个js文件,然后使用这个模块的时候,webpack会构造script dom元素,又浏览器发起异步请求这个js文件

webpack ensure的原理
它就是把一些js模块独立出一个js文件,需要用到的时候,再创建一个script对象,加入到document.head对象中即可。浏览器自动帮我们发起请求,去请求这个js文件,再写个回调,去定义得到这个js文件后,需要做什么业务逻辑操作

main.js依赖3个js
·A.js是封装aBtn按钮点击后才执行的逻辑
·B.js是封装bBtn按钮点击后才执行的逻辑
·vue.js是封装了main.js要利用的包

针对上面的需求,优化方案
假设A.js B.js vue.js都是非常大的文件,且都不是main.js必须有的,即未来可能发生的操作,那么我们把它们利用异步加载,当发生的时候再去加载就行了。
vue.js是main.js立即马上依赖的工具箱,但是它又非常的大,所以将其配置打包成一个公共模块,利用浏览器的并发加载,加快下载速度。构思完成,开始实现。
index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div id="app"></div>
    <button id="aBtn">Abtn</button>

    <button id="bBtn">Bbtn</button>
</body>
</html>

main.js

import Vue from 'vue'
console.log(Vue)

document.getElementById('aBtn').onclick=function () {
    //异步加载A.js
    require.ensure([],function () {
        var A=require("./A.js");
        alert(A.data);
    })
}
document.getElementById('bBtn').onclick=function () {
    //异步加载B.js
    require.ensure([],function () {
        var B=require("./B.js");
        alert(B.data);
    })
}

A.js(B.js同理)

var A={
    "data":"Hello A"
}
module.exports =A;

webpack.config.js配置

var path = require('path');
const HtmlWebpackPlugin=require('html-webpack-plugin');//引入插件

const webpack=require('webpack');
const packagejson=require('./package.json');
module.exports={
    //入口
    entry:{
        //可以有多个入口,也可以有一个,如果是一个就默认从这一个入口开始解析
        "main":"./src/main.js",
        "util":Object.keys(packagejson.dependencies)//获取生产环境依赖
    },
    output:{
        path:path.resolve('./dist'),//相对转绝对
        filename:'[name].js'
    },
    watch:true,//文件监视改动 自动产出build.js
    plugins:[
        new webpack.optimize.CommonsChunkPlugin({
            name:'common',
            filename: '[name].js'
        }),
        new HtmlWebpackPlugin({
            //chunks主要用于多入口文件,当你有多个入口文件,它就会编译生成多个打包后的文件,chunks就能选择你要使用哪个文件
            chunks:['common','util','main'],
            template:"./src/index.html",//参照物
            inject: true,
            //inject:true|body|head
        }),

    ]
}

相关文章

网友评论

      本文标题:webpack ensure异步加载的原理

      本文链接:https://www.haomeiwen.com/subject/egvngqtx.html