Javascript-форум (https://javascript.ru/forum/)
-   Библиотеки/Тулкиты/Фреймворки (https://javascript.ru/forum/library-toolkit-framework/)
-   -   Вопрос по requirejs: как вызвать модуль немедленно? (https://javascript.ru/forum/library-toolkit-framework/47246-vopros-po-requirejs-kak-vyzvat-modul-nemedlenno.html)

FINoM 15.05.2014 16:41

Вопрос по 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();
		});
	};
})();


Как решить эту проблему? Хочется иметь нормальный конструктор сразу после загрузки.

melky 15.05.2014 18:12

Цитата:

Сообщение от FINoM (Сообщение 311948)
main.js:
define( 'main', [ 'blah' ], function( Blah ) {
	window.Blah = Blah;
});
require( ['main'] );


Далее, в другом файле вызываем:
new Blah(); // Blah is not defined

ты уверен, что используешь requirejs правильно? по-моему, тут что-то не так

FINoM 15.05.2014 18:26

Цитата:

Сообщение от melky
ты уверен, что используешь requirejs правильно? по-моему, тут что-то не так

Только что на хабре наподобный коментарий отвечал, который, кстати, тоже без решения.

Это standalone скрипт без зависимостей (с возможностью работы как с жуквери плагином). Я не имею возможности заставлять клиента подключать библиотеку requirejs.

melky 15.05.2014 18:31

ну, сам requirejs асинхронен по природе, так что против этого (и идеологии AMD) лучше не идти :)

а что, если перейти на browserify ? там commonjs модули в браузере. Я эту штуку ещё не пробовал, но скорее всего там тоже есть что-то типа оптимизации из requirejs

FINoM 15.05.2014 18:36

Цитата:

Сообщение от melky
ну, сам requirejs асинхронен по природе, так что против этого (и идеологии AMD) лучше не идти

Это я уже понял. А пост написал в надежде на наличие чего-то типа requireimmediately.
Цитата:

Сообщение от melky
а что, если перейти на browserify ? там синхронный commonjs в браузере. Я эту штуку ещё не пробовал, но скорее всего там тоже есть что-то типа оптимизации из requirejs

Проект большой (50 часов работы), переход на другую библиотеку мне никто не оплатит, так то буду довольствоваться хаком:
( function() {
	window.Blah = function() {
		var _this = this;
		require([ 'blah' ], function( _Blah ) {
			_this.me = new _Blah();
		});
	};
})();

FINoM 15.05.2014 19:14

Вот еще небольшое пояснение:

Я пишу (написал уже) относительно крупное приложение, не простое, а встраиваемое. Каждый, кто имеет доступ к скомпилированному скрипту, может запустить это приложение используя конструктор (в примере это Blah) и передать в него некоторые опции запуска (настройки). Приложение сделано с использованием requirejs дабы не делать нервы пользователю кучей зависимостей и множеством классов. Я не имею возможности заставлять пользователя подключать requirejs.

Обобщая, представьте, что вы пишете библиотеку (типа жиквери), состоящую из множества файлов, а затем компилируемую в один. Эта библиотека создает одну глобальную переменную, дабы пользователь имел возможность обратиться к ней, без подключения другой библиотеки.

nerv_ 15.05.2014 21:02

Цитата:

Сообщение от FINoM
Приложение сделано с использованием requirejs

Цитата:

Сообщение от FINoM
Я не имею возможности заставлять пользователя подключать requirejs

Тогда твое приложение посыпется или я что-то не понял.

Цитата:

Сообщение от FINoM
Обобщая, представьте, что вы пишете библиотеку (типа жиквери), состоящую из множества файлов, а затем компилируемую в один

тогда зачем тебе requirejs, если все в одном файле?

На мой взгляд у тебя в одном посте противоречие: надо подгрузить файлы по требованию и тут же "все в одном файле".

melky 16.05.2014 09:42

Цитата:

Сообщение от nerv_ (Сообщение 311986)
Тогда твое приложение посыпется или я что-то не понял.


тогда зачем тебе requirejs, если все в одном файле?

На мой взгляд у тебя в одном посте противоречие: надо подгрузить файлы по требованию и тут же "все в одном файле".

это типа конкатенация через requirejs понял да йоу. :)
концепция удобненькая - знай себе запилился зависимостями в bower, подключил их через requirejs и потом через оптимизацию получил один файл. но модули загружаются асинхронно.

интересно, а в browserify есть оптимизация?

FINoM 16.05.2014 13:20

Цитата:

Сообщение от nerv_
Тогда твое приложение посыпется или я что-то не понял.

Не посыпется. Но грузить приложение зависимостями, имея возможность этого не делать - глупо.
Цитата:

Сообщение от melky
это типа конкатенация через requirejs понял да йоу.

Не просто конкатенация. Реквайр мне нужен, в данном случае, для того, чтоб все файлы, в том числе и библиотеки, не срали в глобальный контекст. Создается только одна переменная - конструктор и один файл: все зависимости в куче (в том числе, локальный requirejs, который нельзя вызвать извне).
Цитата:

Сообщение от nerv_
На мой взгляд у тебя в одном посте противоречие: надо подгрузить файлы по требованию и тут же "все в одном файле".

melky уже ответил на это.

tenshi 26.05.2014 00:51

Цитата:

Сообщение от FINoM (Сообщение 312032)
Не посыпется. Но грузить приложение зависимостями, имея возможность этого не делать - глупо.Не просто конкатенация. Реквайр мне нужен, в данном случае, для того, чтоб все файлы, в том числе и библиотеки, не срали в глобальный контекст. Создается только одна переменная - конструктор и один файл: все зависимости в куче (в том числе, локальный requirejs, который нельзя вызвать извне).

Заворачиваем весь пакет в

this.MyConstructor = function(){var window = this; with( window ){
// тут библиотеки, которые срут
return MyConstructor
}}.call( Object.create( window ) )


И никакой реквайр не нужен.

FINoM 26.05.2014 01:13

Цитата:

Сообщение от tenshi
И никакой реквайр не нужен.

Не нужон.

Забыл сказать, что нашел решение. Оно заключается в использовании другой AMD библиотеки, almond, в частности (работает только для скомпилированной, или как говорят, оптимизированной версии). Если глянуть в исходник, у функции require есть секретный аргумент forceSync.


Часовой пояс GMT +3, время: 17:25.