1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          可能是最詳細的UMD模塊入門指南

          來源:互聯網轉載 時間:2024-01-29 08:07:13

          原創@前端司南

          學習UMD

          介紹

          這個倉庫[1]記錄了一些關于javascript UMD模塊規范的demo,對我學習UMD規范有了很大幫助,希望也能幫助到你。

          回顧

          之前也寫了幾篇關于javascript模塊的博客,鏈接如下:

          • 回頭再看JS模塊化編程[2]
          • 回頭再看JS模塊化編程之AMD[3]
          • sea.js的同步魔法[4]

          近幾天準備總結一下javascript模塊的知識點,所以建了這個Git倉庫[5],如果能幫助到您,麻煩點個star哦,非常感謝!

          這篇博客主要說下自己關于UMD的一點認知和思考,從實現一個簡單的UMD模塊,再到實現一個有依賴關系的UMD模塊,整個過程加深了我對UMD模塊的理解。

          什么是UMD

          所謂UMD (Universal Module Definition),就是一種javascript通用模塊定義規范,讓你的模塊能在javascript所有運行環境中發揮作用。

          簡單UMD模塊的實現

          實現一個UMD模塊,就要考慮現有的主流javascript模塊規范了,如CommonJS, AMD, CMD等。那么如何才能同時滿足這幾種規范呢?

          首先要想到,模塊最終是要導出一個對象,函數,或者變量。

          而不同的模塊規范,關于模塊導出這部分的定義是完全不一樣的。

          因此,我們需要一種過渡機制。

          首先,我們需要一個factory,也就是工廠函數,它只負責返回你需要導出的內容(對象,函數,變量等)。

          我們從導出一個簡單的對象開始。

          function factory() {    return {        name: '我是一個umd模塊'    }}

          全局對象掛載屬性

          假設不考慮CommonJS, AMD, CMD,僅僅將這個模塊作為全局對象的一個屬性應該怎么寫呢?

          (function(root, factory) {    console.log('沒有模塊環境,直接掛載在全局對象上')    root.umdModule = factory();}(this, function() {    return {        name: '我是一個umd模塊'    }}))

          我們把factory寫成一個匿名函數,利用IIFE(立即執行函數)去執行工廠函數,返回的對象賦值給root.umdModule,這里的root就是指向全局對象this,其值可能是window或者global,視運行環境而定。

          打開效果頁面鏈接[6](要看源碼的話,點開Git倉庫[7]),觀察Network的文件加載順序,可以看到,原則就是依賴先行。

          再進一步,兼容AMD規范

          要兼容AMD也簡單,判斷一下環境,是否滿足AMD規范。如果滿足,則使用require.js提供的define函數定義模塊。

          (function(root, factory) {    if (typeof define === 'function' && define.amd) {        // 如果環境中有define函數,并且define函數具備amd屬性,則可以判斷當前環境滿足AMD規范        console.log('是AMD模塊規范,如require.js')        define(factory)    } else {        console.log('沒有模塊環境,直接掛載在全局對象上')        root.umdModule = factory();    }}(this, function() {    return {        name: '我是一個umd模塊'    }}))

          打開效果頁面鏈接[8],可以看到,原則是調用者先加載,所依賴的模塊后加載。

          起飛,直接UMD

          同理,接著判斷當前環境是否滿足CommonJSCMD規范,分別使用相應的模塊定義方法進行模塊定義。

          (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模塊'    }}))

          最終,使用require.js, sea.js, nodejs或全局對象掛載屬性等方式都能完美地使用umd-module.js這個模塊,實現了大一統。

          給個sea.js調用UMD的效果頁面鏈接,sea.js調用UMD模塊[9]

          nodejs調用UMD模塊需要執行node命令,

          node umd-simple-used-by-nodejs

          效果如下:

          有依賴關系的UMD模塊

          當然,我們不能止步于此,模塊會被調用,當然也會調用其他模塊。因此我們還需要實現一個有依賴關系的UMD模塊,來驗證UMD規范的可行性。

          全局對象掛載屬性

          這個簡單,在html中你的模塊前引入所依賴的模塊即可。umd-module-dependedumd-module都是UMD模塊,后者依賴前者。

          <!DOCTYPE html><html>    <head>        <title>Test UMD</title>        <!-- 依賴放前面 -->        <script src="assets/js/umd-dep/umd-module-depended.js"></script>        <script src="assets/js/umd-dep/umd-module.js"></script>        <script src="assets/js/umd-dep/umd-global.js"></script>    </head>    <body>        <h1>測試UMD模塊</h1>        <h2></h2>        <p ></p>        <p ></p>    </body></html>

          點開效果頁面鏈接[10],看得更清楚明白!

          兼容AMD規范

          我們先在入口文件umd-main-requirejs.js中,定義好模塊路徑,方便調用。

          require.config({    baseUrl: "./assets/js/umd-dep/",    paths: {        umd: "umd-module",        depModule: "umd-module-depended"    }});

          被依賴的模塊umd-module-depended,只需要簡單實現UMD規范即可。

          而調用者umd-module,則需要做一些處理。按照require.js的規范來即可, define時,指定依賴的模塊depModule,而匿名工廠函數需要在參數上接收依賴的模塊depModule。

          (function(root, factory) {    if (typeof define === 'function' && define.amd) {        console.log('是AMD模塊規范,如require.js')        define(['depModule'], factory)    } else {        console.log('沒有模塊環境,直接掛載在全局對象上')        root.umdModule = factory(root.depModule);    }}(this, function(depModule) {    console.log('我調用了依賴模塊', depModule)    // ...省略了一些代碼,去代碼倉庫看吧    return {        name: '我自己是一個umd模塊'    }}))

          打開效果頁面鏈接[11],看得更清楚明白!

          UMD依賴寫法

          同理,各種規范要求你怎么寫模塊依賴,你就怎么寫就行。

          (function(root, factory) {    if (typeof module === 'object' && typeof module.exports === 'object') {        console.log('是commonjs模塊規范,nodejs環境')        var depModule = require('./umd-module-depended')        module.exports = factory(depModule);    } else if (typeof define === 'function' && define.amd) {        console.log('是AMD模塊規范,如require.js')        define(['depModule'], factory)    } else if (typeof define === 'function' && define.cmd) {        console.log('是CMD模塊規范,如sea.js')        define(function(require, exports, module) {            var depModule = require('depModule')            module.exports = factory(depModule)        })    } else {        console.log('沒有模塊環境,直接掛載在全局對象上')        root.umdModule = factory(root.depModule);    }}(this, function(depModule) {    console.log('我調用了依賴模塊', depModule) // ...省略了一些代碼,去代碼倉庫看吧    return {        name: '我自己是一個umd模塊'    }}))

          給個sea.js調用的示例鏈接[12]。

          nodejs調用也是通過命令行測試,

          node umd-dep-used-by-nodejs

          效果如下:

          總結

          以上實現了簡單的UMD模塊,也驗證了UMD模塊間存在依賴關系時的可行性。雖然本文是以簡單對象導出為例,但足以作為我們深入UMD規范的起點,加油!

          最后厚著臉皮求個star,點亮我吧[13]

          參考

          [1]

          倉庫: https://github.com/cumt-robin/umd-learning

          [2]

          回頭再看JS模塊化編程: http://hexo.wbjiang.cn/%E5%9B%9E%E5%A4%B4%E5%86%8D%E7%9C%8BJS%E6%A8%A1%E5%9D%97%E5%8C%96%E7%BC%96%E7%A8%8B.html

          [3]

          回頭再看JS模塊化編程之AMD: http://hexo.wbjiang.cn/%E5%9B%9E%E5%A4%B4%E5%86%8D%E7%9C%8BJS%E6%A8%A1%E5%9D%97%E5%8C%96%E7%BC%96%E7%A8%8B%E4%B9%8BAMD.html

          [4]

          sea.js的同步魔法: http://hexo.wbjiang.cn/sea.js%E7%9A%84%E5%90%8C%E6%AD%A5%E9%AD%94%E6%B3%95.html

          [5]

          Git倉庫: https://github.com/cumt-robin/umd-learning

          [6]

          效果頁面鏈接: https://cumt-robin.github.io/umd-learning/umd-simple-used-by-global.html

          [7]

          Git倉庫: https://github.com/cumt-robin/umd-learning

          [8]

          效果頁面鏈接: https://cumt-robin.github.io/umd-learning/umd-simple-used-by-requirejs.html

          [9]

          sea.js調用UMD模塊: https://cumt-robin.github.io/umd-learning/umd-simple-used-by-seajs.html

          [10]

          效果頁面鏈接: https://cumt-robin.github.io/umd-learning/umd-dep-used-by-global.html

          [11]

          效果頁面鏈接: https://cumt-robin.github.io/umd-learning/umd-dep-used-by-requirejs.html

          [12]

          示例鏈接: https://cumt-robin.github.io/umd-learning/umd-dep-used-by-seajs.html

          [13]

          點亮我吧: https://github.com/cumt-robin/umd-learning

          END

          標簽:umd-

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          庫庫馬力為什么停止營業?庫馬利變得無趣,玩家不玩了,游戲公司在無法盈利的情況下也停止了。4399庫庫馬力目前什么車最好?火赤練,攻擊,速度:220。王者,絕對的王者。蟒蛇的時代已經過去,削鐵已成歷史~ ~是誰,是速度賽還是比賽?當然,只是暫時的。HP:650,號稱血牛的彩虹只有663 ~ EP:340,好大的驚喜~ ~ EP,永遠都是滿滿的灰色。對于技能的使用,小庫們一直擔心EP的問題,火減少了很...

          11對戰平臺警告!檢測到不匹配是怎么回事?不運行某些程序的時候,經常會會直接出現出現了,接著該程序就關了。就像再次出現這個現象有方面的,一是硬件,即內存方面有問題,二是軟件,這就有多方面的問題了。故障分析硬件方面:一般來說,內存又出現問題的可能性并不大,比較多方面是:內存條主板壞、內存質量有問題,有應該是2個差別牌子不同容量的內存混插,也也很很容易再次出現不不兼容的情況,同樣的也要注意一點散熱問題...

          頭花怎么扎在包包頭中間視頻?步驟1:先扎個馬尾。馬尾越高越好。馬尾越高,花袋越高!步驟2:放入芽發套。步驟3:然后把剛剛扎好的馬尾分成上下兩部分。步驟4:把頭發塞進“發套”就行了。步驟5:用手把頭發塞進去就行,但是要記住,要用手把頭發塞進去,要有層次,這樣他才能顯得有點凌亂和。中發稍短如何扎包包頭?先扎個馬尾辮。如果你想變得可愛,那就盡量把它扎得高一點。也可以斜著綁。而且綁高了有助于包包定型,不容...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>