范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

一文带你了解,前端模块化那些事儿

  前端模块化省流:chatGPT总结该文章主要讲述了前端模块化的发展历史和各个阶段的技术方案,包括无模块化(IIFE)、CommonJS、AMD、CMD、ESModule、UMD。
  其中,无模块化时期的文件拆分是最基础的模块化,但也存在函数命名冲突的问题;
  IIFE 是现代模块化的基石,利用函数的块级作用域进行隔离,可以控制作用域;
  CommonJS 文件即模块,模块加载同步,适用于服务器端 node,浏览器端使用 webpack 或 browserfy。
  最后,各种模块化技术方案都是为了更好地满足前端代码管理、组织、通信的需求,模块已经成为了代码管理/编译、业务分离的基本单元。一、参考资料es-module-history 网页性能管理详解 defer和async的区别 可能是最详细的UMD模块入门指南 在浏览器中使用 ECMAScript Modules 二、发展历史js的设计之初就是为了满足简单的页面设计+表单提交,并无模块化 or 命名空间的概念 而是实实在在的需求推进了所有技术的演进,模块化也是。 站在前端发展的上帝视角来看,随着前端的能力在纵深都得到增强之后,迫切的需要更好的代码管理、组织、通信的模式,各种模块化的技术方案开始出现。 现如今模块已经成为了代码管理/编译,业务分离的基本单元。
  总的发展历史: 无模块化(IIFE) -> CommonJS -> AMD -> CMD -> ESModule、UMD 1.无模块化
  需求: 开始需要在页面中加载不同的js:动画、组件、格式化 多种js分布在不同的文件中 不同的文件又被同一个模块中引用
  文件拆分是最基础的模块化    // ...
  问题:这个时期函数命名可能会冲突,影响到其他人写的代码 引出的问题:script标签的参数 - async & defer 的区别?
  总结: 主要是对标签下载和执行时机的控制 普通标签 - 遇到标签就去下载,下载完毕之后立刻去解析代码并执行,这个时候会阻塞GUI线程渲染 defer - 遇到标签之后异步下载,下载完成之后等待其他标签解析完成之后开始执行( 在主线程解析完成之后才执行,降低脚本的优先级,保持用户体验 ,使用相对较多) async - 遇到标签之后异步下载,下载完成之后立即执行并阻塞渲染,执行完成之后继续渲染( 异步下载结束之后立即执行,不保证脚本执行顺序 ,一般用来给那些不需要任何依赖的脚本使用) 拓展 ESM   默认是通过 defer   的方式加载的,所以是不需要在 script   标签上加 defer   属性的横向拓展兼容性如何? > IE9 引导内容 浏览器渲染原理 同步异步的原理(Promise,任务队列) 模块化加载原理 产生的问题 污染全局作用域 => 不利于大型项目的开发以及多人团队的共建 2.IIFE
  IIFE主要是开始对作用域的把控 利用函数的块级作用域进行隔离 可以说IIFE是现代模块化的基石 (function($){     console.log($)     return {        data:[]     } })(jQuery) //注入对象 3.Commonjs(cjs)服务器端node,浏览器端webpack|browserfy 文件即模块 模块加载同步 服务器模块加载是运行时同步加载 浏览器模块加载是提前编译打包处理 exports = module.exports 注意:不能直接给exports赋值,会导致与module断开引用 使用require进行引入 缓存 cjs在引用文件的时候,会将文件执行一遍,然后将结果通过浅拷贝的方式写入全局缓存中 后续再次require同一个文件时,直接从缓存中读取,不会重新执行模块文件 // a.js var name = "morrain" var age = 18 exports.name = name exports.getAge = function(){     return age } // b.js var a = require("a.js") console.log(a.name) // "morrain" a.name = "rename" var b = require("a.js") console.log(b.name) // "rename" 模块输出的结果是 值的拷贝 ,一但输出,模块内部变化后,无法影响之前的引用,而 ESModule是引用拷贝 // a.js var name = "morrain" var age = 18 exports.name = name exports.age = age exports.setAge = function(a){     age = a } // b.js var a = require("a.js") console.log(a.age) // 18 a.setAge(19) console.log(a.age) // 18 cjs在 运行时 加载,ESM是 编译时 加载 缺点: 不支持异步 cjs更偏向于服务端,因为服务端I/O能力强,所以CMJ是同步的方法 ESM时机遇编译时的,所以支持 异步 能力 4.AMD
  AMD(Asynchronous module definition)异步的模块定义 解决了Commonjs不支持异步的缺点,可以在浏览器端运行
  经典代表:require.js
  使用方法: // define来定义模块 define(id, [depends], callback); // require进行加载 require([module], callback);
  示例: //提前加载执行顺序 // RequireJS define("a", function () {   console.log("a load")   return {     run: function () { console.log("a run") }   } })  define("b", function () {   console.log("b load")   return {     run: function () { console.log("b run") }   } })  require(["a", "b"], function (a, b) {   console.log("main run") //    a.run()   b.run() })  // a load // b load // main run // a run // b run
  缺点: 在代码运行时,会 先递归的找出所有的依赖 ,然后将依赖放到 前面 加载 如果依赖过多,项目可能会变慢,引入成本升高 引出的问题:如果现在AMD中兼容CJS的代码怎么办? define("amdModule", [], require => {     const dep1 = require("./dep1");     const dep2 = require("./dep2");     // 业务逻辑…… }) 5.CMD
  CMD(Common Module Definition-通用模块定义)推崇 依赖后置 ,也就是 按需执行  CMD解决了AMD 依赖前置 导致的引入成本过高的问题 整合了CJS和AMD的特点,浏览器端运行
  经典代表:Sea.js // 引入require var fs = require("fs"); //同步 require.async("./module3", function (m3) {}) //异步   // sea.js,按需引入 define("a", function (require, exports, module) {   console.log("a load")   exports.run = function () { console.log("a run") } })  define("b", function (require, exports, module) {   console.log("b load")   exports.run = function () { console.log("b run") } })  define("main", function (require, exports, module) {   console.log("main run")   var a = require("a")   a.run()   var b = require("b")   b.run() })  seajs.use("main")  // main run // a load // a run // b load // b run
  缺点: 依赖打包,加载逻辑存在于每个模块中 扩大了模块体积,同时功能上依赖编译 6.UMD
  UMD (Universal Module Definition)就是一种通用模块定义规范,让你的模块能在所有运行环境中使用,如 CommonJS  , AMD  , CMD  (function(root, factory) {     if (typeof module === "object" && typeof module.exports === "object") {         console.log("是commonjs模块规范,nodejs环境")         module.exports = factory();     } else if (typeof define === "function" && define.amd) {         console.log("是AMD模块规范,如require.js")         define(factory)     } else if (typeof define === "function" && define.cmd) {         console.log("是CMD模块规范,如sea.js")         define(function(require, exports, module) {             module.exports = factory()         })     } else {         console.log("没有模块环境,直接挂载在全局对象上")         root.umdModule = factory();     } }(this, function() {     return {         name: "我是一个umd模块"     } })) 7.ESM
  ESModule是伴随着ES6推出的原生模块化解决方案 import输入、export输出 支持异步加载 编译时加载,支持静态分析 更好的支持 chunk  和tree shaking  支持动态导入(按需加载) import().then()  支持 import.meta  获取模块元数据

房价复苏,二手房正在崛起!买房的时候到了吗?前两天统计局公布数据,春节以来部分重点城市销售出现回暖迹象,销售数据恢复超过此前市场预期。究其原因,主要在于年前因疫情积压的部分置业需求释放,开发商集体回收部分折扣助推购房情绪上涨硅谷银行在破产前提供给内部人员的贷款增加了两倍至2。19亿美元硅谷银行在破产前提供给内部人员的贷款增加了两倍至2。19亿美元财联社3月22日电,美国政府数据显示,硅谷银行在破产前,向该行高管董事和主要股东及其相关利益方提供的贷款在2022年最2月份湖南全社会用电量同比增长10。1来源中国经济网中国经济网2月份,湖南全社会用电量为178。79亿千瓦时,同比增长10。1。其中,工业用电量83。06亿千瓦时,增长62。3。数据显示,12月,湖南全社会用电量为36股价持续飙增,业绩却常年亏损,瑞尔集团后市怎么看?民间常说,金眼科银外科开着宝马口腔科在民营医疗几大热门赛道中,近几年口腔医疗领域展现了超高的吸金能力。据不完全统计,2022年中国口腔医疗市场投融资事件60余起,有金额披露部分总额CXO龙头业绩劲升,新技术新能力突破持续打开成长空间药明康德(603259。SH)3月21日披露了2022年年报,全年营收达393。55亿元,同比增长71。8,无论是营收规模还是增速均创下历史新高。同时,归母净利润增速亦首次超过收入祥生控股集团将延迟发布2022年全年业绩,股票自4月3日起停牌祥生IC资料图3月21日晚间,祥生控股集团(02599。HK)公告称,公司预计无法按照港交所的规定在2023年3月31日前刊登2022年全年业绩。根据公告内容,对于延迟发布2022实探全面通关以后,香港购物中心恢复人从众模式了吗?自2月3日,国务院港澳办宣布,取消所有香港和内地的通关限制,全面恢复通关以来,去香港游玩购物又成为热议的话题。苦等三年,小红书上的香港游玩攻略又支棱起来了,香港代表性交通工具双层有韩国2月外汇存款减少117。3亿美元,创11年多最大降幅韩国央行周三公布的数据显示,由于企业储蓄减少,2月份外汇存款出现了约11年来的最大降幅。截至2月底的居民外汇存款余额为975。2亿美元,比前一个月减少了117。3亿美元,是自201大量韩国游客涌向中国,不是为了来感受历史文化,而是来囤积白酒随着疫情的结束,很多旅游都开始提上日程了,特别是旅游,不仅可以给大家带来轻松愉悦,还能够使人增长知识。就像是我国的历史文化,本身就要比别的国家悠久许多,尤其是近两年,很多的外国人纷Filecoin虚拟机上线一周,数据表现如何?Filecoin的虚拟机上线一周了,大家肯定更关心它的数据表现,后山客带大家解读下FVM的运行数据情况,先做个说明,FVM刚上线一周,基于它构建的很多生态项目还未上线或者刚具备雏形马卡皇马方面尊重穆里尼奥,但未考虑过重邀其担任主帅直播吧3月22日讯马卡报的消息,皇马方面并没有考虑过重新请回穆里尼奥担任主帅一职。该媒体表示皇马方面对于穆里尼奥是欣赏且尊重的,但是没有考虑过重新邀请其回归担任主帅,皇马目前在联赛
把秀场搬进大自然,伊吾胡杨林里的唯美时装秀!时尚属于城市,但却来源于大自然。近些年,频频登上热搜的时尚品牌活动多数以户外形式出圈,大自然秀场成为众品牌追寻的与众不同,不走寻常路的秀场也成为设计师们展示灵感的地盘。城市年轻人渴和布克分手后,詹娜又找到新欢了布克最近明显不在比赛状态,近四场比赛分别只拿到14分17分11分20分,而且命中率极低,对于一个超级得分手来说这样的数据可谓是非常糟糕。球迷们都在探究为什么布克会如此低迷,媒体却爆江诗丹顿新款TraditionnelleDayDate腕表在香港WatchesWonders展会前不久,江诗丹顿(VacheronConstantin)为CollectionExcellencePlatine添加了一款精美的2475型机芯杭州女生真的太卷了,不管是长筒靴还是运动鞋,都穿得时髦有气质没想到在不知不觉中,内卷已经蔓延到了时尚界。但和普通人拼命追赶的潮流不同,杭州女生们更致力于将寻常单品赋予自己的个性,由自己来引领新潮流!这样的时尚态度比盲目追随潮流更自信勇敢,才新少年包拯定档,古装悬疑剧,有偶像剧气质,这些年包拯忒忙12月12日,电视剧新少年包拯官宣定档,12月14日起,优酷正式上线开播。这部电视剧由金世康何与等青年演员主演。值得注意的是,正在热播的综艺节目无限超越班当中,何与也是青年演员嘉宾央视主持李思思近况曝光!体态丰腴被疑怀三胎,面部圆润气质优雅12月13日,央视著名美女主持人李思思罕见地在社交平台上晒出一段视频,是她给广大宝妈们介绍孩子启蒙教育的书籍,当然也是曝光了自己的近况,一时间引来无数网友的热议。在视频中,李思思打刘涛罕见贵妇装扮太尴尬,穿黑裙戴礼帽气质大变,优雅大气又可爱爱美之心,人皆有之,更何况是娱乐圈里的女明星呢?女明星们每次出席活动都会盛装打扮,都想成为全场瞩目的焦点,但有时候装扮过头或穿搭风格不合适,就会有些尴尬。44岁刘涛在娱乐圈多年,已字母哥NBA无人能单防我,奥尼尔说出两个人的名字让他无话可说字母哥认为,现役联盟根本无人能单防他,奥尼尔给予了回击现在的年轻人,真是口无遮拦,这个我理解,越自信越好,但是不能没有说话无边无际,我说出两个人来,字母哥肯定会无话可说,一个是巅峰攀登者vivo突破高端的两个轮子2022年对于智能手机厂商们来说,是极具挑战的一年。中国信通院的数据显示,2022年19月,国内市场手机总体出货量累计1。96亿部,同比下降21。1。中国智能手机市场已经进入典型的隋朝与唐朝明明是两个朝代,为何史学家会将他们统称为隋唐时期?今天我们就来聊一聊隋唐时期,在公元前581年,当时的随国公杨坚取代了周静帝宇文阐,建立了隋朝,自称为隋文帝。结束了中国历史上自东汉末至南北朝时期,长达近四百年分裂的局面,那为什么史欧慕尼高速养发吹风机,引领护发新潮流欧慕尼致力成为精致个护小家电引领者宁波市新享科技有限公司,由公司创始人留学归国后于2015年成立,是一家专注于小家电研发和销售的技术科技企业。7年来公司快速发展,推出了一系列家电个