# Понедельник 6 твитов
Всем привет! Я Павел Лосев (@v1rtlize), мне 16 лет, я веб-разработчик, занимаюсь Open Source. Также веду довольно п… twitter.com/i/web/status/1…
8:05Из опенсорса на данный момент пишу свой веб-фреймворк - tinyhttp - более быстрый и современный аналог Express, и уч… twitter.com/i/web/status/1…
8:06Помимо опенсорса работаю над закрытыми проектами для клиентов из России (и США). Делал простые сайты для российских… twitter.com/i/web/status/1…
8:07Так как я в силу своего возраста нигде оффициально пока не работал, мне очень редко приходилось сталкиваться с лега… twitter.com/i/web/status/1…
8:08# Вторник 26 твитов
Первой темой будут системы модулей в JavaScript. На данный момент самые популярные - это ECMAScript Modules (ESM),… twitter.com/i/web/status/1…
9:18Самое простое определение: модуль — это переиспользуемый кусок кода, который содержит реализацию API. Обычно это ку… twitter.com/i/web/status/1…
9:18Давным давно, ещё до существования Node.js и ES6, в JavaScript не было никакого другого способа разделять JavaScrip… twitter.com/i/web/status/1…
9:19Таким образом работает IIFE (Immediately Invoked Function Expression) - он сразу же вызывает ф-цию с обёрнутым моду… twitter.com/i/web/status/1…
9:19У такого подхода очевидно было много проблем - неудобство управления зависимостями и загрязнение глобального пространства.
9:19Были вспомогательные модульные системы по типу System.js и AMD (Async Module Definition), но это не было стандартом… twitter.com/i/web/status/1…
9:21В 2009 появилась такая штука как Node.js. И у неё тоже появилась своя модульная система, которая называется CommonJ… twitter.com/i/web/status/1…
9:21Помимо уже трёх самых популярных IIFE, AMD и CommonJS появилась ещё одна система, которая объединяет в себе сразу в… twitter.com/i/web/status/1…
9:21И вот наступает 2015... выходит ES6, в которой наконец-то появились модули. Теперь вместо поддержки 4х систем модул… twitter.com/i/web/status/1…
9:22Из-за того что модули вошли в язык как стандарт довольно поздно, до сих пор абсолютное большинство JavaScript кода… twitter.com/i/web/status/1…
9:22Вернёмся к ESM. Благодаря тому, что в ESM существуют именованные импорты, сборщикам гораздо проще делать tree-shaki… twitter.com/i/web/status/1…
9:22Это касается только сборщиков, насколько я знаю в Node.js рантайме никакого tree-shaking нет, но им можно воспользо… twitter.com/i/web/status/1…
9:23А что там у ноды? В Node.js (без флагов) ESM появился только лишь в 2019 году в версии 13.2.0. Чтобы запустить файл… twitter.com/i/web/status/1…
9:25В чём смысл Node ESM? Во-первых, это следование стандарту (и унификация BE и FE кода). Во-вторых, именованные импор… twitter.com/i/web/status/1…
9:26Однако, не всё так просто с ESM. Большинство модулей всё ещё CJS-only. Т.к. CommonJS не умеет в именованные экспорт… twitter.com/i/web/status/1…
9:26Ещё есть один важный момент - в относительных путях всегда надо указывать расширение файла, иначе будет Cannot find… twitter.com/i/web/status/1…
9:27Это поле позволяет инкапсулировать модуль, и экспортировать только определённые файлы, без всяких расширений. Причё… twitter.com/i/web/status/1…
9:27Пример заполнения такого поля: github.com/talentlessguy/…
9:27Теперь надо подумать, как это всё собирать, чтобы не писать параллельно несколько файлов для CJS и ESM? Существует… twitter.com/i/web/status/1…
9:28Из самых популярных можно взять Rollup. esbuild также поддерживает как CJS так и ESM. Лично я использую обёртку над… twitter.com/i/web/status/1…
9:28ссылки:
Rollup - github.com/rollup/rollup
esbuild - github.com/evanw/esbuild
tsup - github.com/egoist/tsup
ещё вспомнил - microbundle: github.com/developit/micr…
9:31Я сейчас коллекционирую модули с Node ESM поддержкой, если кому интересно (добавить свой / посмотреть), то вот ссыл… twitter.com/i/web/status/1…
9:32Вспомнил ещё один приём, чтобы не собирать две версии отдельно, можно импортировать CJS в ESM и потом прописать име… twitter.com/i/web/status/1…
11:33@jsunderhood Ещё одно дополнение (zanuda mode on). CommonJS как инициатива по разработке унифицированных API (не то… twitter.com/i/web/status/1…
Поправочка, CommonJS существовал до Node.js
@jsunderhood Ещё одно дополнение (zanuda mode on). CommonJS как инициатива по разработке унифицированных API (не то… twitter.com/i/web/status/1…
12:18
@jsunderhood Может я не понимаю слово «вспомогательные», но в своё время AMD очень мощно конкурировал с CommonJS, и… twitter.com/i/web/status/1…
Тут ошибка, AMD можно было собирать бандлером (через r.js), а не только через лоадер
@jsunderhood Может я не понимаю слово «вспомогательные», но в своё время AMD очень мощно конкурировал с CommonJS, и… twitter.com/i/web/status/1…
12:19
# Среда 17 твитов
Второй темой будет многопоточность в Node.js. Как известно, изначально рантайм работает в одном потоке, используя т… twitter.com/i/web/status/1…
8:47Из встроенных модулей самым подходящим для веб приложений будет cluster. Суть cluster в том, что он позволяет запус… twitter.com/i/web/status/1…
8:47Внутри себя использует child_process.fork() для создания форк-процессов и работает по алгоритму Round Robin (это ко… twitter.com/i/web/status/1…
8:47В backend приложениях без БД, cluster легко интегрировать, нужно сделать проверку на то, что процесс является масте… twitter.com/i/web/status/1…
8:47Один из самых известных - синхронизация. Проблема в том, что потоки работают ассинхронно, а доступ к значениям прои… twitter.com/i/web/status/1…
8:47Одно из решений - mutex. Они блокируют поток в критическом месте, и позже разблокируют его, чтобы ничего не поломат… twitter.com/i/web/status/1…
8:47Дело в том, что mutex'ы полезны только когда у процессов есть общая память. Общая память у процессов в другом модул… twitter.com/i/web/status/1…
8:47Т.к. в cluster у каждого процесса своя память, то нужно использовать распределённое блокирование (distributed lock)… twitter.com/i/web/status/1…
8:47Необязательно это должен быть многопоточный сервер, ещё один юзкейс это когда у вас много инстансов бэка запущены н… twitter.com/i/web/status/1…
8:47Из простых решений для кластеризации Node.js приложений (без использования cluster в коде, и не учитывая БД) можно… twitter.com/i/web/status/1…
8:47Мультитрединг - довольно обширная тема, в которой у меня есть небольшие знания. Недавно я был в IT лагере (… twitter.com/i/web/status/1…
8:47Я мог перепутать термины - речь в треде идёт об использовании потоков (форк-процессов (надеюсь я хотя бы это правил… twitter.com/i/web/status/1…
9:00@jsunderhood В результате вызова cluster.fork() создаётся процесс, а не поток. Отличие в том, что процессы друг от… twitter.com/i/web/status/1…
В самом первом твите ошибка - то что описывается ниже это не мультитрединг. Это процессная многозадачность (поправь… twitter.com/i/web/status/1…
@jsunderhood В результате вызова cluster.fork() создаётся процесс, а не поток. Отличие в том, что процессы друг от… twitter.com/i/web/status/1…
9:59
(сделал ретвит правки с моим комментарием если вдруг кто не так понял)
10:01@jsunderhood У worker_threads не общая память, а возможность работать с shared memory для коммуникации. Фактически… twitter.com/i/web/status/1…
ещё одна ошибка прямо в этом твите)))
в worker_threads не общая память, а shared memory
@jsunderhood У worker_threads не общая память, а возможность работать с shared memory для коммуникации. Фактически… twitter.com/i/web/status/1…
11:09
Поправка - не общая память, а память, которой можно обмениваться через SharedArrayBuffer
11:27# Четверг 25 твитов
Сегодня будет тред про legacy (англ. наследие) в мире JavaScript. Под легаси я имею ввиду старые фреймворки, модули… twitter.com/i/web/status/1…
14:25Думаю, что тред получится довольно субъективным (т.к. для многих это не проблема вовсе), но постараюсь опираться на факты.
14:25Сначала подумаем, почему вообще возникает легаси. По моему мнению, оно появляется ввиду того, что JavaScript очень… twitter.com/i/web/status/1…
14:25Логично, что более старые фреймворки (например jQuery для фронта, или Express для бэка) будут популярнее новых, про… twitter.com/i/web/status/1…
14:25В то время, когда появлялись эти библиотеки, JavaScript был не настолько развит, или просто хотелось использовать к… twitter.com/i/web/status/1…
14:25К примеру, возьмём Object.setPrototypeOf. Метод был добавлен в ECMAScript в 2015 году, а ES2015 стал полностью подд… twitter.com/i/web/status/1…
14:25Такой случай у Express, он включает в себя этот полифилл, но зато поддерживает 0.10 версию. Как видим, у setprototy… twitter.com/i/web/status/1…
14:25И поэтому приходилось добавлять полифиллы – фичи языка, которые ещё не добавлены в спеку ECMAScript (или в Node.js)… twitter.com/i/web/status/1…
14:25С полифиллами есть одна большая проблема. Большинство полифиллов рано или поздно становятся ненужными, потому что J… twitter.com/i/web/status/1…
14:25Ещё одна проблема – бессмысленная поддержка старых версий браузеров и ноды. Некоторые фреймворки стараются работать… twitter.com/i/web/status/1…
14:25В браузерах похожая ситуация, бандлеры целятся на поддержку ES6 (и ранее), запихивая бесполезные полифиллы в бандл.… twitter.com/i/web/status/1…
14:25Не имеет особого практического смысла целиться на версии браузеров 5-ти летней давности. Но сборщики и компиляторы… twitter.com/i/web/status/1…
14:25Конечно, это всё можно настроить, но дефолтные настройки @babel/preset-env не так часто меняют. Теперь подумаем, чт… twitter.com/i/web/status/1…
14:25На фронте можно попытаться избавиться от легаси несколькими способами. Во-первых, не использовать старые фреймворки… twitter.com/i/web/status/1…
14:25Вместо жиквери можно либо переключиться на современные ремейки (например cash.js), либо использовать популярные UI… twitter.com/i/web/status/1…
14:25Также, как было упомянуто раньше, желательно целиться на новые браузеры версий прошлого или позапрошлого года, в сл… twitter.com/i/web/status/1…
14:25На бэке размер кода не так важен, потому что он влияет только на parse time. Я не знаю каких-то особых способов изб… twitter.com/i/web/status/1…
14:25Среди веб-фреймворков, относительно современные это Koa, Fastify, Polka. Если вам не хочется расставаться с API Exp… twitter.com/i/web/status/1…
14:25ссылка на фреймворк: github.com/talentlessguy/…
14:25тут кусок текста съехал, вот правильный вариант:
"Обычно много фичей от 2015 до 2020 заменяются полифиллами (или п… twitter.com/i/web/status/1…
14:30cash.js: kenwheeler.github.io/cash/
14:32и Koa, и Fastify, имеют большое комьюнити (tinyhttp пока таким не обладает :D)
так что не нужно бояться что вам ни… twitter.com/i/web/status/1…
14:35(под проблемой имеется ввиду что куча ненужного кода идёт в рантайм / бандл в зависимости от среды)
14:49завтра про него будет подробный тред с историей создания, зачем, и как начать пользоваться
уже начал рисовать черновик
15:30# Пятница 31 твит
В продолжение вчерашнего треда, хочу рассказать о том как я пишу свой веб-фреймворк - tinyhttp. Опишу зачем я решил… twitter.com/i/web/status/1…
13:56Ссылка на фреймворк, если кто не читал прошлый тред: github.com/talentlessguy/…
13:56Начну с проблемы. Вчера в треде про легаси я написал, что несмотря на то, что Express стар, он всё ещё самый популя… twitter.com/i/web/status/1…
13:56Из проблем, не связанных с легаси, можно выделить отсутствие типов в самой либе (нужно ставить @types/express), отс… twitter.com/i/web/status/1…
13:56Ещё одна субъективная проблема - код самого Express очень огромен и стар, в нём тяжело копаться. По крайней мере дл… twitter.com/i/web/status/1…
13:56Так вот, я захотел написать свой фреймворк, который был бы такой же как Express, но с поддержкой TypeScript, async… twitter.com/i/web/status/1…
13:56Читать было довольно тяжело, т.к. кода было очень много. Я решил поискать какие-то клоны Express с более простым ко… twitter.com/i/web/status/1…
13:56ссылка: github.com/lukeed/polka
13:56Для инструментов разработки решил взять pnpm, Rollup и changesets. pnpm - это пакетный менеджер, который переисполь… twitter.com/i/web/status/1…
13:56Rollup для сборки модулей в ESM и CommonJS, changesets для автоматического апргейда версий, и зависимых модулей. По… twitter.com/i/web/status/1…
13:56Для CI я выбрал Github Actions, для тестов Jest и покрытия - Codecov. Мб это я такой криворукий, но он у меня не ра… twitter.com/i/web/status/1…
13:56При всём этом, пока что планирую юзать их, чтобы оставаться внутри экосистемы GitHub.
На днях ещё попробовал настр… twitter.com/i/web/status/1…
13:56Ссылка на конфиг GH Actions: github.com/talentlessguy/…
13:56Базовую рабочую версию tinyhttp я набросал довольно быстро. Только у этой версии не было поддержки next(). Сначала… twitter.com/i/web/status/1…
13:56Не из-за того что там рекурсия, а потому что в обработчик применялся дважды, и next() всё ещё неправильно работал.
13:56Немного подустав, я подумал что лучше посмотреть как это делают другие фреймворки (реализуют next() и применяют обр… twitter.com/i/web/status/1…
13:56Решил взять его за основу, который тоже использует рекурсию, но внутри app.handle, а не сам app.handle.
13:56Реализация в Polka: github.com/lukeed/polka/b…
Реализация в tinyhttp: github.com/talentlessguy/…
13:56Параллельно с написанием нормального применения обработчиков, я начал фигачить расширения для req и res , котрые ес… twitter.com/i/web/status/1…
13:56Частично фреймворк был готов, не ломался при запуске, теперь надо было подумать где размещать доку. И я начал делат… twitter.com/i/web/status/1…
13:56Ещё я начал делать документацию со всеми описания методов и свойств App, Request и Response. Также начал писать Lea… twitter.com/i/web/status/1…
13:56Для раздачи статики сначала был использован самописный @tinyhttp/static, но оказалось что у него есть несколько баг… twitter.com/i/web/status/1…
13:56Сайт всё ещё в процессе создания, потому что нужно поправить некоторые моменты в доке, и дописать гайд. Сейчас можн… twitter.com/i/web/status/1…
13:56Теперь перейдём к тому, как начать им пользоваться. Если вы хотите использовать ESM синтаксис, то в корне проекта н… twitter.com/i/web/status/1…
14:03В остальном, работает идентично Express, за исключеним того, что настройки указываются в конструкторе App: tinyhttp.v1rtl.site/docs#settings
14:03Большинство обработчиков Express будут работать без ошибок в tinyhttp, но для того чтобы не использовать обработчик… twitter.com/i/web/status/1…
14:03Ещё рекомендую прочесть вот эту маленькую статью, если нужно пошаговое введение (а ещё там показано как правильно о… twitter.com/i/web/status/1…
14:03Из планов на будущее, нужно написать ещё больше тестов (хотя уже 72% покрытия на момент написания статьи), дописать… twitter.com/i/web/status/1…
14:03Примеры кстати есть, вот с MongoDB: github.com/talentlessguy/…, вот с GraphQL: github.com/talentlessguy/…. Есть список ка… twitter.com/i/web/status/1…
14:03tinyhttp открыт для контрибьютинга, можно предлагать свои идеи и правки, или работать над существующими issues. Сам… twitter.com/i/web/status/1…
14:03# Суббота 19 твитов
Сегодня будет довольно весёлая и интересная тема - 3D в вебе. Тема довольно популярная, но сложная. Начнём с того,… twitter.com/i/web/status/1…
13:51OpenGL - это спецификация frontend-а API для создания 2D и 3D графики. У этой спеки есть несколько реализаций - нап… twitter.com/i/web/status/1…
13:51CPU отсылает данные по которым должен происходить рендеринг графики (Rendering data), и затем GPU производит рендер… twitter.com/i/web/status/1…
13:51Вот детальная статья с разбором того как графика отрисовывается на компьютере, начиная с OpenGL, заканчивая рендеро… twitter.com/i/web/status/1…
13:51WebGL - это тоже особый стандарт, основанный на WebGL ES (Embedded Systems) 2, который предназачен специально для б… twitter.com/i/web/status/1…
13:51Управление памятью происходит в JavaScript. GLSL выполняется на GPU, используя драйвер видеокарты, как и OpenGL ES… twitter.com/i/web/status/1…
13:51Если подытожить, то чтобы делать 3D в вебе, нужно писать программы на GLSL и JavaScript. Писать шейдеры не зная тог… twitter.com/i/web/status/1…
13:51Самая популярная библиотека - THREE.js. В ней всё разбито на классы, текстуры, объекты, геометрии, освещение и т.д.… twitter.com/i/web/status/1…
13:51Помимо THREE.js существуют другие менее популярные абстракции над WebGL - Babylon.js (github.com/BabylonJS/Baby…) - JS… twitter.com/i/web/status/1…
13:51Несмотря на то, что THREE.js сильно упрощает работу с WebGL, всё ещё получается очень много кода. К тому же, его до… twitter.com/i/web/status/1…
13:51Для решения этих проблем появился react-three-fiber, React рендерер для THREE.js. С помощью react-three-fiber можно… twitter.com/i/web/status/1…
13:51react-three-fiber ничего не заменяет и не добавляет в THREE.js, а трансформиует JSX в THREE.js код. Любой код на TH… twitter.com/i/web/status/1…
13:51С r3f код выглядит гораздо чище, и на нём ещё проще писать 3D, которое легко потом внедрить в React и смешать с DOM… twitter.com/i/web/status/1…
13:51use-cannon - это r3f либа с хуками и компонентами для добавления физики в 3D, с помощью библиотеки Cannon.js. Работ… twitter.com/i/web/status/1…
13:51react-postprocessing - ещё одна r3f библиотека, которая оборачивает эффекты из либы postprocessing (… twitter.com/i/web/status/1…
13:51Сейчас демки обновляются, и проводятся работы над оптимизацией, но библиотеку можно использовать уже сейчас. Уже ес… twitter.com/i/web/status/1…
13:51Ну и напоследок react-xr - ещё один набор хуков и компонентов для создания VR/AR приложений в вебе, при помощи r3f… twitter.com/i/web/status/1…
13:51Для чего всё это? 3D имеет несколько юзкейсов по визуализации, например CAD редакторы (SketchUp), презентация товар… twitter.com/i/web/status/1…
13:51Сейчас ещё разрабатывается react-three-flex - <Flex /> компонент для THREE.js
будет ещё проще смешивать с DOM, и д… twitter.com/i/web/status/1…
17:10# Воскресенье 11 твитов
Вот и закончилась моя неделя в @jsunderhood. Подведу итоги того что рассказывал, подытожу каждый тред, подумаю в чё… twitter.com/i/web/status/1…
10:52На этой неделе как и планировалось, были треды по модульные системы, многопроцессность, легаси, tinyhttp и 3D в веб… twitter.com/i/web/status/1…
10:52С многопроцессностью произошёл провал. Я сильно плавал в теме, и у меня в голове смешались знания, не связанные ме… twitter.com/i/web/status/1…
10:52Благодарю @amel_true и других, за то что поправили во всех местах в том треде, теперь у меня больше нет путаницы в голове.
10:52Ещё было пару мелких ошибок в треде по модулям, но они произошли из-за того, что меня в то время не было в IT (я на… twitter.com/i/web/status/1…
10:52Тред по легаси получился довольно субъективным, но в целом вышло норм. Фактических ошибок не было, были только выск… twitter.com/i/web/status/1…
10:52С 3D было проще всего. Большинство определений было легко достать из статей и StackOverflow вопросов (чтобы не допу… twitter.com/i/web/status/1…
10:52Спасибо всем, кто читал мои треды, и я особенно благодарен тем, кто поправлял)
10:52Я думаю, что мне надо будет углубиться в тему многопроцессности и хайлоада, и прокачать свои знания по бекенду. Пок… twitter.com/i/web/status/1…
10:52ещё вот мой github: github.com/talentlessguy
18:14# Ссылки
github.com
- https://github.com/talentlessguy/tinyhttp
- https://github.com/react-spring/react-postprocessing
- https://github.com/talentlessguy/parsec/blob/740a0c9dd0a5776acb549e9e41e5ea9d1fb14bc5/package.json#L14
- https://github.com/rollup/rollup
- https://github.com/evanw/esbuild
- https://github.com/egoist/tsup
- https://github.com/developit/microbundle/
- https://github.com/DirtyHairy/async-mutex
- https://github.com/umuplus/mongoose-locks#motivation
- https://github.com/hapijs/hapi/issues/4111
- https://github.com/lukeed/polka
- https://github.com/atlassian/changesets
- https://github.com/talentlessguy/tinyhttp/blob/master/.github/workflows/main.yml
- https://github.com/lukeed/polka/blob/376a4d4c84f6c499bf2f2e891b24c3399b294382/packages/polka/index.js#L71
- https://github.com/talentlessguy/tinyhttp/blob/master/packages/app/src/app.ts#L51
- https://github.com/talentlessguy/tinyhttp/tree/master/examples/mongodb
- https://github.com/talentlessguy/tinyhttp/tree/master/examples/graphql
- https://github.com/BabylonJS/Babylon.js
- https://github.com/PixelsCommander/HTML-GL
- https://github.com/talentlessguy