Реализация функции 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 не помогает(( Как заставить подобную модель работать? |
Динамическая подгрузка (или 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;
Каждый раз объединять файлы конечно только на этапе разработки нужно. |
Не надо заставлять работать подобную модель. Надо собирать все js-файлы в один.
|
Спасибо за советы, приму во внимание.
|
на стадии разработки удобно иметь подключение всех файлов по отдельности. http://mojura.110mb.com/i-component/...n/-/-/index.js
|
| Часовой пояс GMT +3, время: 14:55. |