2012-02-08 4 views
32

У меня есть время heckuva, переход на Dojo и новую структуру AMD, и я действительно надеюсь, что кто-то может пролить свет на всю концепцию. В течение последних нескольких недель я живу в Google, пытаясь найти информацию об использовании, но тенденции структуры и дизайна в использовании этого.Dojo require() и AMD (1.7)

Мне кажется странным, что для относительно сложного приложения javascript, например, для главной страницы, где необходимо создать и стилизовать Dijits, создать элементы DOM и т. Д., Которые мне потребуются, и, следовательно, использовать TON различные модули, которые в противном случае были доступны в пространстве имен додзё до системы AMD (или, по крайней мере, не были назначены 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()? И еще один для подключения событий? Кроме того, весь беспорядок, создаваемый тем, что нужно назначить имя переменной в списке аргументов функций для цепляния, просто кажется таким обратным.

Я подумал, что возможно, вы будете require() модуль только тогда, когда это необходимо, например, модуль query, но если мне это нужно более одного раза, то вероятность того, что переменная, назначенная ей, выходит за пределы области видимости, и мне нужно будет поместите его в звонок domReady! или ready. reaalllly .... ??!

Вот почему я могу только предположить, что это мое отсутствие понимания для додзё.

Я действительно просмотрел и обыскал и купил книги (хотя и до 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 
     }) 
    }) 
} 

Основа этого формата, который используется со многими примерами как из додзё инструментария людей, а также сайтов третьих сторон, это было бы, ИМХО, абсолютно нелепо загрузите все необходимые модули, так как первые function(ready, parser, style, registy... получат больше и больше времени и создадут проблемы с коллизиями именования и т. д.

Увольнение и require() Для всех модулей, которые мне понадобятся во время работы сценария, мне просто кажется глупым , При этом мне придется посмотреть на некоторые сценарии «диспетчера пакетов». Но для этого примера, если бы я хотел использовать модуль запроса в выбранных местах, мне пришлось бы либо загрузить его с остальным в основной оператор require(). Я понимаю, почему в какой-то степени, но что плохого в общих пространственных пространствах имен синтаксиса? dojo.whatever? dijit.findIt()? Зачем загружать модуль, ссылку в уникальное имя, проходить через закрытие, бла-бла?

Желаю, чтобы это был более простой вопрос, но я надеюсь, что это имеет смысл.

Раздражение

Позвоните мне NEWB, но это на самом деле .. действительно .. сводит меня с ума. Я не noob, когда дело доходит до Javascript (видимо, нет), но ничего себе. Я не могу понять это !

Вот что я собираю. В 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.

Почему это должно быть так сложно? Я использую свою карту noob, потому что я действительно не понимаю, почему это не происходит вместе.

Спасибо, ребята.

+0

Вы должны задать новый вопрос для своего последующего наблюдения. У вас недостаточно кода, чтобы показать нам проблему (например, вы даже не определяете «сумматор»). – Domenic

+0

, основанный на вашем примере выше, вам понадобятся только две зависимости модуля: dijit/form/ValidationTextBox и dojo/query в одном требовании. Транзитные зависимости заботятся о вас. Как @Domenic говорит, может быть, здесь больше, и мы должны начать все сначала. – peller

+0

Я не? Хм, да, я только начну. Спасибо, парни. Cheers – Phix

ответ

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, но, надеюсь, вам все равно.


А почему делать это вместо того, чтобы вручную разделяют пространства имен объектов, ответ @ Пеллер дает хороший обзор, почему модульность является хорошей вещью, и my answer to a similar question переговоры о том, почему AMD и системе модуля как способ достижения модульности является хорошая вещь.

Единственное, что я хотел бы добавить к ответу @ peller, - это расширить «внимание к зависимостям, которое в действительности делает для гораздо лучшего кода». Если вашему модулю требуется слишком много других модулей, это плохой знак! У нас есть свободное правило в нашей кодовой базе кода LOC 72K, что модуль должен быть длиной ~ 100 строк и требует от нуля до четырех зависимостей. Это нам хорошо.

+0

еще один забавный факт - с AMD, код, на который вы зависите, может фактически получить мусор, собранный, когда ваш модуль больше не ссылается. Этого не происходит, когда все привязано к глобальному. – peller

+1

Также обратите внимание, что загрузчик Dojo является асинхронным (использует asynch I/O), поэтому, когда он поддерживает «непосредственную» CJS, требуется подпись @Dominic, здесь этот вариант будет * fail *, если какой-либо другой код еще не загрузил модуль , Вот почему требуется подпись с массивом и обратный вызов. Как неудобно, как формат массива зависимостей AMD, он предназначен для упрощения задачи загрузки модулей асинхронно. CJS был разработан в первую очередь для серверных систем, которые не имели таких же ограничений, как веб-браузеры. – peller

+0

@peller FALSE. Dojo и другие совместимые с AMD загрузчики будут использовать 'Function.prototype.toString', чтобы разобрать тело фабричной функции, а затем собрать массив зависимостей. – Domenic

12

requirejs.org дает довольно хороший обзор того, что такое AMD и почему вы хотите его использовать. Да, Dojo движется к более мелким модулям, которые вы бы указали отдельно. В результате вы загружаете меньше кода, и ваши ссылки на него явны. Думаю, что обращать внимание на зависимости действительно делает намного лучший код. AMD обеспечивает оптимизацию, и как только миграция завершена, вам больше не нужно загружать все в глобальные. Больше никаких столкновений! Блок require() обертывает код, который использует различные модули. domReady! относится к загрузке DOM и не имеет ничего общего с переменными, находящимися в сфере охвата.

В любом случае, это отклоняется от Q & Формат SO. Вы можете задать конкретные вопросы.

+0

Спасибо за информацию. Я посмотрю больше на requirejs и продолжаю взламывать это. * Отредактированный оригинал * – Phix

Смежные вопросы