苍梧网站建设asp网站后台制作

pingmian/2025/10/7 23:24:29/文章来源:
苍梧网站建设,asp网站后台制作,百度知道怎么赚钱,网络规划设计师 第2版 ed2k前言 在平时的开发中#xff0c;我们经常使用 import()实现代码分割和懒加载。在低版本的浏览器中并不支持动态 import()#xff0c;那 webpack 是如何实现 import() polyfill 的#xff1f; 原理分析 我们先来看看下面的 demo function component() {const btn docume…前言 在平时的开发中我们经常使用 import()实现代码分割和懒加载。在低版本的浏览器中并不支持动态 import()那 webpack 是如何实现 import() polyfill 的 原理分析 我们先来看看下面的 demo function component() {const btn document.createElement(button);btn.onclick () {import(./a.js).then((res) {console.log(动态加载a.js.., res);});};btn.innerHTML Button;return btn; }document.body.appendChild(component()); 点击按钮动态加载 a.js脚本查看浏览器网络请求可以发现a.js请求返回的内容如下 简单看实际上返回的就是下面这个东西 (self[webpackChunkwebpack_demo] self[webpackChunkwebpack_demo] || []).push([[src_a_js],{./src/a.js: () {},}, ]); 从上面可以看出 3 点信息 1.webpackChunkwebpack_demo 是挂到全局 window 对象上的属性 2.webpackChunkwebpack_demo 是个数组 3.webpackChunkwebpack_demo 有个 push 方法用于添加动态的模块。当a.js脚本请求成功后这个方法会自动执行。 再来看看 main.js 返回的内容 仔细观察动态 import 经过 webpack 编译后变成了下面的一坨东西 __webpack_require__.e(src_a_js).then(__webpack_require__.bind(__webpack_require__, ./src/a.js)).then((res) {console.log(动态加载a.js.., res);}); 上面代码中__webpack_require__ 用于执行模块比如上面我们通过webpackChunkwebpack_demo.push添加的模块里面的./src/a.js函数就是在__webpack_require__里面执行的。 __webpack_require__.e函数就是用来动态加载远程脚本。因此从上面的代码中我们可以看出 首先 webpack 将动态 import 编译成 __webpack_require__.e 函数 __webpack_require__.e函数加载远程的脚本加载完成后调用 __webpack_require__ 函数 __webpack_require__函数负责调用远程脚本返回来的模块获取脚本里面导出的对象并返回 源码分析及实现 如何动态加载远程模块 在开始之前我们先来看下如何使用 script 标签加载远程模块 var inProgress {}; // url: http://localhost:8080/src_a_js.main.js // done: 加载完成的回调 const loadScript (url, done) {if (inProgress[url]) {inProgress[url].push(done);return;}const script document.createElement(script);script.charset utf-8;script.src url;inProgress[url] [done];var onScriptComplete (prev, event) {var doneFns inProgress[url];delete inProgress[url];script.parentNode script.parentNode.removeChild(script);doneFns doneFns.forEach((fn) fn(event));if (prev) return prev(event);};script.onload onScriptComplete.bind(null, script.onload);document.head.appendChild(script); }; loadScript(url, done) 函数比较简单就是通过创建 script 标签加载远程脚本加载完成后执行 done 回调。inProgress用于避免多次创建 script 标签。比如我们多次调用loadScript(http://localhost:8080/src_a_js.main.js, done)时应该只创建一次 script 标签不需要每次都创建。这也是为什么我们调用多次 import(a.js)浏览器 network 请求只看到家在一次脚本的原因 实际上这就是 webpack 用于加载远程模块的极简版本。 __webpack_require__.e 函数的实现 首先我们使用installedChunks对象保存动态加载的模块。key 是 chunkId // 存储已经加载和正在加载的chunks此对象存储的是动态import的chunk对象的key是chunkId值为 // 以下几种 // undefined: chunk not loaded // null: chunk preloaded/prefetched // [resolve, reject, Promise]: chunk loading // 0: chunk loaded var installedChunks {main: 0, }; 由于 import() 返回的是一个 promise然后import()经过 webpack 编译后就是一个__webpack_require__.e函数因此可以得出__webpack_require__.e返回的也是一个 promise如下所示 const scriptUrl document.currentScript.src.replace(/#.*$/, ).replace(/\?.*$/, ).replace(/\/[^\/]$/, /);__webpack_require__.e (chunkId) {return Promise.resolve(ensureChunk(chunkId, promises)); };const ensureChunk (chunkId) {var installedChunkData installedChunks[chunkId];if (installedChunkData 0) return;let promise;// 1.如果多次调用了__webpack_require__.e函数即多次调用import(a.js)加载相同的模块只要第一次的加载还没完成就直接使用第一次的Promiseif (installedChunkData) {promise installedChunkData[2];} else {promise new Promise((resolve, reject) {// 2.注意此时的resolvereject还没执行installedChunkData installedChunks[chunkId] [resolve, reject];});installedChunkData[2] promise; //3. 此时的installedChunkData 为[resolve, reject, promise]var url scriptUrl chunkId;var error new Error();// 4.在script标签加载完成或者加载失败后执行loadingEnded方法var loadingEnded (event) {if (Object.prototype.hasOwnProperty.call(installedChunks, chunkId)) {installedChunkData installedChunks[chunkId];if (installedChunkData ! 0) installedChunks[chunkId] undefined;if (installedChunkData) {console.log(加载失败.....);installedChunkData[1](error); // 5.执行上面的reject那resolve在哪里执行呢}}};loadScript(url, loadingEnded, chunk- chunkId, chunkId);}return promise; }; __webpack_require__.e的主要逻辑在ensureChunk方法中注意该方法里面的第 1 到第 5 个注释。这个方法创建一个 promise并调用loadScript方法加载动态模块。需要特别主要的是返回的 promise 的 resolve 方法并不是在 script 标签加载完成后改变。如果脚本加载错误或者超时会在 loadingEnded 方法里调用 promise 的 reject 方法。实际上promise 的 resolve 方法是在脚本请求完成后在 self[webpackChunkwebpack_demo].push()执行的时候调用的 如何执行远程模块 远程模块是通过self[webpackChunkwebpack_demo].push()函数执行的 前面我们提到a.js请求返回的内容是一个self[webpackChunkwebpack_demo].push()函数。当请求完成会自动执行这个函数。实际上这就是一个 jsonp 的回调方式。该方法的实现如下 var webpackJsonpCallback (data) {var [chunkIds, moreModules] data;var moduleId,chunkId,i 0;for (moduleId in moreModules) {// 1.__webpack_require__.m存储的是所有的模块包括静态模块和动态模块__webpack_require__.m[moduleId] moreModules[moduleId];}for (; i chunkIds.length; i) {chunkId chunkIds[i];if (installedChunks[chunkId]) {// 2.调用ensureChunk方法生成的promise的resolve回调installedChunks[chunkId][0]();}// 3.将该模块标记为0表示已经加载过installedChunks[chunkId] 0;} };self[webpackChunkwebpack_demo] []; self[webpackChunkwebpack_demo].push webpackJsonpCallback.bind(null); 所有通过import()加载的模块经过 webpack 编译后都会被 self[webpackChunkwebpack_demo].push()包裹。 总结 在 webpack 构建编译阶段import()会被编译成类似__webpack_require__.e(src_a_js).then(__webpack_require__.bind(__webpack_require__, ./src/a.js))的调用方式 __webpack_require__.e(src_a_js).then(__webpack_require__.bind(__webpack_require__, ./src/a.js)).then((res) {console.log(动态加载a.js.., res);}); __webpack_require__.e()方法会创建一个 script 标签用于请求脚本方法执行完返回一个 promise此时的 promise 状态还没改变。 script 标签被添加到 document.head 后触发浏览器网络请求。请求成功后动态的脚本会自动执行此时self[webpackChunkwebpack_demo].push()方法执行将动态的模块添加到__webpack_require__.m属性中。同时调用 promise 的 resolve 方法改变状态模块加载完成。 脚本执行完成后最后执行 script 标签的 onload 回调。onload 回调主要是用于处理脚本加载失败或者超时的场景并调用 promise 的 reject 回调表示脚本加载失败

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

流水线 东莞网站建设苏州哪里有做淘宝网站的

输入整数m,n(m<n),输出[m,n]之间所有能被3,不能被4整除的所有数并求和,输出时每行显示5个数。 题干输入整数m,n(m<n),输出[m,n]之间所有能被3,不…

家用电脑如何做网站惠州招聘网

了解题意 在一个8x8的棋盘上放置8个皇后,使得任何两个皇后都不能处于同一行、同一列或同一斜线上。问有多少种方法可以放置这8个皇后? 解决这个问题的目标是找到所有符合要求的皇后摆放方式,通常使用回溯算法来求解。回溯算法会尝试所有可能…

做川菜的网站隐私空间

浅谈新环境下计算机辅助审计的特点和应用_1 (7页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!24.90 积分从本学科出发,应着重选对国民经济具有一定实用价值和理论意义的课题。课题具有先…

福州网站建设新闻电力大学临港校区建设网站

文章目录 HomeBrew安装相关命令安装包卸载包查询可用的包更新所有包更新指定包查看已经安装的包查看包的信息清理包查看brew的版本更新brew获取brew的帮助信息 Brew安装DockerDocker常用命令镜像相关查看已经拉取的所有镜像删除镜像 容器相关停止运行容器启动容器重启容器删除容…

如何做电子书下载网站印象笔记同步wordpress

参考链接: 在Java中为静态最终static final变量分配值 转载来源:https://blog.csdn.net/peterwin1987/article/details/7571808 Java栈与堆 堆:顺序随意 栈:后进先出(Last-in/First-Out). Java的堆是一个运行时数据区,类的对象从中分配空间。这些…

vs做网站不用建项目wordpress 工具栏遮挡

目录 机器学习学习路线 学习编写抽象类 固定随机数种子 先加载少量数据

做芯片外贸生意上哪个网站企业公示信息查询系统贵州

IDE有很多种,常见的Eclipse、MyEclipse、Intellij IDEA、JBuilder、NetBeans等。但是这些IDE中目前比较火的是Intellij IDEA(以下简称IDEA),被众多Java程序员视为最好用的Java集成开发环境,今天的主题就是IDEA为开发工…

vs2008做网站教程东莞推广

在上一篇中,我们说过,在setData中如果有很多控件的话,我们还是要在该方法中写入很多代码,为了降低开发的方便性,本次就在此基础上再一次优化。实现原理是这样的,每次在setData中都要查找控件,然…

做外汇网站代理怎么制作一个网站首页

在 Windows 系统中添加一个右键菜单选项,以便可以使用管理员权限打开 PowerShell,可以通过编辑注册表来实现。 打开注册表编辑器: 按 Win R 打开运行对话框。输入 regedit 并按回车,这将打开注册表编辑器。 导航到文件夹背景键&…

php网站开发优点ui设计培训机构有用吗

网络安全态势严峻,常见的五大网络攻击风险类型 赵伟认为,企业线上服务所面临的安全风险,主要来自以下五个方面: DDoS攻击 DDoS攻击类型已有20多年历史,它攻击方式简单直接,通过伪造报文直接拥塞企业上联带…

免费网站怎么做啊潍坊网站

数字非压缩光端机主要应用于高速公路监控领域,可以保证实时性,指的是不经过压缩进行光传输的光端机,是在非压缩光端机基础上利用ADM电分插复用与TDM时分复用技术在一根光纤中实现多点多路(最大16个视频点)视频传播的光…

公司网站建设企划书盘锦网站变建设

今日概要 递归爬取解析多页页面数据scrapy核心组件工作流程scrapy的post请求发送今日详情 1.递归爬取解析多页页面数据 - 需求:将糗事百科所有页码的作者和段子内容数据进行爬取切持久化存储 - 需求分析:每一个页面对应一个url,则scrapy工程需…

安阳企业建网站个人如何做商城网站

正则表达式 1.元字符 . //匹配任意单个字符,可以是个汉字 [yang] //匹配范围内的任意单个字符 [^y] //匹配处理指定范围外的任意单个字符 [:alnum:] //字母和数字 [:alpha:] //代表…

衡水建设公司网站PHP网站开发简单实例

下面的代码,照着复制就能跑起来 今天看了下Spring的Configuration,即java类配置bean,(这个spring3的新功能,虽然现在已经spring5了,但是这种配置bean的方式也是比较火的) 做了如下测试,发现一个…

龙岗建设网站做网站运用的软件

原文:01. 把存储过程结果集SELECT INTO到临时表在开发过程中,很多时候要把结果集存放到临时表中,常用的方法有两种。 一. SELECT INTO 1. 使用select into会自动生成临时表,不需要事先创建 select * into #temp from sysobjects select * fro…

插画师个人网站是怎么做的wordpress博客备份

最近做了IAP U盘升级模块开发,总结下IAP基本开发流程,不深入讨论原理。 详细原理参考 首先需要知道我们需要把之前的APP区域拆一块出来做BOOT升级程序区域。 以STM32F103为例,0x08000000到0x0807FFFF为FLASH空间,即上图代码区域…

北京住房城乡建设网站南宁手机平台网站

web资源类型: 静态资源:原始形式与响应内容一致,在客户端浏览器执行 动态资源:原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端 LAMP架构组成: L:linux …

建设银行网站表单清理推荐郑州网站建设公司

93.复原IP地址 思路: 与分割回文串相似,复原ip地址是将给定字符串分割成点分十进制的四段,切割问题就可以使用回溯搜索法把所有可能性搜出来。回溯三部曲: 递归参数:除了传入的需要分割的字符串,仍然需要…

好用的h5网站在线网站地图生成器

HwBinder与普通Binder是一样的,区别是前者是专门给硬件使用,后者是给一般的应用程序使用,为了不影响现有的binder,单独增加硬件的HwBinder来实现硬件相关进程的通信。 HwBinder也是有四部分组成:hwservermanager、server、client…

seo网站推广专员招聘手机网站建设wap

对于有些服务端接口返回是固定值的json,可通过配置nginx直接返回json,减少程序的加载对资源的占用,减少接口响应时间 location ~* (request/update)$ { default_type application/json; return 200 {"update":"no&quo…