Інклюд у - яваскрипті

яваскрипті
Завдання.Спростити створення великих проектів.
Widget
яваскрипті
Widget

Сучасний великий сайт неможливо уявити без яваскрипту, і чим ближче розробник бажає наблизити свою програму до того, що називається вебом 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 та інклюд працює.