国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

AMD規范(轉)

harriszh / 1277人閱讀

摘要:可以看到,第三個參數是回調函數,可以直接使用依賴的模塊,他們按依賴聲明順序作為參數提供給回調函數。結論規范是開發的一次重要嘗試,它以簡單而優雅的方式統一了的模塊定義和加載機制,并迅速得到很多框架的認可和采納。

1. AMD的由來
  前端技術雖然在不斷發展之中,卻一直沒有質的飛躍。除了已有的各大著名框架,比如Dojo,jQuery,ExtJs等等,很多公司也都有著自己的前端開發框架。這些框架的使用效率以及開發質量在很大程度上都取決于開發者對其的熟悉程度,以及對JavaScript的熟悉程度,這也是為什么很多公司的技術帶頭人都喜歡開發一個自己的框架。開發一個自己會用的框架并不難,但開發一個大家都喜歡的框架卻很難。從一個框架遷移到一個新的框架,開發者很有可能還會按照原有框架的思維去思考和解決問題。這其中的一個重要原因就是JavaScript本身的靈活性:框架沒辦法絕對的約束你的行為,一件事情總可以用多種途徑去實現,所以我們只能在方法學上去引導正確的實施方法。慶幸的是,在這個層面上的軟件方法學研究,一直有人在去不斷的嘗試和改進,CommonJS就是其中的一個重要組織。他們提出了許多新的JavaScript架構方案和標準,希望能為前端開發提供銀彈,提供統一的指引。

  AMD規范就是其中比較著名一個,全稱是Asynchronous Module Definition,即異步模塊加載機制。從它的規范描述頁面看,AMD很短也很簡單,但它卻完整描述了模塊的定義,依賴關系,引用關系以及加載機制。從它被requireJS,NodeJs,Dojo,JQuery使用也可以看出它具有很大的價值,沒錯,JQuery近期也采用了AMD規范。在這篇文章中,我們就將介紹AMD的性質,用法,優勢以及應用場景。從AMD中我們也能學習到如何在更高層面去設計自己的前端應用。

2. AMD是什么
 >  作為一個規范,只需定義其語法API,而不關心其實現。AMD規范簡單到只有一個API,即

define函數:
define([module-name?], [array-of-dependencies?], [module-factory-or-object]);

其中:

  module-name: 模塊標識,可以省略。

  array-of-dependencies: 所依賴的模塊,可以省略。

  module-factory-or-object: 模塊的實現,或者一個JavaScript對象。

  從中可以看到,第一個參數和第二個參數都是可以省略的,第三個參數則是模塊的具體實現本身。后面將介紹在不同的應用場景下,他們會使用不同的參數組合。

  從這個define函數AMD中的A:Asynchronous,我們也不難想到define函數具有的另外一個性質,異步性。當define函數執行時,它首先會異步的去調用第二個參數中列出的依賴模塊,當所有的模塊被載入完成之后,如果第三個參數是一個回調函數則執行,然后告訴系統模塊可用,也就通知了依賴于自己的模塊自己已經可用。如果對應到dojo1.6之前的實現,那么在功能上可以有如下對應關系:

  

    module-name: dojo.provide

  dependencies: dojo.require

  module-factory: dojo.declare

  不同的是,在加載依賴項時,AMD用的是異步,而dojo.require是同步。異步和同步的區別顯而易見,前者不會阻塞瀏覽器,有更好的性能和靈活性。而對于NodeJs這樣的服務器端AMD,則模塊載入無需阻塞服務器進程,同樣提高了性能

3,AMD實例:如何定義一個模塊
  下面代碼定義了一個alpha模塊,并且依賴于內置的require,exports模塊,以及外部的beta模塊。可以看到,第三個參數是回調函數,可以直接使用依賴的模塊,他們按依賴聲明順序作為參數提供給回調函數。

  這里的require函數讓你能夠隨時去依賴一個模塊,即取得模塊的引用,從而即使模塊沒有作為參數定義,也能夠被使用;exports是定義的alpha 模塊的實體,在其上定義的任何屬性和方法也就是alpha模塊的屬性和方法。通過exports.verb = ...就是為alpha模塊定義了一個verb方法。例子中是簡單調用了模塊beta的verb方法。

  

define("alpha", ["require", "exports", "beta"], function (require, exports, beta) {

  exports.verb = function() {

  return beta.verb();

  //或者:

  return require("beta").verb();

  }

  });

4. 匿名模塊
  define 方法允許你省略第一個參數,這樣就定義了一個匿名模塊,這時候模塊文件的文件名就是模塊標識。如果這個模塊文件放在a.js中,那么a就是模塊名。可以在依賴項中用"a"來依賴于這個匿名模塊。這帶來一個好處,就是模塊是高度可重用的。你拿來一個匿名模塊,隨便放在一個位置就可以使用它,模塊名就是它的文件路徑。這也很好的符合了DRY(Don"t Repeat Yourself)原則。

  下面的代碼就定義了一個依賴于alpha模塊的匿名模塊:
  

define(["alpha"], function (alpha) {

  return {

  verb: function(){

  return alpha.verb() + 2;

  }

  }; 

  });

5. 僅有一個參數的define
  前面提到,define的前兩個參數都是可以省略的。第三個參數有兩種情況,一種是一個JavaScript對象,另一種是一個函數。

  如果是一個對象,那么它可能是一個包含方法具有功能的一個對象;也有可能是僅提供數據。后者和JSON-P非常類似,因此AMD也可以認為包含了一個完整的 JSON-P實現。模塊演變為一個簡單的數據對象,這樣的數據對象是高度可用的,而且因為是靜態對象,它也是CDN友好的,可以提高JSON-P的性能。考慮一個提供中國省市對應關系的JavaScript對象,如果以傳統JSON-P的形式提供給客戶端,它必須提供一個callback函數名,根據這個函數名動態生成返回數據,這使得標準JSON-P數據一定不是CDN友好的。但如果用AMD,這個數據文件就是如下的形式:

  

define({

  provinces: [

  {

  name: "上海",

  areas: ["浦東新區", "徐匯區"]},

  {

  name: "江蘇",

  cities: ["南京", "南通"]} 

  //.....

  ]

  });

  假設這個文件名為china.js,那么如果某個模塊需要這個數據,只需要:

  

define(["china", function(china){

  //在這里使用中國省市數據

  });

  通過這種方式,這個模塊是真正高度可復用的,無論是用遠程的,還是Copy到本地項目,都節約了開發時間和維護時間。

  如果參數是一個函數,其用途之一是快速開發實現。適用于較小型的應用,你無需提前關注自己需要什么模塊,自己給誰用。在函數中,可以隨時require自己需要的模塊。例如:

  

define(function(){

  var p = require("china");

  //使用china這個模塊

  });

  即你省略了模塊名,以及自己需要依賴的模塊。這不意味著你無需依賴于其他模塊,而是可以讓你在需要的時候去require這些模塊。define方法在執行的時候,會調用函數的toString方法,并掃描其中的require調用,提前幫助你載入這些模塊,載入完成之后再執行。這使得快速開發成為可能。需要注意的一點是,Opera不能很好的支持函數的toString方法,因此,在瀏覽器中它的適用性并不是很強。但如果你是通過build工具打包所有的 JavaScript文件,這將不是問題,構建工具會幫助你掃描require并強制載入依賴的模塊。

6. Dojo中的AMD
  Dojo 的1.6版本,其中一個重要的變化就是引入了AMD機制,取代了原來的dojo.provide和dojo.require方法。但是現在仍然保持了向后兼容性,你仍然可以用dojo.provide和dojo.require來定義和加載模塊。需要注意的是:在 Dojo 1.6 中, 針對 AMD 的重構仍然屬于一個過渡期的改動 , 用戶自己開發的 AMD 模塊還不能被 Dojo 的加載器和 Build 系統支持 . 1.6 中現有的編譯系統對AMD的支持還非常局限。 如果你自己開發了 AMD 格式的模塊,并且你仍然在使用默認的 Dojo 同步模塊加載器,那么你必須嚴格遵循 Dojo 模塊的格式 ( 包括換行的格式 ) 來保證你自己的模塊能夠成功編譯。總結起來有以下三點:

  用傳統的方法 (dojo.require()/dojo.provide()) – 這些模塊,只能被 Dojo 同步加載器 加載,但可以被 Dojo 編譯系統(Build System )正確的編譯

  用 Dojo 同步加載器來加載 AMD 格式 ( define ()) 模塊 – 這些模塊可以被正常的加載,并且可以被其他兼容 AMD 格式的加載器加載 . 現在雖然 Dojo1.6 還沒有正式支持這種用法, 但在目前的 Dojo1.6 編譯系統中,是可以正常工作的 . ( 前提是你必須嚴格遵循 Dojo 模塊定義的代碼規范 )

  使用第三方加載器來加載 AMD 格式( define ())模塊 – 模塊可以被正常加載,并且可以被其他加載器所使用 . 這些模塊可以使用 RequireJS 或 Backdraft 提供的編譯系統正常編譯,但是 Dojo 還沒有正式的測試過和其他加載器的兼容性 .

  以Calendar為例,用define方法來定義這個模塊:

  

define("dijit/Calendar",

  ["dojo", "dijit", "text!dijit/templates/Calendar.html",

  "dojo/cldr/supplemental", "dojo/date", "dojo/date/locale",

  "dijit/_Widget", "dijit/_Templated", "dijit/_CssStateMixin", "dijit/form/DropDownButton"],

  function(dojo, dijit) {

  dojo.declare(

  "dijit.Calendar",

  [dijit._Widget, dijit._Templated, dijit._CssStateMixin],

  {...}

  );

  return dijit.Calendar;

  }

  );

  可以看到,模塊標識就是模塊文件的路徑,模塊本身一般都是dojo.declare定義的類。Dojo1.6中的dojo和dijit命名空間下的模塊均已經用AMD的形式進行了重構,但dojox下仍然延用了傳統的dojo.provide和dojo.require形式。對AMD的引入是Dojo走向自動化包管理的重要一步,在后續文章中我們也將繼續關注Dojo在這方面的進展。

7. 結論
  AMD 規范是JavaScript開發的一次重要嘗試,它以簡單而優雅的方式統一了JavaScript的模塊定義和加載機制,并迅速得到很多框架的認可和采納。這對開發人員來說是一個好消息,通過AMD我們降低了學習和使用各種框架的門檻,能夠以一種統一的方式去定義和使用模塊,提高開發效率,降低了應用維護成本。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/81575.html

相關文章

  • JavaScript模塊規范

    摘要:阮一峰的規范阮一峰的規范中中文版主要講函數中中文版主要講中函數總結所有的詳解模塊化開發 阮一峰的CommonJS規范阮一峰的AMD規范GitHub中AMD (中文版)主要講define函數GitHub中require (中文版)主要講AMD中define函數總結所有的詳解JavaScript模塊化開發

    蘇丹 評論0 收藏0
  • 從 1 到完美,寫一個 js 庫、node 庫、前端組件庫

    摘要:從到完美,寫一個庫庫前端組件庫之前講了很多關于項目工程化前端架構前端構建等方面的技術,這次說說怎么寫一個完美的第三方庫。使用導出模塊,就可以在使用這個庫的項目中構建時使用功能。 從 1 到完美,寫一個 js 庫、node 庫、前端組件庫 之前講了很多關于項目工程化、前端架構、前端構建等方面的技術,這次說說怎么寫一個完美的第三方庫。 1. 選擇合適的規范來寫代碼 js 模塊化的發展大致有...

    rollback 評論0 收藏0
  • 從 1 到完美,寫一個 js 庫、node 庫、前端組件庫

    摘要:從到完美,寫一個庫庫前端組件庫之前講了很多關于項目工程化前端架構前端構建等方面的技術,這次說說怎么寫一個完美的第三方庫。使用導出模塊,就可以在使用這個庫的項目中構建時使用功能。 從 1 到完美,寫一個 js 庫、node 庫、前端組件庫 之前講了很多關于項目工程化、前端架構、前端構建等方面的技術,這次說說怎么寫一個完美的第三方庫。 1. 選擇合適的規范來寫代碼 js 模塊化的發展大致有...

    xiaolinbang 評論0 收藏0
  • 【js基礎】前端模模塊化知識點整理

    摘要:其中命令用于輸入其他模塊提供的功能,命令用于規定模塊的對外接口。 簡單記錄下自己對前端模塊化的一些淺薄理解,不對之處歡迎指正 在介紹前端模打包工具之前,我們先簡單說一下瀏覽器、v8和nodejs,因為我們現在用到的大部分前端模打包工具,都是需要nodejs環境運行的,同時他們都能通過npm進行下載 1. 瀏覽器: 瀏覽器組成可分兩部分:Shell+內核。瀏覽器內核又可以分成兩部分:渲染...

    IamDLY 評論0 收藏0
  • 探索 JS 中的模塊化

    摘要:的主要思想是異步模塊,主邏輯在回調函數中執行,這和瀏覽器前端所習慣的開發方式不謀而合,應運而生。是目前開發中使用率最高的模塊化標準。 原文鏈接: http://yanjiie.me 偶然的一個周末復習了一下 JS 的模塊標準,刷新了一下對 JS 模塊化的理解。 從開始 Coding 以來,總會周期性地突發奇想進行 Code Review。既是對一段時期的代碼進行總結,也是對那一段時光的...

    SoapEye 評論0 收藏0

發表評論

0條評論

harriszh

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<