2012-02-08 79 views
32

我有一個heckuva時間過渡到Dojo和新的AMD結構,我真的希望有人能夠闡明整個概念。過去幾周,我一直住在Google上,試圖找到關於使用情況的信息,但是結構和設計模式在使用這個方面的趨勢。Dojo require()和AMD(1.7)

我覺得奇怪的是一個相對複雜的JavaScript應用,如用於主頁面的dijits需要創建和樣式,DOM元素創建,等等,我需要需要,因此使用,一噸AMD系統之前在dojo名稱空間中可用的不同模塊(或至少未分配到23個不同的變量)。

例子:

require(['dijit/form/ValidationTextBox', 'dijit/form/SimpleTextarea', 'dijit/form/CheckBox', 'dijit/Dialog', 'dijit/form/Form']) 
require(['dojo/ready', 'dojo/parser', 'dojo/dom-style', 'dijit/registry', 'dojo/dom', 'dojo/_base/connect', 'dojo/dom-construct'], 
function(ready, parser, style, registry, dom, event, construct){ 
    //...etc 
} 

這只是少數爲我工作在頁面上的一個模塊。當然,有一種更好的,非破壞性的未來發布方式來訪問這些方法等等。我的意思是,我真的必須導入一個全新的模塊才能使用byId()嗎?還有另一個連接事件?最重要的是,通過在函數參數列表中分配一個變量名稱來創建所有的混亂,似乎就像這樣的後退步驟。

我想,也許在需要的時候,比如query模塊你只會require()模塊,但如果我需要一次以上,那麼很有可能會被分配給超出範圍的變量,我需要把它放在domReady!ready呼叫。 重新.... ....!

這就是爲什麼我只能認爲這是我對道場的理解不夠。

我確實已經看過並搜索過併購買過書籍(雖然是AMD之前的版本),但是這個庫確實讓我有錢跑了。我欣賞任何人都可以擺脫這一點。例

require(['dijit/form/ValidationTextBox']) 
require(['dojo/ready', 'dojo/parser', 'dojo/dom-style', 'dijit/registry', 'dojo/dom', 'dojo/_base/connect', 'dojo/dom-construct'], function(ready, parser, style, registry, dom, event, construct){ 
    /* perform some tasks */ 
    var _name = new dijit.form.ValidationTextBox({ 
     propercase : true, 
     tooltipPosition : ['above', 'after'] 
    }, 'name') 

    /* 
    Let's say I want to use the query module in some places, i.e. here. 
    */ 
    require(['dojo/query', 'dojo/dom-attr'], function(query, attr){ 
     query('#list li').forEach(function(li){ 
      // do something with these 
     }) 
    }) 
} 

編輯基於關閉此格式,用於與許多例子都來自Dojo工具包鄉親以及第三方網站,這將是,恕我直言,絕對荒謬的加載所有需要的模塊作爲第一function(ready, parser, style, registy...將越來越長,並與命名衝突產生問題等

燒起來require()荷蘭國際集團腳本的生活中,我需要的所有模塊似乎只是傻傻的我。話雖如此,我不得不看看一些「包管理器」腳本。但是對於這個例子,如果我想在選擇的地方使用查詢模塊,那麼我將不得不將其加載到主要的require()語句中。我理解爲什麼在某種程度上,但通用的dot-syntax命名空間有什麼不好? dojo.whatever? dijit.findIt()?爲什麼加載模塊,引用一個獨特的名稱,通過關閉,等等等等?

我希望這是一個更容易問的問題,但我希望這是有道理的。

惱怒

叫我對於新手,但是這是真的..真的..快把我逼瘋了。談到Javascript(顯然不是),我不是noob,而是哇。我不知道這個了!

這裏是我收集。在adder.js:

define('adder', function(require, exports){ 
    exports.addTen = function(x){ 
     return x + 10 
    } 
}) 

在某些母版頁或什麼:

require(['./js/cg/adder.js']) 

...不遵循整齊require(['cg/adder'])格式,但不管。現在不重要。

然後,使用adder應該是:

console.log(adder.addTen(100)) // 110 

我得到的最接近是console.log(adder)返回3。是的。 3。否則,它是adder is not defined

爲什麼這必須是那麼難嗎?我使用這個我的小白卡,因爲我真的不知道這是爲什麼不走到一起。

謝謝你們。

+0

你應該問你後續的新問題。您沒有足夠的代碼來向我們展示問題(例如,您甚至沒有定義「加法器」)。 – Domenic 2012-02-08 13:06:57

+0

根據您的樣品上,你只需要兩個模塊的依賴關係,框dijit /表格/ ValidationTextBox和道場/查詢,在一個需要聲明。傳遞依賴關係爲您照顧。就像@Domenic說的,也許這裏有更多,我們應該重新開始。 – peller 2012-02-08 16:27:13

+0

我不是?嗯,我會重新開始。多謝你們。歡呼 – Phix 2012-02-08 18:41:20

回答

20

依賴性陣列形式:

define(["a", "b", "c"], function (a, b, c) { 
}); 

確實可以是惱人的和容易出錯的。將數組條目匹配到函數參數是一個真正的痛苦。

我更喜歡require格式("Simplified CommonJS Wrapper"):

define(function (require) { 
    var a = require("a"); 
    var b = require("b"); 
    var c = require("c"); 
}); 

這樣可以使你的線短,讓你重新排列/刪除/添加行,而不必記住改變兩個地方的東西。

後者格式不適用於PS3和較舊的Opera移動瀏覽器,但希望您不在乎。


至於爲什麼這樣做,而不是手動命名空間的對象,@皮勒的回答給出了爲什麼模塊化是一件好事,一個很好的概述,以及爲什麼AMD和模塊系統,實現模塊化的方式是my answer to a similar question會談好東西。

我會添加到@ peller的答案的唯一事情是擴大「關注依賴關係實際上使更好的代碼。」如果你的模塊需要太多的其他模塊,這是一個不好的跡象!在我們的72K LOC JavaScript代碼庫中,我們有一個鬆散的規則,一個模塊應該大約100行,並且需要零到四個依賴關係。這對我們很好。

+0

另一個有趣的事實 - 與AMD,你依賴的代碼實際上可以得到垃圾收集時,你的模塊不再被引用。這並不是在所有東西都加入到全球範圍內時纔會發生。 – peller 2012-02-08 16:23:00

+1

另外請注意,Dojo的加載器是異步的(使用非同步I/O),因此,儘管它支持「立即」 CJS要求籤名@Dominic所示的是,如果一些其他的代碼尚未加載的模塊這個變種會*失敗* 。這就是爲什麼需要簽名需要一個數組和一個回調。像AMD依賴數組格式那樣尷尬,它旨在簡化異步加載模塊的任務。 CJS主要設計用於服務器端系統,它與網頁瀏覽器沒有相同的限制。 – peller 2012-04-23 17:23:08

+0

@peller FALSE。 Dojo和其他AMD兼容的加載器將使用'Function.prototype.toString'解析出工廠函數的主體,然後組裝一個依賴數組。 – Domenic 2012-04-23 20:12:12

12

requirejs.org給出了AMD就是一個很好的概述,爲什麼你要使用它。是的,Dojo正在朝着更小的模塊發展,您將單獨參考。結果是你加載的代碼少,並且你的引用是明確的。我認爲,關注依賴關係實際上會產生更好的代碼。 AMD能夠優化,並且一旦遷移完成後,就不必再加載一切都變成全局。沒有更多的碰撞! require()模塊包裝使用各種模塊的代碼。 domready中!涉及DOM的加載,並且與範圍內的變量無關。

無論如何,這是從Q &的SO甲格式偏離。你可能想問一些具體的問題。

+0

感謝您的信息。我會更多地瞭解一下requirejs,並通過它來保持黑客行爲。 *編輯原始* – Phix 2012-02-08 03:43:03