Ээм... Ну, typescript это пакет, содержащий библиотеку, написанную на JS. Когда вы запускаете tsc из консоли, node/deno/bun загружают в себя код из этой библиотеки, вызывают встроенный в них копилятор (для Node и Deno это V8, для bun JavaScriptCore), который парсит этот код, компилирует его в нативный и исполняет...
А как вам bun/deno заменит TS? Они ж перпендикулярны друг другу. Node/deno/bun только стрипают типы, а чтобы построить граф и проверить, все ли типы соответствуют друг другу — всё равно оригинальный TS нужен
Его исполняет V8, который и так заоптимизирован по самые помидоры. Ускорения x10 от него точно фиг добьёшься. Дальше либо компиляция JS в нативный код, либо нативный код сразу. Они выбрали второй вариант.
А я-то в кои-то веки думал цивилизованную дискуссию вести... Глупый, глупый я 😔
А всего-то стоило немного погуглить и найти пост Дэна Абрамова. Который TL;DR: "Мы подумали, что так будет лучше, а когда поняли, что не будет, было уже слишком геморно всё менять".
Это не так, иначе бы JSX не могли использовать другие фреймворки. А оно спокойно существует и в SolidJS, и в Stencil, и в Vue, кстати говоря (по крайней мере, можно было в той версии, с которой я знакомился). И если мне память не изменяет, из всех них только реакт использует className. И да, даже если вы в реакте напишете class, он не умрёт на этапе компиляции, а честно создаст объект с полем class.
Функции в шаблон Lit передавать не рекомендуют. Для реакции на события есть @-поле, оно там отдельно оптимизировано (там используется объект { handleEvent }, который заведует подпиской на событие, и у которого просто заменяется функция, так что на слушателей shallow check не распространяется).
Обход по всем значениям это не круто
Это уже экономия на спичках. Цикл — одна из самых оптимизированных операций в JS, тем более тот, который не использует итераторы. Вряд ли вы будете создавать шаблон с миллионом значений, а с таким объёмом JS справляется за миллисекунды.
Не задавались вопросом почему вместо class в JSX className?
Потому что разрабам реакта было влом переименовать переменную. Все остальные фреймворки спокойно пользуются class и в ус не дуют, это только реакт такой особенный.
Он там частичный абсолютно всегда. Любое изменение дёргает только конткретные атрибуты/поля/ивенты. Изначальный код HTML заворачивается в template, далее в местах разрыва tag literal регистрируются "дырки" (holes или values), которые при повторном рендере обновляются по изменению value по конкретному индексу. В общем, все преимущества Virtual DOM без его недостатков. Свои caveats там, конечно, тоже есть (например, нельзя вдруг поменять имя тэга, это требует пересчёта всего элемента и теряет все преимущества), но по сравнению с virtual dom они гораздо менее существенны. И работает безо всякой транспиляции, прямо в браузере.
Критическая проблема данного подхода — это неподсвечиваемые, невалидируемые (через линт) и неформатируемые выражения внутри строк. Собственно, для решения этой проблемы и появился JSX. Он позволяет использовать все возможности JS без ограничений, и при этом всё ещё иметь выразительный язык шаблонов. Ангуляр, кстати, тоже от этой проблемы страдает, но это уже просто наследие ранних подходов.
Но если так хочется совместить строки и pure JS, почему не воспользоваться Lit? (точнее, lit-html, веб компоненты тянуть не обязательно). Lit как раз отлично решает проблему: это прямые строки, никакой компиляции, и в то же время можно свободно пользоваться возможностями языка
автор коммента про то, что это чуть ли не новый стандарт и нужно использовать только их сразу куда то слился с обсуждения. Как это всегда бывает. И как будет с вами.
Пхпх, а чего мне на вас время тратить-то 🤭 Что вообще можно сказать лягушке, которая не интересуется ничем, кроме своего колодца?
Иммутабельные паттерны разработки UI-приложений в последние годы стали одними из самых популярных
Я даже пошёл календарь перепроверить, не оказался ли я случайно в 2018. Иммутабельные паттерны разработки при том, что у нас уже много лет есть сигналы? `Immutable.js` в 2026? И я, конечно, догадывался, что Redux всё ещё где-то рядом с нами, но назвать его популярным?
В общем, статья вызывает большие вопросы о релевантности (и ностальгию!)
Ээм... Ну, typescript это пакет, содержащий библиотеку, написанную на JS. Когда вы запускаете tsc из консоли, node/deno/bun загружают в себя код из этой библиотеки, вызывают встроенный в них копилятор (для Node и Deno это V8, для bun JavaScriptCore), который парсит этот код, компилирует его в нативный и исполняет...
Мне правда нужно это объяснять?
А как вам bun/deno заменит TS? Они ж перпендикулярны друг другу. Node/deno/bun только стрипают типы, а чтобы построить граф и проверить, все ли типы соответствуют друг другу — всё равно оригинальный TS нужен
Его исполняет V8, который и так заоптимизирован по самые помидоры. Ускорения x10 от него точно фиг добьёшься. Дальше либо компиляция JS в нативный код, либо нативный код сразу. Они выбрали второй вариант.
А я-то в кои-то веки думал цивилизованную дискуссию вести... Глупый, глупый я 😔
А всего-то стоило немного погуглить и найти пост Дэна Абрамова. Который TL;DR: "Мы подумали, что так будет лучше, а когда поняли, что не будет, было уже слишком геморно всё менять".
Учитесь гуглить, уважаемый.
Ээ, простите, вы о чём? Не вижу связи
Это не так, иначе бы JSX не могли использовать другие фреймворки. А оно спокойно существует и в SolidJS, и в Stencil, и в Vue, кстати говоря (по крайней мере, можно было в той версии, с которой я знакомился). И если мне память не изменяет, из всех них только реакт использует
className. И да, даже если вы в реакте напишетеclass, он не умрёт на этапе компиляции, а честно создаст объект с полемclass.Примеры:
BabelJS
TypeScript
Esbuild
Функции в шаблон Lit передавать не рекомендуют. Для реакции на события есть
@-поле, оно там отдельно оптимизировано (там используется объект{ handleEvent }, который заведует подпиской на событие, и у которого просто заменяется функция, так что на слушателей shallow check не распространяется).Это уже экономия на спичках. Цикл — одна из самых оптимизированных операций в JS, тем более тот, который не использует итераторы. Вряд ли вы будете создавать шаблон с миллионом значений, а с таким объёмом JS справляется за миллисекунды.
Потому что разрабам реакта было влом переименовать переменную. Все остальные фреймворки спокойно пользуются
classи в ус не дуют, это только реакт такой особенный.Ммм, вы говорите про shallow check, что ли? Если сильно (очень сильно!) упрощать, то он выглядит как-то так:
Что тут может нагружать CPU, да ещё и неимоверно?
Он там частичный абсолютно всегда. Любое изменение дёргает только конткретные атрибуты/поля/ивенты. Изначальный код HTML заворачивается в template, далее в местах разрыва tag literal регистрируются "дырки" (holes или values), которые при повторном рендере обновляются по изменению value по конкретному индексу. В общем, все преимущества Virtual DOM без его недостатков. Свои caveats там, конечно, тоже есть (например, нельзя вдруг поменять имя тэга, это требует пересчёта всего элемента и теряет все преимущества), но по сравнению с virtual dom они гораздо менее существенны. И работает безо всякой транспиляции, прямо в браузере.
А если я пользкюсь Intellij IDEA? )
Критическая проблема данного подхода — это неподсвечиваемые, невалидируемые (через линт) и неформатируемые выражения внутри строк. Собственно, для решения этой проблемы и появился JSX. Он позволяет использовать все возможности JS без ограничений, и при этом всё ещё иметь выразительный язык шаблонов. Ангуляр, кстати, тоже от этой проблемы страдает, но это уже просто наследие ранних подходов.
Но если так хочется совместить строки и pure JS, почему не воспользоваться Lit? (точнее, lit-html, веб компоненты тянуть не обязательно). Lit как раз отлично решает проблему: это прямые строки, никакой компиляции, и в то же время можно свободно пользоваться возможностями языка
Ааа, вон оно как! Спасибо за объяснение, паззл сложился 😊
В августе? 2023? 🧐
Пхпх, а чего мне на вас время тратить-то 🤭 Что вообще можно сказать лягушке, которая не интересуется ничем, кроме своего колодца?
Вы там под корягой прогаете, если про сигналы не слышали, или да?
А вообще смешно, конечно, смотреть на ваши потуги доказать, что вы правы.
Но меж тем реальность, увы, не на вашей стороне.
Preact изобрёл сигналы (ну, не то чтобы это новая технология, но именно их реализация запустила хайп)
React принял сигналы по умолчанию (в смысле, они ничего не делали, Preact изначательно реализовывал сигналы и для реакта тоже).
Ангуляр внедрил у себя сигналы, который заменяют (барабанная дробь) rxjs.
У Vue они теперь тоже есть, как Alien Signals.
Solid с сигналами работает ещё до Preact.
Svelte втащили себе сигналы.
И даже в TC39 появился пропозал на включение нативных сигналов в платформу.
Если это не популярность, то вы попросту отрицаете реальность, пытаясь основываться на ничего не значащих циферках.
Вот как? Тогда самый популярный стейт-менеджер это rxjs. Ни редакс, ни ваш зустанд рядом даже чихнуть не смеют. Всё верно?
И что вы этим докажете? Что много легаси на редаксе работает? Ну так на jQuery 90% веба до сих пор крутится.
А вот предложение на включение в JS редакс точно не получал.
Я даже пошёл календарь перепроверить, не оказался ли я случайно в 2018. Иммутабельные паттерны разработки при том, что у нас уже много лет есть сигналы? `Immutable.js` в 2026? И я, конечно, догадывался, что Redux всё ещё где-то рядом с нами, но назвать его популярным?
В общем, статья вызывает большие вопросы о релевантности (и ностальгию!)
AbortController: ну да, ну да, пошёл я нафигНу, maintenance mode же. Конечно что-то фиксят. Но вот Material Expressive уже не дождёмся, как и бо́льшей части компонентов оригинальной спеки