Pull to refresh

JScriptInclude Gear v 0.1.0 — механизм каскадного импорта скриптов/библиотек. (Реванш)

Reading time 8 min
Views 997
Доброго времени суток уважаемые хабражители.

Предлагаю Вашему вниманию пост-реванш, под названием JScriptInclude Gear механизм каскадного импорта скриптов/библиотек. Предыдущий пост презентующий JScriptInclude Gear на данный момент самозабвенно убран в черновики, теперь он совсем не актуален, не смотря на то, что предыдущая презентация была довольно сурово воспринята хабра-яваскриптерами, а там все таки было за что :), очень много опалы было вызвано непониманием сути, а именно того, что
JScript(WSH) != JavaScript(браузеры), в связи с чем JScriptInclude Gear возводился в ранг костылей, велосипедов, «было уже», «инахренаже» и т.д.
Я тогда очень хотел поделиться своим решением, но совсем не представлял как, как сделать его «вкусным» и понятным, но мне кажется сейчас у меня это получилось.
Тем не менее «Отхабренное» дело получило ход, люди пишут, люди пользуются, людям нравится. За прошедшую неделю я получил достаточно много отзывов, что стимулировало меня работать над своим решением, в итоге оно преобразилось до неузнаваемости. Спасибо всем, кто вышел вместе со мной на линию огня.

Тем же кто не знает о чем собственно речь — маленькое, завлекающее предисловие:
JScriptInclude Gear — это механизм каскадного импорта скриптов/библиотек предназначенный для использования в скриптах автоматизации написанных на языке JScript интерпретируемых технологией WSH(Windows Script Host) в окружении семейства операционных систем Windows. Дополнительно предоставляющий функционал для организации скриптов в виде базовых модулей, поддерживающий их определение в файлах конфигурации и их последующий вызов по псевдонимам и так далее, и тому подобное :)

Тех же, кто уже читал о JScriptInclude Gear в предыдущем посте, не смотря на, может быть, оставшийся негатив, я откланявшись попрошу остаться, уверяю Вас — здесь будет кое-что интересное, ведь изменилось почти всё: механизм теперь экспортируется COM-компонентой и подключается к Вашему скрипту двумя строками кода, подготовлен SFX-пакет для установки механизма в систему с автоматической регистрацией компоненты и автоматической конфигурацией необходимых путей, документация переделана «от и до», и теперь представлена в виде HTML, пример теперь стартует без «танцев с бубном», а в качестве приятного бонуса, в нем представлено несколько полезных модулей, которые описаны в документации (они, все-же являются примером использования и «не претендуют»), и естественно «подвылизан» сам код, хотя в процессе использования Вы с ним теперь собственно не сталкиваетесь.
Для тех кому неймётся, милости прошу на GitHub:
Механизм JScriptInclude Gear SFX-пакет установки.
(самостоятельный до безобразия :) )
Механизм JScriptInclude Gear сoрцы как есть.
(О развертывании в доп комментарии к последнему комиту, или в справке — раздел jsImport Object врезка «Внимание!!!»)
И все же хотелось бы, чтобы Вы прочитали оставшиеся «много букаф», хотя бы до пункта Возможности JScriptInclude Gear:

Заинтересовавшихся милости прошу под хабракат…


Назначение JScriptInclude Gear:


В первую очередь, восполнить отсутствие в технологии возможности подключать скрипты/библиотеки как таковые. Технология Windows Scripting предлагает частично разрешить этот вопрос при помощи оборачивания кода в XML формат специфического файла WSF(Windows Script File), но его использование не позволяет обеспечить «каскад подключений». В связи с этим обстоятельством, невозможно сформировать структуру библиотек имеющих свои зависимости. В данном решении, Вам предлагается преодалеть эту проблему через обеспечение каскадного импорта.
Каскадный импорт, это возможность заслуживающая особого внимания — ее принцип позаимствован автором из технологии Node.JS. В такой модели множество файлов JavaScript-кода составляют гибкую и лаконичную структуру модулей и их зависимостей друг от друга.
В Node.JS такой механизм предоставляется ядром технологии, и ей же обеспечивается контроль, в случае с JScriptInclude Gear — механизм естественно является имитацией, и реализован средствами языка JScript и некоторых сопутствующих технологий.

Реализация JScriptInclude Gear :


По сравнению с первыми редакциями JScriptInclude Gear предлагавшими пользователю размещать код механизма в начале целевого скрипта, а это не много ни мало 110 строк кода, в настоящей редакции автор преодалел это неудобство при помощи технологии Windows Script Components, которая позволяет, специальным образом описанныем в XML-формате, скрипты регистрировать как COM-компоненты. Таким образом автор подготовил компоненту JScriptInclude.wsc, основное назначение которой — экспорт исходного кода механизма.
Автор учел неудобства связанные необходимостью некоторой ручной настройки путей, и преодалел это обстоятельство, путем подготовки специального SFX-пакета, который помимо предоставления необходимых файлов, так же регистрирует в системе вышеупомянутую компоненту как "JScriptIncludeGear", и вызывает на исполнение скрипт призванный автоматически установить необходимые актуальные пути в исходных кодах механизма.
Что касается обязательного использования богомерзкого eval() для инициализаии импортированного кода, а теперь и для инициализации кода самого механизма в глобальном стеке, то эта проблема является непреодалимой, т.к. в WSH не имеется возможности, каким либо образом, выполнить код в контексе глобального объекта, кроме как вызов его через eval() из основного стека исполняемого скрипта.
PS: Позволю себе еще раз напомнить Вам о том, что JScript(WSH) != JavaScript(в браузерах) не смотря на то, что оба являются реализацией стандарта ECMA 262, они существуют в абсолютно разном окружении.
В WSH нет window, нет никакого DOM, и иже с ними тегов script, и так далее, и тому подобное.

После успешной установки в любом из ваших JScript скриптов в целевой системе, Вы можете подключить механизм каскадного иморта JScriptInclude Gear, а так же получить доступ к системе его базовых модулей следующим образом:
jsIncludeGear = new ActiveXObject("JScriptIncludeGear"); 	
eval(jsIncludeGear.getSourceCode()); 

Компонента, о которой автор упомянул ранее, предназначена лишь для экспорта исходного кода самого механизма через вызов метода getSourceCode(), инициализировав результат его исполнения через eval() Вам становится доступен глобальный объект jsImport, через свойства и методы которго реализован основной функционал механизма.
Например основная иструкция импорта / объявления зависимости:
jsImport.require(targetScript) 

Объекту jsImprot, его методам и свойствам посвящен отдельный раздел справосного пособия поставляемого вместе с механизмом JScriptInculde Gear. (После успешной установки из SFX-пакета Вам будет предложено с ней ознакомиться, а так же в сообщении Вам будет показано ее расположение)

Так же в целевой директории установки механизма JSciprInclude Gear находится каталог \\example\\, в нем, в каталоге TestDir Вы найдете файл JScriptExample.js который является примером использования механизма, в нем продемострированы основные возможности и предлагаемый автором концепт. (После успешной установки из SFX-пакета Вам будет предложено с запустить его, а так же в в проводнике откроется содержащий пример каталог)

Завершающей инструкцией любой процедуры импорта должа быть инициализация загруженного кода, следующим образом:
eval(jsImport.initialization()); 



Возможности JScriptInclude Gear:


1) Подключение произвольного скрипта – предоставляется возможность простой конструкцией
jsImport.require(targetScript)

подключить другой скрипт к исполняемому, исполнить его код, или получить доступ к объявленным в нем сущностям.
Это позволяет многократно использовать имеющиеся наработки и готовые решения в своей работе.
2) Каскадный импорт – предоставляется возможность подключать скрипты/библиотеки, которые, в свою очередь, так же имеют возможность указать на необходимость подключения других скриптов/библиотек (автор предлагает в дальнейшем называть это "зависимостями", а их факт их подключения "реализацией зависимостей").
Обозначение зависимости в подключаемых скриптах/модулях реализуется через включение в код такой же инструкции подключения:
jsImport.require(targetScript)

, т.е. такой же вызов, как тот при помощи которого они сами были подключены.
В общем виде подключение происходит по принципу нисходящего рекурсивного вызова процедуры импорта. В данном механизме применимо использование абсолютных и относительных путей при определении зависимости. Стоит акцентировать внимание на том, что относительные пути, при объявлении зависимости, рассматриваться исходя из местоположения скрипта в котором эта зависимость объявлена, т.е. в подключаемом скрипте — относительно этого самого подключаемого скрипта, а не относительно скрипта инициатора (скрипта в котором объявлен механизм, и производится первый импорт в каскаде).

3) Сингулярность подключения – Данный механизм, в процессе импорта, отслеживает уже подключенные файлы, и не допускает их повторной инициализации, даже если ссылка на один и тот же скрипт/библиотеку присутствует во множестве зависимостей по пути каскадного ветвления.

4) Обеспечение модели стандартных модулей – Данный механизм предоставляет средства для организации структуры базовых модулей, когда скрипты/библиотеки стандартизированы или универсальны и предполагаются присутствующими в системе. Для этого в JScriptInclude Gear используются файлы конфигурации базовых модулей описывающих их по псевдонимам, через которые в последствии любой скрипт подключивший механизм, может использовать все его базовые модули. В инструментарий включены методы для определения новых и переопределиния существующих модулей, загрузки пользовательских конфигураций:
Определение нового модуля специальной инструкцией. В случае каскада подключений, дает возможность воспользоваться объявленным модулем по всей низлежащей части каскада, а также во всех последующих процедурах импорта:
jsImport.defineBaseModule(moduleName, modulePath) 

, сам файл конфигурации "jsModulesConfig.js", по умолчанию находится корневом каталоге установки JScriptInclude Gear, во время установки в нем автоматически определяются модули из базовой поставки. В случае необходимости добавления/изменения/замены каких либо модулей, вы можете:
- отредактировать базовый файл конфигурации, что делать не рекомендуется, т.к. например в случае обновления, этот файл скорее всего будет изменен.
- использовать пользовательские файлы конфигурации, а во время исполнения Вашего кода подключать их специальной инструкцией:
jsImport.getConfig(ConfigFilePath)

Внимание Объявленные в пользовательском файле конфигурации модули, при совпадении псевдонимов с псевдонимами модулей объявленных в базовой конфигурации, будут превалировать над ними, и перекрывать их.

5) Кэширование импортированного кода, с целью отладки или повторного использования – В процессе разработки данного механизма, неоднократно вставал вопрос касающийся отладки импортируемого кода. В связи с тем, что инициализируется он через eval(), то получить корректное сообщение об ошибке в загруженном коде не представляется возможным — ссылка на строку кода вызвавшую исключение является неинформативной относительно Вашего скрипта. Для разрешения подобной проблемы предусмотрено кэширование импортируемого кода, т.е. его материализация через запись в отдельный файл скрипта CacheFile.js. Необходимость записи определяется установлением специального свойства:

jsImport.WriteCache = true 


В последствии через его запуск возможно получить корректное сообщение об ошибке.
PS: Файл кэша возможно использовать как скомпилированное решение, т.е. в последствии использовать его вместо новой процедуры импорта, в таком случае не ясна цель использования JSscriptInclude Gear, хотя автору видится, что такое решение возможно пригодится, хотя бы по средствам упрощения сборки кода из множества файлов.

Обо всем еще чуточку подробнее уважаемые хабражители, в прилагаемой документации.

И еще разочек… Да пожалуйста!


Механизм JScriptInclude Gear SFX-пакет установки.
(самостоятельный до безобразия)
Механизм JScriptInclude Gear сoрцы как есть.
(О развертывании в доп комментарии к последнему комиту, или в справке — раздел jsImport Object врезка «Внимание!!!»)

UPD: У некоторых пользователей, SFX-пакет не производит регистрацию компоненты.
SFX немного переделан, сейчас вроде работает, но опять же не у всех, проблемы наблюдаются например на x64, главные подозреваемые пока — антивирусы.
Если после установки пример не удалось с ходу запустить, то зарегистрируйте JScriptInclude.wsc вручную,
Или запустите скрипт AfterInstall.js собственноручно.
Tags:
Hubs:
+6
Comments 9
Comments Comments 9

Articles