iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >webpack2中怎么实现异步加载
  • 936
分享到

webpack2中怎么实现异步加载

2024-04-02 19:04:59 936人浏览 薄情痞子
摘要

本篇文章为大家展示了webpack2中怎么实现异步加载,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。WEBpack提供的一个非常强大的功能就是code spliti

本篇文章为大家展示了webpack2中怎么实现异步加载,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

WEBpack提供的一个非常强大的功能就是code spliting(代码切割)。

在webpack 1.x中提供了

  require.ensure([], () => {
    let module = require('./page1/module');
    // do something
  }, 'module1')

利用require.ensure这个api使得webpack单独将这个文件打包成一个可以异步加载的chunk.

具体的套路见我写的另一篇blog: webpack分包及异步加载套路

一句话总结就是:

在输出的runtime代码中,包含了异步chunk的id及chunk name的映射关系。需要异步加载相应的chunk时,通过生成script标签,然后插入到DOM中完成chunk的加载。通过JSONP,runtime中定义好函数,chunk加载完成后即会立即执行这个函数。

从编译生成后的代码来看,webpack 1.x从chunk的加载到执行的过程处理的比较粗糙,仅仅是通过添加script标签,异步加载chunk后,完成函数的执行。

这个过程当中,如果出现了chunk加载不成功时,这种情况下应该如何去容错呢?

在webpack2中相比于webpack1.x在这个点的处理上是将chunk的加载包裹在了promise当中,那么这个过程变的可控起来。具体的webpack2实现套路也是本文想要去说明的地方。

webpack提供的异步加载函数是

     // This file contains only the entry chunk.
   // The chunk loading function for additional chunks
      // runtime代码里面只包含了入口的chunk
      // 这个函数的主要作用:
      // 1. 异步加载chunk
      // 2. 提供对于chunk加载失败或者处于加载中的处理
      // 其中chunk加载状态的判断是根据installedChunks对象chunkId是数字0还是数组来进行判断的
   __webpack_require__.e = function requireEnsure(chunkId) {
        // 数字0代表chunk加载成功
     if(installedChunks[chunkId] === 0) 
       return Promise.resolve();

     // an Promise means "currently loading".
        // 如果installedChunks[chunkId]为一个数组
     if(installedChunks[chunkId]) {
          // 返回一个promise对象
       return installedChunks[chunkId][2];
     }
     // start chunk loading
        // 通过生成script标签来异步加载chunk.文件名是根据接受的chunkId来确认的
     var head = document.getElementsByTagName('head')[0];
     var script = document.createElement('script');
     script.type = 'text/javascript';
     script.charset = 'utf-8';
     script.async = true;
        // 超时时间为120s
     script.timeout = 120000;

     if (__webpack_require__.nc) {
       script.setAttribute("nonce", __webpack_require__.nc);
     }
        // 需要加载的文件名
     script.src = __webpack_require__.p + "js/reGISter/" + ({"2":"index"}[chunkId]||chunkId) + ".js";
        // 120s的定时器,超时后触发onScriptComplete回调
     var timeout = setTimeout(onScriptComplete, 120000);
        // chunk加载完毕后的回调
     script.onerror = script.onload = onScriptComplete;
     function onScriptComplete() {
       // avoid mem leaks in IE.
       script.onerror = script.onload = null;
          // 清空定时器
       clearTimeout(timeout);
          // 获取这个chunk的加载状态
          // 若为数字0,表示加载成功
          // 若为一个数组, 调用数组的第2个元素(第二个元素为promise内传入的reject函数),使得promise捕获抛出的错误。reject(new Error('xxx'))
       var chunk = installedChunks[chunkId];
       if(chunk !== 0) {
         if(chunk) chunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));
         installedChunks[chunkId] = undefined;
       }
     };
        
        // 每次需要进行异步加载chunk时,会将这个chunk的加载状态进行初始化为一个数组,并以key/value的形式保存在installedChunks里
        // 这个数组为[resolve, reject, promise];
     var promise = new Promise(function(resolve, reject) {
       installedChunks[chunkId] = [resolve, reject];
     });
     installedChunks[chunkId][2] = promise;

     head.appendChild(script);
        //返回promise
     return promise;
   };

我们再来看看路由配置文件编译后生成的代码index.js, 特别注意下__webpack_require__.e这个异步加载函数:

Router
.home('path2')
.addRoute({
  path: 'path2',
  animate: 'zoomIn',
  viewBox: '.public-path2-container',
  template: __webpack_require__(5),
  // 挂载controller
  pageInit: function pageInit() {
    var _this = this;

    console.time('route async path2');
    // 异步加载0.js(这个文件是webpack通过code spliting自己生成的文件名)
    // 具体异步加载代码的封装见?分析
    // 其中0.js包含了包含了path2这个路由下的业务代码
    // __webpack_require__.e(0) 起的作用仅为加载chunk以及提供对于chunk加载失败错误的抛出
    // 具体的业务代码的触发是通过__webpack_require_e(0).then(__webpack_require__.bind(null, 8)).then(function(module) { ... })进行触发
    // __webpack_require__.bind(null, 8) 返回的是module[8]暴露出来的module
    // 这段代码执行时,首先初始化一个module对象
    // module = {
    //    i: moduleId, // 模块id
    //    l: false,   // 加载状态
    //    exports: {}  // 需要暴露的对象
    //  }
    // 通过异步加载的chunk最后暴露出来的对象是作为了module.exports.default属性
    // 因此在第二个方法中传入的对象的default属性才是你模块8真正所暴露的对象
    __webpack_require__.e(0).then(__webpack_require__.bind(null, 8)).then(function (module) {
      var controller = module.default;
      Router.registerCtrl('path2', new controller(_this.viewBox));
    // 添加错误处理函数,用以捕获前面可能抛出的错误
    }).catch(function (e) {
      return console.log('chunk loading failed');
    });
  },

  // 进入路由跳转之前
  beforeEnter: function beforeEnter() {},

  // 路由跳转前
  beforeLeave: function beforeLeave() {}
})
.addRoute({
  path: 'path3',
  viewBox: '.public-path3-container',
  animate: 'zoomIn',
  template: __webpack_require__(6),
  pageInit: function pageInit() {
    var _this2 = this;

    __webpack_require__.e(1).then(__webpack_require__.bind(null, 9)).then(function (module) {
      console.time('route async path3');
      var controller = module.default;
      Router.registerCtrl('path3', new controller(_this2.viewBox));
    }).catch(function (e) {
      return console.log('chunk loading failed');
    });
  },
  beforeEnter: function beforeEnter() {},
  beforeLeave: function beforeLeave() {}
});

Router.bootstrap();

上述内容就是webpack2中怎么实现异步加载,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网JavaScript频道。

--结束END--

本文标题: webpack2中怎么实现异步加载

本文链接: https://www.lsjlt.com/news/65449.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • webpack2中怎么实现异步加载
    本篇文章为大家展示了webpack2中怎么实现异步加载,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。webpack提供的一个非常强大的功能就是code spliti...
    99+
    2024-04-02
  • VueJs中怎么实现异步动态加载块
    本篇文章给大家分享的是有关VueJs中怎么实现异步动态加载块,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先定义组件为异步加载define(...
    99+
    2024-04-02
  • winform异步加载数据怎么实现
    在WinForm中实现异步加载数据可以使用BackgroundWorker组件或者使用Task类来实现。方法一:使用Backgrou...
    99+
    2023-10-10
    winform
  • Ajax如何实现异步加载
    小编给大家分享一下Ajax如何实现异步加载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!AJAX (Asynchronous J...
    99+
    2024-04-02
  • vue ElementUI实现异步加载树
    本文实例为大家分享了vue ElementUI实现异步加载树的具体代码,供大家参考,具体内容如下 路由文件修改 import List from '@/components/li...
    99+
    2024-04-02
  • Ajax实现异步加载数据
    本文实例为大家分享了Ajax实现异步加载数据的具体代码,供大家参考,具体内容如下 项目结构如下 (需要导入一个JQuery的包,配置文件web.xml和springmvc-servl...
    99+
    2024-04-02
  • Android实现异步加载图片
    麦洛开通博客以来,有一段时间没有更新博文了.主要是麦洛这段时间因项目开发实在太忙了.今天周六还在公司加班,苦逼程序猿都是这样生活的.今天在做项目的时候,有一个实现异步加载图片的功能,虽然比较简单但还是记录一下吧.因为麦洛之前实现异步加载图片...
    99+
    2023-05-31
    android 异步加载 roi
  • ajax中怎么通过异步加载实现局部刷新
    这篇文章给大家介绍ajax中怎么通过异步加载实现局部刷新,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。[html] view plain copy <sc...
    99+
    2024-04-02
  • Vue中怎么异步加载about组件
    Vue中怎么异步加载about组件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。异步加载about组件about.jsVue.compon...
    99+
    2024-04-02
  • winform怎么异步加载数据
    在WinForms中异步加载数据通常使用BackgroundWorker组件或Task类来实现。以下是使用BackgroundWor...
    99+
    2024-04-02
  • Vue如何实现异步动态加载块
    本篇内容介绍了“Vue如何实现异步动态加载块”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先定义组件为异步加载define(['j...
    99+
    2023-07-04
  • Vue如何实现异步加载about组件
    这篇文章主要介绍“Vue如何实现异步加载about组件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue如何实现异步加载about组件”文章能帮助大家解决问题。异步加载about组件about.j...
    99+
    2023-07-04
  • 如何实现JavaScript文件的同步和异步加载
    这篇文章主要介绍了如何实现JavaScript文件的同步和异步加载,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。同步加载可在html文件里以...
    99+
    2024-04-02
  • vue.js表格分页及ajax异步加载数据怎么实现
    这篇“vue.js表格分页及ajax异步加载数据怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue.js表格分页及...
    99+
    2023-07-04
  • vue3.0+vite2实现动态异步组件懒加载
    目录创建一个vite项目 创建组件 创建一个vite项目 性能决定成败;vite确实快; cmd 命令行(默认你已经安装了node & npm),执行npm init @v...
    99+
    2024-04-02
  • ajax中怎么实现同步异步
    ajax中怎么实现同步异步,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。$("#btn_saveFWSB"...
    99+
    2024-04-02
  • Python中怎么实现同步和异步
    Python中怎么实现同步和异步,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、同步与异步#同步编程(同一时间只能做一件事,做完了才能做下一件事情) ...
    99+
    2023-06-17
  • 如何在ASP中异步加载Git?
    Git是一种非常流行的分布式版本控制系统,它可以帮助我们更好地管理和维护代码。在ASP应用程序中,异步加载Git可以提高应用程序的性能和稳定性,因为它可以减少页面加载时间和响应时间。在本文中,我们将介绍如何在ASP中异步加载Git。 步骤...
    99+
    2023-08-11
    load git 异步编程
  • 如何使用DataTable插件实现异步加载数据
    这篇文章主要介绍如何使用DataTable插件实现异步加载数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!table部分代码<table class="t...
    99+
    2024-04-02
  • 怎么在JavaScript中实现同步和异步
    本篇文章为大家展示了怎么在JavaScript中实现同步和异步,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点击,给用户提供更好的...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作