среда, 15 марта 2017 г.

RequireJS Plugin - Полное описание устройства

/*
 * RequireJS loader plugin
 */

require(['./path/to/plugin-name!path/to/file'], function (something) {
    // something это ссылка на файл ресурс 'path/to/file', который был загружен с помощью плагина './path/to/plugin-name.js'
});

;(function () {
    'use strict';
    define(['./path/to/babel-standalone/babel'], function (Babel) {
        return {
              // Загрузить и выполнить содержимое модуля
              load: function (name, req, onload, config) { // функция для загрузки содержимого файла 'path/to/file' через данный плагин (единственная обязательная функция)
                // name - строка с именем файла ресурса, которое располагается после знака ! в строке с путем до файла
                // Для пути './path/to/plugin-name!path/to/file': name = 'path/to/file'

                // req() - локальная ссылка на функцию "require", которую можно использовать здесь для загрузки любых других модулей.
                // Пути до этих модулей являются относительными путями от пути модуля, загружаемого через данный плагин.
                // Функция req содержит в себе ряд дополнительных утилит:

                // req.toUrl(modulePath) - функция, возращает полный путь до загружаемого стороннего модуля с учетов общей конфигурации config для RequireJS
                // moduleResource - представляет собой имя или путь до модуля вместе с его расширением, например 'view/templates/main.html'

                // req.defined(moduleName) - функция, которая использовалась ранее в RequireJS в версии до 0.25.0. Возвращает true, если
                // конкретный модуль уже загружен и учтен.

                // req.specified(moduleName) - функция возвращает true, если уже произведен запрос на загрузку модуля или он уже находится в процессе
                // загрузки и должен быть доступен в некоторой точке выполнения программы.

                // onload() - функция сообщает загрузчику о том, что плагин завершил загрузку модуля.
                // Данная функция, вызываемая со значением value модуля name.

                // onload.error()  - функция может быть вызвана, если плагин обнаруживает ошибку, которая не позволяет загрузить модуль правильно.
                // В данную функцию передается объект error.

                // config - конфигурационный объект, в котором содержится информация о конфигурации данного плагина.
                // Плагин i18n! использует объект config для получения текущей локали языка, если приложение хочет принудительно установить другую локаль языка.
                // Сборщик r.js установит свойство isBuild в config со значением true, если плагин или pluginBuilder будет вызван, в составе сборщика r.js

                // Плагин должен вызывать функцию onload() сразу, как только значение config.isBuild будет равно true.
                if (config.isBuild) {
                    // Обозначает, что сборщик r.js не должен ждать и может начать сборку. Данный ресурс будет получен динамически в процессе работы браузера.
                    onload();
                } else {
                    // Сделать что-то еще, что может быть асинхронным.
                }

                // Пример плагина работающего также, как и обычный require()
                req([name], function (value) {
                    onload(value);
                });

                // Иногда плагином загружается JavaScript-код в виде текстовой строки, которую надо дополнительно выполнить.
                // Для этого существует функция onload.fromText(), которая может выполнить загруженный JavaScript-код посредством функции eval()
                // RequireJS выполнит правильно работу по вызову любой анонимной функции define(), обнаруженной в  текстовой строке, после чего
                // используется полученный модуль.
                // Функция onload.fromText(text) принимает аргумент text, который представляет из себя строку с JavaScript-кодом, который надо выполнить.
                // Пример работы плагина с обработкой строки с JavaScript-кодом:
                var url = req.toUrl(name + '.txt');
                fetchText(url, function (text) {
                    text = transform(text);
                    onload.fromText(text);
                });
                // До RequireJS 2.1.0 функция onload.fromText(moduleName, text) принимала в качестве первого аругмента путь до модуля, а сам плагин
                // должен был вручную вызывать функцию require([moduleName], onload) после вызова функции onload.fromText()
              }
              // Нормализовать путь до модуля
            , normalize: function (name, normalize) { // функция для нормализации имени загружаемого файла 'path/to/file' (необходима только, если имя файла не является именем модуля)
                // Некоторые модули имеют относительные пути, поэтому они должны быть преобразованы в полные пути.
                // name - путь до модуля, который должен быть нормализован.
                // normalize() - функция, которая может быть вызвана для нормализации пути до модуля.
                // Данную функцию не нужно создавать, если вы используете стандартные обычные до модулей.
                // Например, плагин text! не имеет в себе функцию normalize().

                // Пример кода функции normalize()
                // define(['index!2?./a:./b:./c'], function (indexResource) {
                //     // indexResource will be the module that corresponds to './c'.
                // });
                function parse(name) {
                    var parts = name.split('?')
                        , index = parseInt(parts[0], 10)
                        , choices = parts[1].split(':')
                        , choice = choices[index];
                    return {
                          index: index
                        , choices: choices
                        , choice: choice
                    };
                }
                var parsed = parse(name)
                    , choices = parsed.choices;
                for (i = 0; i < choices.length; i++) {
                    choices[i] = normalize(choices[i]);
                }
                return parsed.index + '?' + choices.join(':');
              }

              // Записать содержимое модуля в итоговый файл сборки
            , write: function (pluginName, moduleName, write) { // функция используется сборщиком r.js для обозначения того, когда плагин должен начать работу для преобразований содержимого файла 'path/to/file' перед записью в итоговый файл сборки
                // Функция write нужна только, если плагин будет выводить что-то для сборщика.

                // pluginName - строка с номализованным путем до плагина.
                // Большинство плагинов не будут иметь имени, то есть будут анонимными плагинами, поэтому полезно знать нормализорванный путь до плагина в
                // файле сборщике.

                // moduleName -  строка с номализованным путем до модуля.

                // write() - функция, которая вызывается для передачи строки для записи в итоговый файл сборки.

                // write.asModule(moduleName, text) - функция, которая используется для записи модуля имеющего вызов анонимной define(), требующей втавку имени
                // и содержащего неявный вызов зависимеостей через require(""), которые должны быть помещены в итоговый файл сборки.
                // Функцию write.asModule() удобно использовать для плагинов, трансформирующих текст, таких как плагин для CoffeeScript.
                // Плагин text! использует функцию write для записи строки с текстом в итоговый файл сборки.

                // Пример кода функции write()
                if (moduleName in buildMap) {
                    var text = jsEscape(buildMap[moduleName]);
                    write('define("' + pluginName + '!' + moduleName  + '", function () { return "' + text + '";});\n');
                }
              }
            , pluginBuilder: '' // строка с именем модуля, который должен быть использован сборщиком r.js для преобразований содержимого файла 'path/to/file' перед записью в итоговый файл сборки
            // Используется, если билд плагин содержит серьезную логику работы для Node.js, которую не имеет смысла хранить в плагине, который используется в браузере.
            // Не используйте именные модули в составе плагина или pluginBuilder.
            // Текстовое содержимое pluginBuilder используется вместо содержимого основного файла плагина, но это работает только, если файлы не вызывают модули через define() по именам.
            //////////////////////////////////////////////////////////////////////////////////////////
            , onLayerEnd: function (write, data) { // функция используемая только сборщиком r.js в версии 2.1.0 и позже.
            // Функция вызывается после сборки всех модулей данного типа, например чтобы сбросить внутреннее состояние.
            // Например плагину требуется записать некоторые утилитные функции после сборки.

            // write() - функция, вызываемая со строкой вывода для записи в оптимизационный слой.

            // data - объект, хранящий в себе информацию о слое. Имеет 2 свойства:
            // name - имя модуля слоя. Может быть undefined.
            // path - путь до файла слоя. Может быть undefined, если вывод является строкой, содержащей другой script.
              }
            , writeFile: function (pluginName, name, parentRequire, write) { // функция, которая используется только сборщиком r.js, нужная только, если
            // плагину надо записать альтернативную версию зависимости, используемую плагином

           // pluginName - строка с нормализованным именем плагина

            // name - строка с номанлизованным именем модуля

            // parentRequire() - локальная функция require(). В основном используется для вызова parentRequire.toUrl() для создания путей до файлов,
            // использующихся внутри директории сборки.

            // write(fileName, text) - функция, вызываемая с двумя аргументами:
            // fileName - строка с именем файла для записи. Вы можете использовать функцию parentRequire.toUrl() для относительных путей для генерации
            // внутри директории сборки.
            // text - строка с содержимым файла в кодировке UTF-8.

            // write.asModule(moduleName, fileName, text) - функция
            // asModule - может использоваться для записи и вставки анонимных вызовов функции define() в итоговый файл сборки.

            // Пример использовани яфункции writeFile() находится в плагиен  text!

              }
        };
    });
})();

Комментариев нет:

Отправить комментарий