Раздербанил код
jquerymy.js до вчерашнего дня был единым куском кода и я таки решился раздербанить 4К+ строк на компоненты и полностью перенести разработку $.my с файловой системы в браузер, в мой волшебный IDE.
Это оказалось неожиданно небыстро. Попутно пришлось решать проблему пересборки кода с переформатированием на правильное количество табов – это тоже оказалось неожиданно небыстро.
Результат почти законченного раздербанивания – вот на картиночке, колонка слева. Чёто много получилось, я даже не ожидал.
Главной фичей 1.2.0 будет начало плавного депрекэйта третьего аргумента в функциях связывания. Туда передаётся DOM-node с контролом, что некошерно.
Некошерность тут в том, что если функция этот аргумент использует, вся форма становится непригодна для серверной валидации данных через неё, потому что в node.js серверным валидатором никакой DOM естессно не рисуется. А у меня внезапно на генерик-валидатор, в связи с новым JS-рерайтом в CouchDB, появились большие планы.
Я с сентября примерно думал, с какой-бы стороны мне поухватистее за проблему уцепиться, и академически прекрасное решение никак не придумывалось. Всё получалось, что надо городить виртуальный DOM, как в React, а это дурацкая идея.
Не надо на сервере DOM, ни реальный, ни виртуальный. HTML DOM – он чтобы в браузере показываться, если он выплывает на сервере где-то – значит недодумано.
И меня в какой-то момент торкнуло, что мне надо просто взять все $.my-манифесты, что мне доступны, и посмотреть, а как-же этот третий аргумент по факту в реальном коде используется. В силу того, что именование этого аргумента – вполне себе устоявшийся паттерн, это не было очень как-то сложно.
Подходящих bind- и check- функций нашлось чуть больше 1500, и внезапно анализ показал, что в 99%+ (это из тех, где аргумент используется, а таких меньше 1/5) один и тот-же сценарий. Этот аргумент используется чтобы принудительно триггерить системные события на контролах формы, по их строковому селектору как правило.
Любопытно, что все остальные сценарии использования – просто черезжопие запрещёнными мануалом способами, то-есть их можно не рассматривать вообще.
Тут то всё и расставилось. Для того, чтобы триггерить ивенты на контролах, не обязательно иметь доступ в DOM, это может делать сама форма, и даже короче получается.
То-есть вместо $ctrl.my('find', '#ctrl1').trigger('check') мы будем писать this.my.check('#ctrl1'). Красота, и прекрасно имплементится в серверном валидаторе безо всякого DOM.
Такая вот колбаса.