Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Реализация функции include (https://javascript.ru/forum/misc/11956-realizaciya-funkcii-include.html)

BreatheInTheVoid 23.09.2010 11:47

Реализация функции include
 
Здравствуйте. Опыта в js у меня пока совсем не много. В общем возникла идея в своем web приложении реализовать вот такую систему:

Допустим, что в HTML шаблоне будет:
<head>
	<script type = "text/javascript" src = "/js/MyLib.js"></script>
	<script type = "text/javascript" src = "/js/scripts/SomePage.js"></script>
</head>


А в файле somePage.js допустим должно быть что-то вроде:
MyLib.include('Extern.Prototype');
MyLib.include('Extern.Scriptaculous');
MyLib.include('MyLib.MyWiget.MyForm')

(function( ) {
	MyLib.Scripts.SomePage = {
		// js код для somePage с использованием подключенных библиотек
	}
})( );


В MyLib.js есть функция include, для присоединения нужных скриптов.
Она определяет, не присоединен ли данный модуль, если нет инклудит его таким образом:
try {
		document.write('<script type = "text/javascript" src = "' + finalPath + '"><\/script>'); 
	} catch(e) {
		var script = document.createElement('script');
		script.type = 'text/javascript';
		script.src = finalPath;
		document.getElementsByTagName('head')[0].appendChild(script);	
	}

Иерархия объектов построена в соответствии в иерархией директорий.
Получается у нас есть определенный шаблон на сервере /scripts/index.tpl
и для него js код в /js/scripts/Index.js, там MyLib.Scripts.Index = {}.
И в нем подключены библиотеки для его кода.


Но вся эта реализация летит в трубу((
Получается, что браузер присоеденяет сначало "/js/scripts/SomePage.js",
а только потом инклуды которые в нем прописаны, соответственно ничего
не работает, insertBefore не помогает((

Как заставить подобную модель работать?

Octane 23.09.2010 13:12

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

То есть делаете запрос, например, на:
<script type = "text/javascript" src = "/js/alljs.php"></script>

А этот alljs.php собирает лежащие в директории /js/ файлы в кучу:
header('Content-type: text/javascript; charset=utf-8;');
header('Expires: ' . date('r', mktime(0, 0, 0, date('m'), date('d') + 1, date('Y'))) );

echo file_get_contents('MyLib.js') . PHP_EOL . PHP_EOL;
echo file_get_contents('prototype.js') . PHP_EOL . PHP_EOL;
echo file_get_contents('scriptaculous.js') . PHP_EOL . PHP_EOL;
echo file_get_contents('MyLib.MyWiget.MyForm.js') . PHP_EOL . PHP_EOL;
echo file_get_contents('SomePage.js') . PHP_EOL . PHP_EOL;

Каждый раз объединять файлы конечно только на этапе разработки нужно.

Kolyaj 23.09.2010 13:13

Не надо заставлять работать подобную модель. Надо собирать все js-файлы в один.

BreatheInTheVoid 23.09.2010 13:21

Спасибо за советы, приму во внимание.

tenshi 23.09.2010 14:23

на стадии разработки удобно иметь подключение всех файлов по отдельности. http://mojura.110mb.com/i-component/...n/-/-/index.js


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