Інклюд у - яваскрипті
![]() | Завдання. | Спростити створення великих проектів. | ![]() |
![]() | ![]() |
Сучасний великий сайт неможливо уявити без яваскрипту, і чим ближче розробник бажає наблизити свою програму до того, що називається вебом 2.0, тим більше стає частка яваскрипту в загальному обсязі програмного коду.
Велика кількість скриптів складніше структурувати, а елемент кожної сторінки перетворюється на щось подібне:
Але це півбіди. Адже файл Page/Index.js залежить від Company.js, а той у свою чергу від Widget/Person.js та Widget/Address.js. А ті від Widget/Date.js та Box.js тощо.
Причому завантажувати їх потрібно у зазначеній послідовності. А якщо сторінок багато? А якщо, наприклад, хочеться розділити якийсь із віджетів на два файли? Або додати кілька нових класів? Або об'єднати кілька скриптів в один великий файл, щоб прискорити завантаження?
Адже всі залежності зручно було б зберігати безпосередньо у js-файлах.
Майже у будь-якій «дорослій» мові для цього існує конструкція include. У яваскрипті її немає, але за належного бажання її вдається зімітувати. Уявіть, як зручно було б написати на початку Company.js щось на зразок:
Що ж заважає зробити так? Або веб 2.0 здатний лише на розфарбовування кнопок?
Які перешкоди чекають на нас? По-перше, інклюд має повністю відпрацьовувати до початку виконання коду. По-друге, не виключено залежності кількох файлів від одного модуля і завантажувати його двічі зовсім не хочеться. По-третє, потрібен якийсь механізм завантаження файлів із сервера. Для початку перешкод вистачить.
На дворі 2007 рік, і переважна більшість браузерів підтримують XHTTPRequest саме їм і слідуєкористуватися. Цей об'єкт працює у двох режимах: асинхронному (коли вказується функція зворотного дзвінка) та синхронному (запит відбувається безпосередньо під час дзвінка xhttp.open() ). Нам потрібен другий: при цьому код завантажиться прямо на місці js.include. А далі достатньо виконати eval(xhttp.responseText):
От і все. Тепер перед завантаженням скриптів достатньо підключити js.js та інклюд працює.
/cc4.gif)
/cc1.gif)
/cc3.gif)
/cc2.gif)