Dojo require () и AMD (1.7) - PullRequest
       38

Dojo require () и AMD (1.7)

32 голосов
/ 08 февраля 2012

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

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

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

Я действительно искал, искал и покупал книги(хотя и до 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().Я понимаю, почему в некоторой степени, но что такого плохого в общих пространствах имен с точечным синтаксисом?dojo.whatever?dijit.findIt ()?Зачем загружать модуль, ссылаться на уникальное имя, проходить через закрытие, бла-бла?

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

Раздражение

Назовите меня новичком, но это действительно ... действительно ... сводит меня с ума.Я не новичок, когда дело доходит до 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 для этого, потому что я действительно понятия не имею, почему это не собирается вместе.

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

Ответы [ 2 ]

20 голосов
/ 08 февраля 2012

Формат массива зависимостей:

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

действительно может быть раздражающим и подверженным ошибкам. Сопоставление записей массива с параметрами функции - настоящая боль.

Я предпочитаю формат require ( "Упрощенный CommonJS Wrapper" ):

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

Это делает ваши строки короткими и позволяет вам переставлять / удалять / добавлять строки без необходимости поменять вещи в двух местах.

Последний формат не будет работать в PS3 и более старых мобильных браузерах Opera, но, надеюсь, вам все равно.


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

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

12 голосов
/ 08 февраля 2012

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

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

...