Как построить Dojo в один файл, учитывая список зависимостей?

У меня есть простое приложение Dojo, которое выполняет только один вызов require, загружая все зависимости. Проблема в том, что, хотя она чрезвычайно проста, она по-прежнему заканчивает загрузку ~ 100 файлов с сервера. Я попытался решить эту проблему, используя систему сборки Dojo, но, похоже, у меня недостаточно глубокое понимание.

Итак, мой вопрос: задайте список зависимостей, например:

["dojo/parser",
 "dijit/registry",
 "dojo/dom",
 "dojo/on",
 "dojo/query",
 "dojo/dom-class",
 "dojo/request",
 "dijit/form/ValidationTextBox", 
 "dijit/form/Select",
 "dijit/form/NumberSpinner",
 "dijit/form/CheckBox",
 "dijit/layout/ContentPane",
 "dijit/Dialog",
 "dojo/NodeList-traverse",
 "dojo/domReady"]

как мне настроить сборку для создания файла с одним файлом (или несколькими файлами, а не с 100 файлами) Dojo?

Ответ 1

Если вы используете загрузчик Dojo require(), есть инструменты сборки, которые вы можете использовать для объединения файлов и минимизации. Согласно сайту, инструменты сборки не включены в официальную версию, поэтому вам придется получить их из версии разработки (в частности, посмотрите в каталоге buildscripts).

Документация Dojo содержит некоторую информацию о ее сборке, которая также может оказаться полезной.

В качестве доказательства концепции выполните следующие шаги:

  • Перейдите на страницу download и загрузите Source Dojo Toolkit SDK (это единственный, который содержит скрипты util необходимые для сборки).

  • Извлечь в место (ради этого поста, скажем, /opt/dojo-toolkit).

  • В каталоге инструментов Dojo (т.е. /opt/dojo-toolkit) запустите утилиту build: ./util/buildscripts/build.sh action=release htmlFiles=/path/to/my/index.html (осторожно, это замедлило мой двухъядерный двухъядерный сканер для сканирования)

Пример index.html (этот находится точно в каталоге dojo-toolkit):

...
<head>
    <script src="dojo/dojo.js"></script>
    <script>
    dojo.require("my.test");
    </script>
</head>
...

Вызов require() ищет вложенные модули (я не мог заставить его работать с модулем верхнего уровня), поэтому в этом случае у меня есть каталог my внутри dojo-toolkit, который содержит a test.js. Этот файл является основным "загрузочным" файлом, который загружается во всех зависимостях. Я просто помещал случайные вызовы require() в мой:

dojo.require('dijit.ProgressBar');
dojo.require('dijit.Tree');

И это должно сделать это. В основном, при запуске утилиты сборки против вашего HTML файла (тот, который содержит ссылку на dojo.js), убедитесь, что все зависимости найдены, начиная с вершины.

Примечание: система сборки создает каталог release со встроенным выходом, но сначала он немного вводит в заблуждение - он, кажется, уменьшил каждый отдельный файл, но если вы посмотрите на свой фактический файл начальной загрузки (my/test.js, в этом случае), это будет объединенный, миниатюрный файл с (я полагаю) все, что вам нужно для запуска вашего приложения.


В противном случае, если вы используете стиль AMD require() (как в require.js), вы можете использовать его инструмент оптимизации. Согласно сайту, он будет:

  • Объедините все зависимые файлы (включая сам require.js) в один файл. Он анализирует вызов require(), чтобы выяснить, какие файлы ему нужно объединить.

  • Измените свой JavaScript, используя либо UglifyJS (по умолчанию), либо Closure Compiler.

Ответ 2

Мне нужно было сделать то же самое, и именно так я решил это.

Если вы прочитали документацию о том, как создавать пользовательские сборки (http://dojotoolkit.org/documentation/tutorials/1.8/build/), в разделе "Слои" они говорят о создании пользовательских слоев. Вы можете добавить все необходимые вам модули. Вот пример моего пользовательского файла слоя:

layers : {
"dojo/dojo" : {
    include : [
            "dojo/dojo",
            "dojo/_base/window",//
            "dojo/dom",//
            "dojo/dom-class",//
            "dojo/ready",//
            "dojo/store/Memory"
    ],
    customBase : true,
    boot : true
}
}

Что это будет делать, так это создание только этих модулей в dojo.js вместе с загрузчиком загрузки, чтобы вы могли загружать другие модули "на лету".