Вот что я собираюсь сделать ...
Пара заметок:
- Я использую шаблон фабрики виджетов пользовательского интерфейса jQuery (но это не совсем виджет)
- Код виджета находится на удаленном сервере, и потребители только ссылаются на него, но не скачивают его
- Я использую requirejs для загрузки зависимостей виджетов
- Я хочу максимально удобного использования для потребителя-разработчика
Поскольку требуется, чтобы мой виджет пользовательского интерфейса jQuery был загружен как можно скорее, чтобы у потребителя был контекст виджета сразу ($ (селектор) .mywidget), я решил решить мою проблему внутри метода _create.
Этот код в основном устанавливает requirejs, если он не существует, а затем использует его для установки массива требований, которые должен использовать вышеупомянутый виджет. Это позволяет мне предположить, что конечный пользователь может ссылаться на мой скрипт «виджета» по URL, привязать атрибут « data-requiremodule » с тем же именем и получить полный список удаленных зависимостей.
_create: function () {
var widget = this;
widget._establish(widget, function () {
widget._install(widget);
});
},
_getBaseURL: function (scriptId, callback) {
var str = $('script[data-requiremodule="' + scriptId + '"]').attr('src');
if (callback) callback(str.substring(str.search(/scripts/i), 0));
},
_require: function (requirementAry, baseUrl, callback) {
require.config({ baseUrl: baseUrl });
require(requirementAry, function () {
if (callback) callback();
});
},
_establish: function (widget, callback) {
if (typeof require === 'undefined') {
widget._getBaseURL(widget._configurations.widgetName, function (baseUrl) {
var requireUrl = baseUrl + 'scripts/require.min.js';
baseUrl = baseUrl + 'scripts/';
$.getScript(requireUrl, function (data, textStatus) {
widget._require(widget._configurations.requiredLibs, baseUrl, function () {
callback(textStatus);
});
});
});
}
},
Я не показываю здесь свой объект "_configurations" ... но вы поняли идею. Я надеюсь, что это помогает кому-то еще, кроме меня:).