Вопрос по requirejs: как вызвать модуль немедленно?
Пишу встраиваемое прилоение, что-то типа огромного jQuery плагина. "Главный" модуль должен запросить другой модуль, в котором, в свою очередь загружаются остальные модули. Он (главный модуль) должен создавать глобальную функцию. Проблема в том, что эта функция создается с задержкой из-за того, что модули асинхронны.
main.js:
define( 'main', [ 'blah' ], function( Blah ) {
window.Blah = Blah;
});
require( ['main'] );
Далее, в другом файле вызываем: new Blah(); // Blah is not defined Оптимизатор должен выдавать один JS файл, который должен немедленно создать переменную. <script src="blah-built.js"></script> <script>new Blah(); // Blah is not defined </script> Сейчас приходится извращатьс вот так: main.js:
( function() {
window.Blah = function() {
var _this = this;
require([ 'blah' ], function( _Blah ) {
_this.me = new _Blah();
});
};
})();
Как решить эту проблему? Хочется иметь нормальный конструктор сразу после загрузки. |
Цитата:
|
Цитата:
Это standalone скрипт без зависимостей (с возможностью работы как с жуквери плагином). Я не имею возможности заставлять клиента подключать библиотеку requirejs. |
ну, сам requirejs асинхронен по природе, так что против этого (и идеологии AMD) лучше не идти :)
а что, если перейти на browserify ? там commonjs модули в браузере. Я эту штуку ещё не пробовал, но скорее всего там тоже есть что-то типа оптимизации из requirejs |
Цитата:
Цитата:
( function() {
window.Blah = function() {
var _this = this;
require([ 'blah' ], function( _Blah ) {
_this.me = new _Blah();
});
};
})();
|
Вот еще небольшое пояснение:
Я пишу (написал уже) относительно крупное приложение, не простое, а встраиваемое. Каждый, кто имеет доступ к скомпилированному скрипту, может запустить это приложение используя конструктор (в примере это Blah) и передать в него некоторые опции запуска (настройки). Приложение сделано с использованием requirejs дабы не делать нервы пользователю кучей зависимостей и множеством классов. Я не имею возможности заставлять пользователя подключать requirejs. Обобщая, представьте, что вы пишете библиотеку (типа жиквери), состоящую из множества файлов, а затем компилируемую в один. Эта библиотека создает одну глобальную переменную, дабы пользователь имел возможность обратиться к ней, без подключения другой библиотеки. |
Цитата:
Цитата:
Цитата:
На мой взгляд у тебя в одном посте противоречие: надо подгрузить файлы по требованию и тут же "все в одном файле". |
Цитата:
концепция удобненькая - знай себе запилился зависимостями в bower, подключил их через requirejs и потом через оптимизацию получил один файл. но модули загружаются асинхронно. интересно, а в browserify есть оптимизация? |
Цитата:
Цитата:
Цитата:
|
Цитата:
this.MyConstructor = function(){var window = this; with( window ){
// тут библиотеки, которые срут
return MyConstructor
}}.call( Object.create( window ) )
И никакой реквайр не нужен. |
Цитата:
Забыл сказать, что нашел решение. Оно заключается в использовании другой AMD библиотеки, almond, в частности (работает только для скомпилированной, или как говорят, оптимизированной версии). Если глянуть в исходник, у функции require есть секретный аргумент forceSync. |
| Часовой пояс GMT +3, время: 17:09. |