/*
* 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!
}
};
});
})();
Комментариев нет:
Отправить комментарий