Снегопат
https://snegopat.ru/forum/

Скрипты-библиотеки и драфт реализации stdlib.require()
https://snegopat.ru/forum/viewtopic.php?f=3&t=55
Страница 1 из 1

Автор:  kuntashov [ 31 окт 2011, 21:55 ]
Заголовок сообщения:  Скрипты-библиотеки и драфт реализации stdlib.require()

Всем привет!

Предлагаю обсудить такую идею. Скрипты Снегопата удобно использовать в качестве "библиотек" функций, как альтернативу использования WSC.

По сравнению с WSC у них как минимум есть неоспоримое преимущество: их не надо регистрировать.

Но есть и существенный недостаток: если использовать их "как есть", все библиотечные функции на момент исполнения скрипта/макроса должны быть загружены (причем загружены до скриптов, которые их будут использовать). Сейчас это не проблема, но, вспоминая случай OpenConf'а, скоро Снегопат обрастет кучей различных скриптов и кучей библиотек, а соответственно получим уже знакомую историю: все скрипты будут загружаться во время запуска конфигуратора и тормозить его.

Предлагаю к рассмотрению вариант "динамической" подгрузки скриптов-библиотек (по требованию), которая может осуществляться как при старте того или иного скрипта, так и при вызове макроса (выбор остается на откуп разработчику макроса).

Также динамическая подгрузка библиотек избавляет нас от необходимости явным образом следить за порядком загрузки скриптов (чтобы не ломались зависимости от библиотек, когда скрипт загружается раньше библиотеки).

Для этого в stdlib.js (3_std.js) я добавил метод require(libFileName) и сделал незначительные правки в snegopat.js и snegopatwnd.js.

Измененные файлы из моего экспериментального бранча прилагаю (сделать push в мастер-репозиторий не могу в связи с отсутствием прав).

Пример использования:

Код:
$engine JScript
$uname TestRunner
$dname Менеджер юнит-тестов скриптов
$addin global
$addin stdlib

var jsUnit = stdlib.require("jsUnitCore.js");


В качестве параметра require() может быть передан либо полный путь к файлу скрипта, либо имя скрипта. В последнем случае скрипт-библиотека ищется в подкаталоге scripts/Libs каталога Снегопата.

Вложения:
core.zip [11.86 КБ]
Скачиваний: 564

Автор:  artbear [ 01 ноя 2011, 07:20 ]
Заголовок сообщения:  Re: Скрипты-библиотеки и драфт реализации stdlib.require()

Нужное дело. Поддерживаю по всем пунктам

Автор:  orefkov [ 01 ноя 2011, 07:58 ]
Заголовок сообщения:  Re: Скрипты-библиотеки и драфт реализации stdlib.require()

Добавил в основной репозитарий.

Автор:  kuntashov [ 06 ноя 2011, 23:00 ]
Заголовок сообщения:  Re: Скрипты-библиотеки и драфт реализации stdlib.require()

Саша, эта версия работала не так, как работает директива $addin. Последняя возвращает addin.object, а require() возвращает addin.

Думаю, логичнее, если require() будет вести себя также, как и директива $addin.

В своей локальной ветке я внес изменения, исправленный скрипт прилагаю. Если ты не против, добавь в основной репозиторий.

Вложения:
3_std.zip [2.54 КБ]
Скачиваний: 535

Автор:  orefkov [ 07 ноя 2011, 07:47 ]
Заголовок сообщения:  Re: Скрипты-библиотеки и драфт реализации stdlib.require()

Сделал.
И добавил тебе прав на коммит в основной репозитарий.

Автор:  kuntashov [ 07 ноя 2011, 08:32 ]
Заголовок сообщения:  Re: Скрипты-библиотеки и драфт реализации stdlib.require()

Спасибо!

Автор:  artbear [ 07 ноя 2011, 10:01 ]
Заголовок сообщения:  Re: Скрипты-библиотеки и драфт реализации stdlib.require()

ИМХО сейчас одинаковый код юзается в 2-х скриптах
stdlib, testrunner
Код:
        var libGroupName = "Подгружаемые библиотеки";       
        var libGroup = addins.root.child;               
        var libFound = false;
       
        while (libGroup)
        {
            if (libGroup.name == libGroupName)
            {
                libFound = true;
                break
            }
           
            libGroup = libGroup.next;
        }
       
        if (!libFound)
            libGroup = addins.root.addGroup(libGroupName);

1. создавать группу совсем необязательно, она в любом случае создается в snegopat.js
2. код поиска лучше выделить либо в stdlib в отдельный методв,
либо просто и без поиска в snegopat.js запоминать созданную группу и возвращать ее отдельным методом.
имхо второй вариант лучше.
Этот метод, возможно, пригодится в дальнейшем для других задач.

Автор:  kuntashov [ 07 ноя 2011, 10:23 ]
Заголовок сообщения:  Re: Скрипты-библиотеки и драфт реализации stdlib.require()

Я так сделал, потому что самостоятельно такие принципиальные решения принимать не стал, а так согласен.
Единственное, подчеркну, в testrunner'е мне нужен именно объект IAddin, а require возвращает IAddin::object, поэтому в testrunner'е я продублировал код и сделал модификацию.

Я вообще бы предпочел, чтобы для нужд тестирования и подобных была возможность загружать скрипты без отображения в дереве загруженных скриптов окна Снегопата.

Нужен также способ временно приостановить обновление дерева перед массовой загрузкой скриптов, а потом делать полное обновление (вместо обновления дерева окна снегопата при загрузке каждого отдельного скрипта).

Я сейчас прорабатываю этот вариант.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/