javascript中的define用法

文章目錄

  • 1. AMD的由來
  • 2. AMD是什么
  • 3. AMD實例:如何定義一個模塊
  • 4. 匿名模塊
  • 5. 僅有一個參數的define
  • 6. Dojo中的AMD
  • 7. 結論

最近由于工作需求只能快速學習JS,但在看代碼的時候發現許多東西都有疑問比如說代碼剛開始的define關鍵字的用法,剛好最近看了一篇好文章,分享一下。

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://www.pswp.cn/news/456829.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456829.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456829.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決:pip警告!DEPRECATION: The default format will switch to columns in the future.

pip警告! DEPRECATION: The default format will switch to columns in the future. You can use --format(legacy|columns) (or define a format(legacy|columns) in your pip.conf under the [list] section) to disable this warning. pip升級到9.0.1后 查看pi…

PLSQL安裝配置

(1)解壓:plsql developer Oracle數據庫開發工具首先確保有oracle數據庫或者有oracle服務器,然后才能使用PLSQL Developer連接數據庫。(2)工具---首選項---連接----輸入OCI庫(設置之后不用再裝or…

Mysql 學習筆記2

(1)MySQL查看表占用空間大小 //先進去MySQL自帶管理庫:information_schema //自己的數據庫:dbwww58com_kuchecarlib //自己的表:t_carmodelparamvalue mysql> use information_schema; Database changed mysql&g…

python程序打包為exe可執行文件

大家都知道,Python是一種腳本語言,也就是解釋型的語言,需要解釋器來進行解釋以后才可以執行,而Python源代碼需要在Python虛擬機上面運行,但是我們做好的程序,不可能給用戶使用的時候還讓他安裝一個Python環…

Backbone簡介

1. 前言 本文的目的,是幫助大家快速理解掌握Backbone的使用,但它并不是API,因此我不會將每一個方法都詳細地描述,但是我會告訴你如何學習它們。 這是一篇稍稍較長的技術文章,因為我想將我所了解的東西盡可能詳細地分享…

使用Android Studio搭建Android集成開發環境

一、Android Studio簡單介紹 2013年GoogleI/O大會首次發布了Android Studio IDE(Android平臺集成開發環境)。它基于Intellij IDEA開發環境,旨在取代Eclipse和ADT(Android開發者工具)為開發者提供更好的開發工具。既然G…

[Oracle]UNIX與Windows 2000上Oracle的差異(I)

作者:Ian Adam & David Stien, SAIC Ltd 日期:19-Dec-2003 出處:http://www.dbanotes.net翻譯:Fenng -----------------------------------------------------------------------------------------------------------------…

django2.x報錯No module named 'django.core.urlresolvers'

解決方法就是: from django.urls import reverse 最近從django1.9遷移到django2.0中出現一個意外的報錯: 這個報錯的原因在stack overflow上有很直接的解釋,但是百度上并沒有直接的答案。 簡單來說,原因就是:django2.0 把原來…

Underscore簡介

5. Underscore.js Underscore封裝了常用的JavaScript對象操作方法,用于提高開發效率。它本身與我們介紹的主題“Backbone”沒有半毛錢的關系,因此你可以完全不理會“Backbone”的概念來學習它,或將它單獨運用到任何一個頁面。(另外…

POJ2190 HDU2714 ISBN

USACO 2003 Fall Orange 問題鏈接:POJ2190 HDU2714 ISBN。 問題簡述:參見上述鏈接。 問題分析: 單純的計算問題。需要注意以下幾點: 1.如果是末尾數,則輸出為‘X’; 2.如果能找到對應的值則輸出&#xff1b…

Django-安裝xadmin的方法及主要配置方法

歷經千辛萬苦,終于實現了django2.1中xadmin的使用 被論壇里各路神仙帶跑N次 準確說是幾個小時 直接colne https://github.com/Liu0330/xadmin 工作系統環境:win10Python3.6.xDjango2.1.xXadmin2.0(注意2.2版本就不行!&#xff…

大數據集群搭建之Linux的安裝(一)

1、準備工具 VMWare、centos mimal版本系統文件。 2、工具安裝 1、安裝vmware軟件 安裝軟件地址: VMWare:http://pan.baidu.com/s/1qYnySrE 密碼:3t3r centos mimal版本:http://pan.baidu.com/s/1dE5LY6H 密碼&#xff1a…

阻止事件冒泡兩種方式:event.stopPropagation();和return false;

jQuery提供了兩種方式來阻止事件冒泡。 方式一:event.stopPropagation(); $("#div1").mousedown(function (event) {event.stopPropagation(); }); 方式一:return false; $("#div1").mousedown(function (event) {return false; });…

關于電腦的基礎單詞筆記

chapter01 mouse 鼠標. keyboard 鍵盤. notepad 記事本 . sava 保存. chapter02 word 文本文檔. office 辦公軟件. copy 復制. past 粘貼. find 復制. table 表格. page 頁. picture 圖片. chapter03 sheet 工作薄. cell 單元格. number 數字. true 真. …

Python3.6+Django2.0+Xadmin2.0學生信息管理系統

一、創建模型 模型是表示我們的數據庫表或集合類,并且其中所述類的每個屬性是表或集合的字段,在 app/models.py 中定義。 1、首先,導入models模塊 from django.db import models 接下來創建個學生信息類,其中包含學生姓名、性別…

升級 pip版本

安裝第三方庫:pip install Pillow 出現 You are using pip version 7.1.2, however version 9.0.1 is available. You should consider upgrading via the python -m pip install --upgrade pip comm and. 解決方法1: 輸入“python -m pip install -U pi…

大數據集群搭建之節點的網絡配置過程(二)

緊接著上一章來設置windows的vmnet8的ip地址和虛擬機中centos的ip地址。 NAT虛擬網絡的配置圖如下圖所示: 1、這里根據VMware中得到的網關地址去設置vmnet8的ip地址。 網關地址查看: 2、得到的網關地址后去設置vmnet8,將網關地址設置為v…

Python3.6+Django2.0+Xadmin2.0學生信息管理系統-2

1、上傳圖片/文件等資源 有時候需要添加一些附件,例如,新生剛入學,大家相互之間還不熟悉,希望能通過照片來加深印象,并且方便教學管理。 首先,對demo/urls.py文件進行改造,給urlpatterns添加s…

vim自帶的練習教程(vimtutor)

聲明:本文源于Centos 7.2系統vim自帶的練習教程--vimtutor歡迎閱 讀《 V I M 教 程 》 - 版本 1.7 Vim 是一個具有很多命令的功能非常強大的編輯器。限于篇幅,在本教程當中就不詳細介紹了。本教程的設計目標是講述一些必要的基本命令,而掌握…

pycharm之no python interpreter configured for project的解決辦法

今天由于重裝了系統,所以必須得重新配置一些軟件,在打開pycharm運行程序時顯示“no python interpreter configured for project”提示。根據字面意思是“python沒有解釋器”。 解決辦法: 找到你之前下載python環境支持庫如下圖所示&#x…