15.05.2014, 16:41
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Вопрос по 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();
});
};
})();
Как решить эту проблему? Хочется иметь нормальный конструктор сразу после загрузки.
|
|
15.05.2014, 18:12
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от FINoM
|
main.js:
define( 'main', [ 'blah' ], function( Blah ) {
window.Blah = Blah;
});
require( ['main'] );
Далее, в другом файле вызываем:
new Blah(); // Blah is not defined
|
ты уверен, что используешь requirejs правильно? по-моему, тут что-то не так
|
|
15.05.2014, 18:26
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от melky
|
ты уверен, что используешь requirejs правильно? по-моему, тут что-то не так
|
Только что на хабре наподобный коментарий отвечал, который, кстати, тоже без решения.
Это standalone скрипт без зависимостей (с возможностью работы как с жуквери плагином). Я не имею возможности заставлять клиента подключать библиотеку requirejs.
|
|
15.05.2014, 18:31
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
ну, сам requirejs асинхронен по природе, так что против этого (и идеологии AMD) лучше не идти
а что, если перейти на browserify ? там commonjs модули в браузере. Я эту штуку ещё не пробовал, но скорее всего там тоже есть что-то типа оптимизации из requirejs
|
|
15.05.2014, 18:36
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от melky
|
ну, сам requirejs асинхронен по природе, так что против этого (и идеологии AMD) лучше не идти
|
Это я уже понял. А пост написал в надежде на наличие чего-то типа requireimmediately.
Сообщение от melky
|
а что, если перейти на browserify ? там синхронный commonjs в браузере. Я эту штуку ещё не пробовал, но скорее всего там тоже есть что-то типа оптимизации из requirejs
|
Проект большой (50 часов работы), переход на другую библиотеку мне никто не оплатит, так то буду довольствоваться хаком:
( function() {
window.Blah = function() {
var _this = this;
require([ 'blah' ], function( _Blah ) {
_this.me = new _Blah();
});
};
})();
|
|
15.05.2014, 19:14
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Вот еще небольшое пояснение:
Я пишу (написал уже) относительно крупное приложение, не простое, а встраиваемое. Каждый, кто имеет доступ к скомпилированному скрипту, может запустить это приложение используя конструктор (в примере это Blah) и передать в него некоторые опции запуска (настройки). Приложение сделано с использованием requirejs дабы не делать нервы пользователю кучей зависимостей и множеством классов. Я не имею возможности заставлять пользователя подключать requirejs.
Обобщая, представьте, что вы пишете библиотеку (типа жиквери), состоящую из множества файлов, а затем компилируемую в один. Эта библиотека создает одну глобальную переменную, дабы пользователь имел возможность обратиться к ней, без подключения другой библиотеки.
|
|
15.05.2014, 21:02
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от FINoM
|
Приложение сделано с использованием requirejs
|
Сообщение от FINoM
|
Я не имею возможности заставлять пользователя подключать requirejs
|
Тогда твое приложение посыпется или я что-то не понял.
Сообщение от FINoM
|
Обобщая, представьте, что вы пишете библиотеку (типа жиквери), состоящую из множества файлов, а затем компилируемую в один
|
тогда зачем тебе requirejs, если все в одном файле?
На мой взгляд у тебя в одном посте противоречие: надо подгрузить файлы по требованию и тут же "все в одном файле".
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
16.05.2014, 09:42
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от nerv_
|
Тогда твое приложение посыпется или я что-то не понял.
тогда зачем тебе requirejs, если все в одном файле?
На мой взгляд у тебя в одном посте противоречие: надо подгрузить файлы по требованию и тут же "все в одном файле".
|
это типа конкатенация через requirejs понял да йоу.
концепция удобненькая - знай себе запилился зависимостями в bower, подключил их через requirejs и потом через оптимизацию получил один файл. но модули загружаются асинхронно.
интересно, а в browserify есть оптимизация?
|
|
16.05.2014, 13:20
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от nerv_
|
Тогда твое приложение посыпется или я что-то не понял.
|
Не посыпется. Но грузить приложение зависимостями, имея возможность этого не делать - глупо.
Сообщение от melky
|
это типа конкатенация через requirejs понял да йоу.
|
Не просто конкатенация. Реквайр мне нужен, в данном случае, для того, чтоб все файлы, в том числе и библиотеки, не срали в глобальный контекст. Создается только одна переменная - конструктор и один файл: все зависимости в куче (в том числе, локальный requirejs, который нельзя вызвать извне).
Сообщение от nerv_
|
На мой взгляд у тебя в одном посте противоречие: надо подгрузить файлы по требованию и тут же "все в одном файле".
|
melky уже ответил на это.
|
|
26.05.2014, 00:51
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
Сообщение от FINoM
|
Не посыпется. Но грузить приложение зависимостями, имея возможность этого не делать - глупо.Не просто конкатенация. Реквайр мне нужен, в данном случае, для того, чтоб все файлы, в том числе и библиотеки, не срали в глобальный контекст. Создается только одна переменная - конструктор и один файл: все зависимости в куче (в том числе, локальный requirejs, который нельзя вызвать извне).
|
Заворачиваем весь пакет в
this.MyConstructor = function(){var window = this; with( window ){
// тут библиотеки, которые срут
return MyConstructor
}}.call( Object.create( window ) )
И никакой реквайр не нужен.
__________________
.ня
Последний раз редактировалось tenshi, 26.05.2014 в 00:56.
|
|
|
|