Как я минимизатор JavaScipt на пыхе писал
![Горящий монитор, увешанный спутанными проводами и клубками для вязания.](/uploads/article/images/2024/666f7908d4633.webp)
Итак, зачем же я создал категорию JavaScript, чтобы в ней разместить статью как меня пытал JavaScript своей квантовой не определенностью?
Искал готовые решения, ну что-то 10 лет назад коммиты в них лететь перестали. Подумал, что понятно, есть же полноценные инструменты для работы с JS, всякие babel, webpack и прочие. Но зачем мне всё это? у меня скриптов на мегабайт... Хочу поделиться опытом и сказать, что есть альтернативы, как бы сейчас странно, это не звучало.
Что же пошло не так?
Начиналось все прекрасно, я даже зарелизил библиотеку, которая просто удаляла лишние пробелы и переносы строк. При этом, она игнорировала регулярные выражения и текст в кавычках. Всё было хорошо. Я протестировал её на десятке скриптов с codepen, специально искал замудренные с физикой, графикой, матаном и прочими шалостями.
Я понимал, что учтено далеко не всё и продолжал прогонять скрипты через свой минимизатор, который в целом, при своем скромном функционале неплохо ужимал джаваскрипт код.
Скрипт который "снёс всю малину" был случайно найден.
Я всегда считал, что нет плохих языков программирования, есть только задачи для которых хорош тот или иной, но сегодня я понимаю, что это не совсем так.
Одно в этом минимизаторе работало хорошо, это сокращение имен функци. Например test заменялось на o1 со всеми вызовами.
Не таща к себе инфраструктуру, распарсить JS правктически не возможно.
- Огромное множество вариантов написания регулярных выражений.
Они могут начинаться с кавычек, могут разеделяться разрывами строк, если это new Regexp (может и в других случаях), они могут быть внутри аргумента функции, они могут быть переданы по цепочке и так далее. Из-за этого, я не нашел простого способа, удалить комментарии из кода. Теперь стало понятно, почему нормальных библиотек на php нет. Так же я не хотел создавать объекты на каждый блок и выполнять анализ с кучей условий. Я хотел поделиться скриптом с миром и хотел чтобы он бережно относился к памяти.
Регулярное выражение может быть просто обрамлено в кавычки new RegExp("ab+c", "i") Может слэшами. Я в доке не нашел, что можно сделать так.
new RegExp(
`^
\\d{3}
-
\\d{2}
-
\\d{4}$,
'g'
Это самый гангстерский язык программирования который я видел. Где-то натыкался на утверждение что модуль nginx njs работает быстро, у меня он используется на одном проекте. Сейчас ясно, что это правда на половину. Либо под капотом сидит Гарри Поттер и творит запрещенную магию.
Чтобы удалить комментарии из кода, нужно все варианты регулярок пропустить, потому как в начале может встретится одна регулярка содержащая \/*, а в конце другая с .*/
/^(rw|lw)$/.test(i) && /\d+/.test(l._element.style.height)
/\/\*/.test(data)
e.style.replace(/:[^;]+(;|$)\s*/g,",")
- Разделитель ; не обязателен, Карл!
Видимо есть идея сделать одну кнопку для написания JS кода, в которую нужно будет пинать ногой. Я не могу найти ни каких объяснений в такой вольности - пиши как хочешь. Не думай о будущем.
let check = function myBest(){ /**/ }
console.log(check)
let qwerty = 123
Спасибо, что скобки в условии обязательны. Нет, может они джаваскриптщикам усложняют жизнь? А то на golang они не нужны...
Наверное, я чего-то не понимаю, и кто-то скажет, что это вопрос холивара. Я категорически не соглашусь! Как это всё парсится? Чтобы выполнить этот код, его нужно детально разобрать, иначе могут быть ошибки, как интерпритатор, это всё разгребает? Вот есть крутая тема, все переходим на let, var устарел. Но у них разная область видимости. Чтобы интерпритатор могу правильно её разграничить, ему нужно вычислить это в коде, где есть только одно правило - нет ни каких правил. Это какой-то бойцовский клуб.
- Фигурная скобка не обязательна, Каааааарл!
if (a === b)
callFunction(
a,
b
)
console.log(a + b)
Да, не только JS таит в себе такую "замечательную" фичу (нет, пайтон, это вообще не об этом), но Крал, Карл, точка с запятой не обязательна! Где заканчивается и начинается семантический блок ни кому не известно, это нужен сложный статический анализ, которому известны все сигнатуры джабаскрипта.
Нелья, вот так просто, взять и очистить JS от лишних пробелов и переносов строк.
Это язык для исключительно творческих людей, который любят смотреть на ядерный взыр без солнечных очков. Но, не поймите не правильно, это хороший язык, для своих задачь и грядущий проект, мне предстоит писать на React. В инфраструктуре JS, ты об этом не думаешь. Там вся магия под капотом, остается только восхищаться как это все шевелится, крутится и откликается.
К своему сожалению, я столкнулся с другой стороной JS. Ужаснулся. Сказка "о трех поросях", учит, что дом должен быть кирпичный. У меня сейчас стойкое ощущение, что из JS можно создать соломенный дом. Фронт, теперь сомнительно, но окэй, но бэк, ребята, побойтесь бога.
Естественно, это тема для рассуждений и миллионы фронтов пишутся на JS фреймворках. Так было и будет всегда. Я не пытаюсь топить против JS, оно мне не надо и я без него ни куда.
Итак, альтернативы
Это беглый поиск, после болевого шока. Об этом задуматься должен был не только я.
WebAssembly позволяет исполнять бинарный код в серед JS. Я вижу в этом большую перспективу. Хорошо, TypeScript и аналоги, вытаскивают тонущий JS, но это уже бесполезно. Я не видел ни одного не лагающего интерфейса JS. Со временем техдолг перевалит за всякие разумные границы и последний плюс использования JS исчезнет. Хорошо, документация на js обширнее и готовых решений больше, но риск выстрелить себе в ногу, ни когда не будет ниже 49%. В документации описаны не все прелести джаваскрипта. Как это работает до конца не понимает никто (шутка).
Вы хотели писать на одном ЯП, хотите нанимать программистов обладающих хорошим опытом одного ЯП и чтобы на нем и сайт и бухгалтерия, и свет в теплице?
Этот блог написан на извечной связке php+js+css+html. Сегодня я принял решение, сменить стек. Постараюсь дополнить эту статью позже.