Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.05.2014, 16:41
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 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();
		});
	};
})();


Как решить эту проблему? Хочется иметь нормальный конструктор сразу после загрузки.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #2 (permalink)  
Старый 15.05.2014, 18:12
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 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 правильно? по-моему, тут что-то не так
Ответить с цитированием
  #3 (permalink)  
Старый 15.05.2014, 18:26
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от melky
ты уверен, что используешь requirejs правильно? по-моему, тут что-то не так
Только что на хабре наподобный коментарий отвечал, который, кстати, тоже без решения.

Это standalone скрипт без зависимостей (с возможностью работы как с жуквери плагином). Я не имею возможности заставлять клиента подключать библиотеку requirejs.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #4 (permalink)  
Старый 15.05.2014, 18:31
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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

а что, если перейти на browserify ? там commonjs модули в браузере. Я эту штуку ещё не пробовал, но скорее всего там тоже есть что-то типа оптимизации из requirejs
Ответить с цитированием
  #5 (permalink)  
Старый 15.05.2014, 18:36
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 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();
		});
	};
})();
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #6 (permalink)  
Старый 15.05.2014, 19:14
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

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

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

Обобщая, представьте, что вы пишете библиотеку (типа жиквери), состоящую из множества файлов, а затем компилируемую в один. Эта библиотека создает одну глобальную переменную, дабы пользователь имел возможность обратиться к ней, без подключения другой библиотеки.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #7 (permalink)  
Старый 15.05.2014, 21:02
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от FINoM
Приложение сделано с использованием requirejs
Сообщение от FINoM
Я не имею возможности заставлять пользователя подключать requirejs
Тогда твое приложение посыпется или я что-то не понял.

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

На мой взгляд у тебя в одном посте противоречие: надо подгрузить файлы по требованию и тут же "все в одном файле".
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #8 (permalink)  
Старый 16.05.2014, 09:42
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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


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

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

интересно, а в browserify есть оптимизация?
Ответить с цитированием
  #9 (permalink)  
Старый 16.05.2014, 13:20
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от nerv_
Тогда твое приложение посыпется или я что-то не понял.
Не посыпется. Но грузить приложение зависимостями, имея возможность этого не делать - глупо.
Сообщение от melky
это типа конкатенация через requirejs понял да йоу.
Не просто конкатенация. Реквайр мне нужен, в данном случае, для того, чтоб все файлы, в том числе и библиотеки, не срали в глобальный контекст. Создается только одна переменная - конструктор и один файл: все зависимости в куче (в том числе, локальный requirejs, который нельзя вызвать извне).
Сообщение от nerv_
На мой взгляд у тебя в одном посте противоречие: надо подгрузить файлы по требованию и тут же "все в одном файле".
melky уже ответил на это.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #10 (permalink)  
Старый 26.05.2014, 00:51
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 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.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вызвать правильно php-файл из функции? Seobmen Общие вопросы Javascript 4 10.10.2012 14:40
даже не знаю как сформуллировать, вопрос по AJAX eugene00 AJAX и COMET 15 15.02.2010 15:07
Как вызвать OpenDialog через JS? Некто Элементы интерфейса 6 26.11.2009 14:17
как вызвать функцию? pumpurumer jQuery 2 27.08.2009 19:39
Вопрос как сделать эту панельку Определённых размеров и свойств. jei jQuery 3 09.06.2009 19:14