Вы видите копию треда, сохраненную 15 ноября в 06:25.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Больше пары строк кода в посте или на скриншоте ведут в ад.
Для программирования на HTML https://codesandbox.io
Для Node.js с консолькой https://repl.it/languages/nodejs
Если рассчитываешь получить дельный ответ, сформулируй правильно вопрос: «что я хочу получить, что я для этого делаю, что я вместо этого получаю». Если/когда самостоятельно найдёшь решение — поделись в треде, мы за тебя переживаем.
Документация - https://developer.mozilla.org
Руководство для вката - https://github.com/acilsd/wrk-fet#javascript
Что там по ОРМ? Призма? Дризл? Монгус? Секвелайз?
emscripten
pg + knex (optionally)
жертва маркетологов, плиз. необоходимость использовать БД ушла с момента когда иметь 128 гб оперативки стало нормой, а капасити жестких дисков может исчислятся сотнями террабайтов. Но хитрые кабаны конечно же не хотят терять клиентов, поэтому продолжают тебе продавать оверхед в виде базы данных.
const elementId = props.view === "element" ? props.elementId : null;
И я все же советую тебе решить это разбиением компонента на 2, используяя композицию.
Я тупанул, проблема здесь не в этом. Проблема здесь в том, что в
<AttributesManager view='element' />
он не требует указывать ещё и elementId
У компонента логика обработки в зависимости от пропсов различается минимально. Делить особо смысла нет.
Не получается выставить корректно ограничения на типы пропсов.
ComponentProps1 - то как есть.
ComponentProps2 - то, что должно быть в идеале, но не работает.
>я табличками думаю
Ну так ты не программист, программисты думают массивами, списками, словарями.
>бесплатный
))) потом его купит хитрый кабан, а у тебя уже миллион зависимостей на постгрес и нужно платить этому кабану.
Что тебе мешает сделать пропс
ComponentProps1 = {
viewConfig: {view: "overall"} | {view: single, id: ElementId | ComponentId }
}
>body=document.body.innerHTML;
>body=body.replace(/зелёный/g, 'синий');
>document.body.innerHTML=body;
- работает, заменяет в большинстве случаев. Но есть 2 нюанса:
1. Иногда не "ловит" текст, который вроде бы и отображается, но в page source браузера не виден.
2. Перестаёт работать интерактив.
Вот я удалил редукс кал и код стал просто проще, а непредсказуемость не появилась.
https://jsfiddle.net/r6ufyh0q/
вся индустрия пользуется стейт менеджером, один ты бедный вкатунок не понимаешь зачем ано
>[...(function* () {
const txtNodes = document.evaluate(".//text()[normalize-space(.) != '']", document.body);
let node; while (node = txtNodes.iterateNext()) { yield node; }
})()].map(node => node.data = node.data.toUpperCase());
Надеюсь, что только ты не понял вопроса. Как исправить это? Нужно, чтобы не слетал интерактив после работы расширения чтобы корректировался весь текст, а не только видимая в source часть.
[...(function* () {
const txtNodes = document.evaluate(".//text()[normalize-space(.) != '']", document.body);
let node; while (node = txtNodes.iterateNext()) { yield node; }
})()].map(node => node.data = node.data.toUpperCase());
причина слета интеррактива в том, что назначение innerHTML ЗАНОВО пересоздает все блядь елементы на страничке.
тебе нужно все textNode перебрать и в них поменять.
там происходит вот что
xpath запрос в функции генераторе
из генератора делаем массив всех текст нодов
потом проходим по массиву и в каждой ноде меняем текст
можно без генератора, проще
{
const
xPath = document.evaluate(".//text()[normalize-space(.) != '']", document.body)
, textNodes = []
;
let node; while (node = xPath.iterateNext()) { textNodes.push(node); }
textNodes.map(node => node.data = node.data.split("").reverse().join(""));
}
а вместо xpath можно юзать
https://developer.mozilla.org/en-US/docs/Web/API/Document/createTreeWalker
1) Не ври. Редакс ты каждый раз не пишешь. Упрощения нет
2) От того что ты удалил паттерн код в простом случае стал проще, но не лучше.
Я давно видел на ютубе лекцию с Деном Абрамовым где он одной из фич редакса показывал путешетвие по истории состояний. Икать лень Код писать проще, чем искать
https://jsfiddle.net/sah934jw/
>вся индустрия
Вся индустрия занимается изображением бурной деятельности и собственной значимости, чтобы кабаныч платил зарплату. Чем больше оверинжиниренной хуйни будет в коде, тем "индустрии" лучше
Предположим ты делаешь графический редактор типа попошопа только в баузере. Там будет ебическое состояние у UI. Тебе же проше использовать паттерн глобального состяния кторое меняется акшенами.
> не понимаешь зачем ано
Чтобы сделать глобальную переменную и ни для чего больше. Я это второй день доказываю. А ты черт из ада, не умеющий какать.
>1) Не ври. Редакс ты каждый раз не пишешь. Упрощения нет
Пук.
>2) От того что ты удалил паттерн код в простом случае стал проще, но не лучше.
Пук.
>путешетвие по истории состояний
Нахуй не надо. Если нужны путешествия сделайте либу для путешествий. Вернись-ка нахуй к теме предсказуемости, черт.
Твой говнокод потерял всякий смысл. Его больше нельзя понимать с первого взгляда, че ты сделать хотел тоже хз. Дефайн предсказуемость.
Ты в упор паттерн не видишь? Я же не буду тебе адеквантный по сложности код писать, чтобы преимущества были очевидны. А я этот говнокод написал чтобы пояснить суть паттерна стейт менеджера. Сама суть: у тебя есть одно определенное место где ты коммитишь новое состояние. Туда выносится логика изменения состяния UI
> Сама суть: у тебя есть одно определенное место где ты коммитишь новое состояние.
Для этого не нужен редукс. Это просто глобальная переменная.
Глобальную переменную может любой хуй изменить в любом порядке. При сложном проекте ты не будешь знать что это за хуй и по какой логике он это делает. Поэтому ты логику выносишь в редьюсер
>Глобальную переменную может любой хуй изменить в любом порядке.
Любой хуй в любом порядке твои редюсеры будет вызывать.
>Поэтому ты логику выносишь в редьюсер
Вынес логику в класс.
>>Глобальную переменную может любой хуй изменить в любом порядке.
Смысл что редюсеров не много, а компонентов сотни.
>Вынес логику в класс.
Как угодно. Я на реакте тоже не пишу. На ангуляре у меня асинхронный стейт менеджер на rxjs
> ангуляр
> Любитель оверижиниренного кала защищает другой оверинжиниренный кал
Ну кабаныч-то платит? Это главное
Вынести состяние на бекенд на питухоне. Верстку генерировать jinja. Динамику на фронте сделать с помошью htmx
У каждого компонента может быть локальная переменная которую они откуда-то копируют. И тогда в них могут различаться значения. А если они все возьмут из одного места, то это будет предсказуемо. Потому что глобально.
>Я стейт менеджер называю
Это глобальная переменная.
Я согласен стакой формулировкой. Только вот подумай почему в vuex сделали отдельно коммит, отдельно акшен, а в комите запретили делать асинхронные запросы. Накой черт они это напридумывали? В сложном коде важна не только глобальная переменная, но и способ доступа к ней. Это часть паттерна.
А я вам объясню. Реактодебил уже наученный что глобальная переменная в реакте называется стор гуглит стор для вуе и попадает в вуекс и пинию.
Т.к. чтобы тебе нравился оператор свитч надо быть абсолютно бахнутым сумасшедшим то выбор попадает на пинию.
Глобальная реактивная переменная в вуе создаётся одной функцией export store = reactive({})
В реакте чтобы так сделать надо попердолиться а в вуе искаропки.
>>60571
Могу предположить что когда они писали блоатваре который не нужен и ничего не делает, они создали сами себе проблем и решили их так.
>часть паттерна
Этот паттерн называется глобальная переменная.
В вуе реактивные объекты под каптом. Реактивность отслеживает изменени зависимых переменнх, т. е по сути является интерфейсом доступа к реактивному состоянию. Это не просто переменная жс, доступ к которой ты вынужден сам контролировать.
«Глобальная» переменная в реакте создается с помощью useState, сторокал не нужен
А то. У любителей навернуть энтерпрайзных абстракций случается шок, когда оказывается, что жс можно использовать не наворачивая тонн их привычного говнеца, которое они притащили с собой из прошлого.
А useState это не то, о чем речь, когда ты делаешь парент компонент с огромным огромным огромным объектом состояния? Тоже самое. Только кривая лапша из useState и useEffect. Плюс в глубокие дочерние компненты надо колбеки пропихивать через пропсы, количество которых растет лавинообразно
useContext - для проброса переменной, созданной через useState
Не пизди. У нас продукт с более 300к ежедневных пользователей, стейт менеджерами не пользуемся, а из мест в которых они были выпилили. Но у нас ангуляр с DI и rxjs, поэтому можно аккуратно разбивать на сервисы и изолировать состояние, а не прибегать к глобальным переменным в виде стейта. Анон все верно говорит, проблема этих менеджеров в очень хуевой инкапсуляции, ты модешь модифицировать стейт из любого места программы и это считается нормой, поэтому и приводит к багам которые трудно дебажить и говнокоду уровня спаггети
Нет, мне проще делать один источник истины, а не пилить костыли вида "ну пусть их будет сотня, я просто сделаю глобальную переменную, которая бужет на UI отображаися после того кск вся сотня заэмитит значение"
Но источник истины ты как-то должен обновляться? Иначе какой в нем смысл? Вот ты из всех виджетов эмитишь в него значение. Заметь слов эмитишь, а не переписываешь его прямо.
У тебя есть сервис в ангуляре инкапсулирующий состояние в BehaviorSubject. Сабжект подписывается на другие измнения или в методах сервиса вызывается next(state) на сабжекте.
Бекендеры жуют мидлвары и не возмущаются. Мидлвары это не антипаттерн. Подходит для реализации Cross-cutting concerns. У тебя приложуха на экспресе. Тебе везде в каждой ручке надо авторизоваться - распарсить JWT и проверить его валидность. Это легче сделать в мидваре. Хочешь логировать запросы - в мидваре. И тп
Ты бэкендер? Зачем ты это вообще высрал? При чем здесь пайплайн мидлваров в бэкенде и работа со стейтом на фронте? В бэкенде это трансорфмация не стейта, а одного куска данных в единицу времени, например запрос к которому ты добавляешь нужные заголовки, ты не будешь потом этот запрос сохранять и получать к нему доступ из разных мест как в приложении с UI, он уйдет и на его месте появится совершенно другой запрос. В этой цепочке отсутствуют мутации уже существующего стейта, в то время как в твоем говноредаксе это норма, ты можешь по пути мутировать какой-то совсем левый стейты, ну просто потому что тебе так посчиталось удобным, в бэкенде ты просто этого делать не будешь, потому что работаешь с конкретным запросом, а не глобальным стейтом.
>Но источник истины ты как-то должен обновляться?
Да, он слушает подписывается на нужные события и обновляет стейт, это и есть инкапсуляция, принцип инверсии зависимостей, сервис знает как работать со стейтом, когда его обновлять, он дает только доступ к его чтению, его запись полностью под контролем этого сервиса.
Так не делай такого. Мидлвары для общих действий. В экспресе ты тоже можешь накосячить в реквесте как хочешь. Он не инкапсулированый как и любой обжект в жс.
Редюсер тоже знает как работать со стейтом. А стейт обновляется акшенами. Главное что мы вынесли из компонентов как источник истины не только глобальную переменную состояния но и поведение.
Ты работаешь с разными видами данных на бэкенде, у тебя на бэкенде нет UI и связанного с ним стейта. Тебе просто в голову не придет обновлять какой-то рандомный счетчик, в ответ на какое-то совсем не относящееся к нему действие, а в реакте со сторами такое сплошь и рядом, просто потому что макаке показалось это удобным в какой-то момент времени, теперь он правда уже сам не помнит почему.
>>60749
Твой редюсер это глобальная переменная которая синхронизирует чтение и запись, всё. Нет сокрытия доступа к записи, нет разделения на сервисы которые знают как и когда делать запись, все упирается в
>Главное что мы вынесли из компонентов как источник истины не только глобальную переменную состояния но и поведение.
и в
>Так не делай такого.
Т. е. в какие-то мантры вида "мы просто делаем все правильно, это же очевидно как надо делать" о чем и писалось выше, по итогу получаем нерасширяемый, неподдерживаемый код макак, которые кнопку добавлять могут месяц, а потом отлаживать связанные баги еще полгода.
Ну так мидлвары Абрамов сделал, чтобы санки запилить (redux thunks это вроде его мидлвар), а не стейт произвольно менять. Стейт меняется через акшены. Это правило. Причем здесь криворукость макаки? Я в ангуляре тоже могу запутать все стримами как паутиной, без всяких инкапсуляций.
Стейт меняется через акшены. А redux thunks с чем работает, не с акшенами? Ой, что тут у нас, неявное изменение стейта? Я не в мидлвар его изменил, это всё экшон!! Супер удобно, спасибо!
> Я в ангуляре тоже могу запутать все стримами как паутиной, без всяких инкапсуляций.
А кто тебе даст? У тебя есть строгая архитектура, у тебя нет глобального стейта и пуканья экшенами из любого места которое тебе приглянется. Это тоже хорошее отличие, без сторов и редаксов ты сразу можешь сказать "'этот чел написал хуйню", с ним ты разве что подумаешь "ну вроде это норма, все так делают", а то что чел напиал хуйню ты узнаешь только когда это до пользователей дойдет и они не по хэппи патс пойдут.
То есть ты говоришь что pushActionToGlobalStore({ actionName: "setVariable", variableName: "a", value: 1 }) вместо store.a = 1 снимает у трясунчика анальника тряску. Он сразу видит что это код серьезный и ломает что-то. Я тебя услышал. Так же как dangerouslySetInnerHTML
Ну да, другого ведь макакену не дано, он только с глобальным стейтом работать умеет, при этом если его спросить хорошо это или плохо, он скажет плохо (потому что на курсах так сказали).
Для работы со стейтом нужна архитектура, а не глобальные переменные, запомни это, сычушь. Тогда и проблем не будет из-за того что у тебя диспатчится сотня экшенов и разных мест и мутируетсяя весь стейт в разных сагах, потому что они эти экшены слушают.
Направил все зависимости в глобальный суперстейт...
>pushActionToGlobalStore({ actionName: "setVariable", variableName: "a", value: 1 })
>store.a = 1
Ты же понимаешь что направление у этих двух примеров ровно одинаковое. Разница только в том что первое это какашечка которую ты удерживаешь.
Так пыня тоже не нужна. Она не делает ничего.
А при чем здесь эти два примера, дауненок? То что ты там с кем то про разновидность глобального стейта переписывался и споришь о вкусах говна, не значит что я делал выбор в пользу какого-то из них. Я в целом сказал, что все эти редаксы-хуяксы сделаны наркоманом на коленке, который не понимает что такое правильная архитектура приложения, а также не знает базовых принципов проектирования.
>>60975
Иди книжки по архитектуре почитай, там тебе все определения дадут и разжуют.
В первом случае ты выносишь логику в редусер
Во втором случае у тебя логика изменения store.a по компотентам размазана.
Предположим у тебя в одном компоненте a+=1, а в другом a+=2 и предположим у тебя завелся баг из-за баблинга: из-за первого происходит обновление второго компонента ( ты пока об этом не знаешь, тебе тестировшик отправил баг). Ты ожидаешь a = 1, но видишь что a = 2.
В первом случе ты рыскаешь среди компонентов, ища где обновляется store.a, чтобы поставить брейкпоинт в дебагере. Ты даже не знаешь в какой последовательности одно обновление тригерит другое.
Во втором случае ты ставишь брекпоинты в редюсере везде, где обновляется store.a Ты сразу поймаешь какой акшен срабатывает первым, а какой вторым. Мало того у тебя в девтоуле реакта есть возможность в откатится по истории и повторить дебаг
Пробсдется нужно прямо при девочке в кашешке?
Вся суть макак - код строится на попытках предсказать как они будут искать баги, вместо того чтобы предотвращать их появление. При этом о фиксе даже речи не идет, потому что оба случая подразумевают "ну хуй знает, давайте таймаут в одно из мест добавим епта..."
>А при чем здесь эти два примера, дауненок?
При том что код делает заведомо одно и то же.
>не понимает что такое правильная архитектура приложения
Ты буквально не можешь дать определение. Потому что в твоем понимании архитектура это сложные названия функций, чтобы ты не трясся.
>>61014
>выносишь логику в редусер
>actionName: "setVariable"
Нет там никакой логики. Это индусский код чтобы больше строчек написать.
>чтобы поставить брейкпоинт в дебагере. Ты даже не знаешь в какой последовательности одно обновление тригерит другое.
Я могу завернуть стор в прокси объект и поставить брейкпойнт там.
ебанутся
>Нет там никакой логики. Это индусский код чтобы больше строчек написать.
Щас будем отрицать хуевость глобальных переменных?
>Я могу завернуть стор в прокси объект и поставить брейкпойнт там.
И шо? Максимум ты колстек увидишь, а логику продебажить не сможешь.
Везде пишут два критерия - если данные используются по всему приложению или после размонтирования компонента должны сохраняться, то в стор, иначе в компонент.
Допустим есть приложуха на несколько больших компонентов, которые слабо связа друг с другом. То есть первый критерий нахуй. Данные для отрисовки берут по сети каждый раз заново. Второй критерий - нахуй. Тогда что хранить в сторе вообще? глобальные настройки пользователя - но это же локалстораж, а не стор.
Или есть ещё критерии, типа сложной логики, централизации управлением и т.д.?
Как?
>Ты буквально не можешь дать определение
Я буквально дал определение выше. Ты не способен осилить, не говорю уже книгу по архитектуре, а хотя бы базовые принципы и паттерны разработки приложения, отсюда и непонимание того о чем тебе пытаются сказать. Макака увидела глобальный стейт и теперь нахваливает, потому что толпа других макак подхватила.
Изначально наркоман денчик предполагал, что тебе не нужен будет глобальный стор, так как даже он понимал, что это супер хуево. Идея вроде простая, у тебя есть хост компонент, ты в нем используешь useState и дочерним этот стейт устанавливаешь, если нужно что-то от дочернего получить, то оборачиваешь это в функцию и передаешь ее дочернему компоненту, а тот вызывает с нужными данными.
На бумаге вообще заебись, но что на практике? На практике это привело к явлению под названием пропс дриллинг, когда стейт хост компонента нужен не прямому ребенку, а ребенку-ребенка или еще ниже, в итоге ты этот стейт пробрасываешь через n детей для того чтобы использовать только в одном. Вот поэтому пришли костыли в виде редаксов и глобальных переменных (хранилищ).
Что здесь непонятного?
Сделал запрос к апи, получил список продуктов например, обработал json, конвертировал, положил в стор. Наоборот создал новый продукт - добавил в стор. Юзаешь сторонний sdk? Например телеграмовский sdk. Ты получил список каналов. Там 100500 разных полей. Тебе нужно только 5 полей. Отфильтровал, сохранил в store.
Стейт нужен когда у тебя что-то простое. Например отправляется форма. Ты ставишь isLoading true. Или у тебя какие-нибудь фильтры например. Юзер выбрал фильтр по цене и это нужно где-то фильтр сохранить.
А без стейта можно обойтись когда у тебя расчёты на лету. Допустим, тебе надо продукты сгруппировать по месяцам и выводить. Тогда можно просто делать products.map(product => ...тут делаем массивы по месяцам и выводим на фронт) не обязательно сохранять куда-то
> Щас будем отрицать хуевость глобальных переменных?
Да, в них нет ничего хуевого.
> И шо?
И задача поставить брейкпойнт в месте изменения переменной выполнена.
>Максимум ты колстек увидишь, а логику продебажить не сможешь.
Потому что ты скозал?
>>61110
> >Ты буквально не можешь дать определение
> Я буквально дал определение выше.
Не в силах пояснить за первый базворд ты пукнул вторым.
>базворд
Ну да, для селюка который первый раз книгу открыл всё что в ней написано это набор базвордов, что и требовалось доказать, типичная макака.
>Сделал запрос к апи, получил список продуктов например, обработал json, конвертировал, положил в стор.
Положил в стейт компонента, который этот список вырисовывает. Размонтировался компонент- списка нет и не надо возиться с очисткой1 стора.
>Наоборот создал новый продукт - добавил в стор.
Создал продукт - отправил запрос на бэк. Обновил список, вернув новые данные с бэка. Иначе можно добавить продукт на фронте, когда на бэке ошибка и ничего не добавилось.
Ой бля, там куча тонкостей.
А что если я хочу показывать скелетон во время загрузки?
А что если я хочу сделать пагинацию продуктов?
А что если мне надо добавлять id token к каждому запросу?
А что если мне надо кешировать список продуктов?
А что если я хочу обновлять список каждые 10 секунд?
А что если я хочу конвертировать время из апи в вид "продукт добавлен два часа назад"?
А что если мне надо обновлять подсвойство а-ля "сейчас продукт смотрят два покупателя"?
...
КОРОЧЕ!
В стейте компонента хранить можно!
Но это будет длинная лапша в стиле if (api.status === 400) {showToast('не могу получить товары!')} else {setData(transformResponse(api))}
Весь смысл стора - это убрать нахуй всю логику в редюсер. Чтобы на фронте осталась одна разметка. Я вывел только products.map() и всё.
Можно это вынести в какой-нибудь useProducts хук, но это скорее всего получится решение на коленке, ты заебёшься искать почему список продуктов ре-рендерится постоянно. Но и это тоже можно кое-как пофиксить, замемоизировав хук по самые помидоры.
В общем, ничего критичного не будет, просто некрасивое решение, с миллионом стейтов. Лучше просто взять редакс, замутить стор и редюсеры c логикой.
>Но это будет длинная лапша в стиле if (api.status === 400)
Что тебе мешает это вынести в отдельную функцию, которая о компоненте ничего не знает, но при этом умеет обрабатывать ответы?
>Что тебе мешает это вынести в отдельную функцию
Ну я же говорю в десятый раз, это будет просто 100500 маленьких утилиток смешанных с десятком стейтов. Куча мала. Можно вынести transformResponse, добавить туда setIsLoading, setData и всё прочее и всё это замемоизировать. Но решение будет говно.
Моё решение:
- Данные отдельно
- Логика отдельно
- Презентация - чистый хтмл код не засранный логикой
Твоё решение:
- Смешать логику и данные
- Посадить это всё в useEffect
- Разнести логику в миллион маленьких утилит
- Замеизировать каждый чих, иначе это будет постоянно ререндериться
Это у программистов профессиональная привычка сказать какой-нибудь базворд чтобы от него отъебались, подумали что он умный и т.д. Поэтому они их постоянно говорят.
>>61280
> А что если я хочу показывать скелетон во время загрузки?
> А что если я хочу сделать пагинацию продуктов?
> А что если мне надо добавлять id token к каждому запросу?
> А что если мне надо кешировать список продуктов?
> А что если я хочу обновлять список каждые 10 секунд?
> А что если я хочу конвертировать время из апи в вид "продукт добавлен два часа назад"?
> А что если мне надо обновлять подсвойство а-ля "сейчас продукт смотрят два покупателя"?
Это все логика или это все отображение?
Ну солид - реально баззворд. Когда ты в последний раз, крася очередную кнопку, думал: «А не нарушаю ли я принцип подстановки Барбары Лисков?»
С чего бы? Стейт менеджер не идеальная штука, но чисто по SOLIDу
SRP - делегируешь логику стейта из компонента в стейт менеджер. Компонент отвечает только за функцию отображения
DIP - Компонет не зависит от стейт менеджера, только от его интерфейса. Стейт менеджер легко заменить например на инстанс для юнит тестирования.
OCP - Норвую логику ты добавляешь в стейт менеждер, а в компотненты только акшен. Таким образом у тебя код расширяется не приводя к модификации (существенной) частей завищих от этого кода
>Компонент отвечает только за функцию отображения
А диспатчить ты ничего не будешь? Было бы так, если бы ты только брал данные, но у тебя компонент помимо того что напрямую их мутирует еще и свой стейт может создать, отсюда противоречие:
>делегируешь логику стейта из компонента в стейт менеджер
Даже в треде появился человек, который не понимает где у него стейт должен быть, сразу пошли какие-то разнотолки уровня "да это же очевидно епту", нет, чел, это не очевидно, потому что SRP нарушен. В компоненте он нарушен потому что компонент может как держать свой стейт, так и изменять глобальный стейт в стейт менеджере. В стейт менеджере он нарушен потому что стейт не только там хранится, но и меняется, при этом что такое стейт? Это стейт какого-то одного компонента? С твоих слов выглядит так, но на деле это глобальный стейт и не только компонентов, а вообще всего что душе угодно, любое место может пукнуть в этот стейт, а он должен знать как его сохранять и обрабатывать, где ты тут SRP видишь? Тут n ответственностей, где n это количество пукающих в твой стейт менеджер ака глобальную переменную.
>только от его интерфейса
Что ты несешь, полоумный, какой это интерфейс когда ты создаешь редюсеры, сторы, селекторы, а потом их напрямую импортишь и используешь также напрямую через диспатч. Нет никакой абстракции от этого стора и всей цепочки его зависимостей, DI это инверсия зависимостей, когда источник данных имплементирует интерфейс который задает ему компонент, т. е. интерфейс должен быть на стороне компонента, имплементация на стороне стора, в случае со стором интерфейс и имплементация полностью задаются на его стороне, компонент полностью зависит от стора, нет никакого DI.
>OCP - Норвую логику ты добавляешь в стейт менеждер, а в компотненты только акшен
>только акшен
Ну т. е. всё таки не клозед? Всё таки открыть надо? Еще и подебажить, пару костылей вставить в компонент. И почему у тебя новая логика в стейт менеджер добавляется, у него же SRP, какая нахуй логика компонент? Ах, да, ну это не только стейт, это еще всякая бизнес логика, а также юай логика, удобно когда все в одном месте! OCP это когда при добавлении новой логики ты не меняешь старый компонент, а добавляешь новый компонент расширяя старый (наследование), либо используя его в новом компоненте (композиция).
>Компонент отвечает только за функцию отображения
А диспатчить ты ничего не будешь? Было бы так, если бы ты только брал данные, но у тебя компонент помимо того что напрямую их мутирует еще и свой стейт может создать, отсюда противоречие:
>делегируешь логику стейта из компонента в стейт менеджер
Даже в треде появился человек, который не понимает где у него стейт должен быть, сразу пошли какие-то разнотолки уровня "да это же очевидно епту", нет, чел, это не очевидно, потому что SRP нарушен. В компоненте он нарушен потому что компонент может как держать свой стейт, так и изменять глобальный стейт в стейт менеджере. В стейт менеджере он нарушен потому что стейт не только там хранится, но и меняется, при этом что такое стейт? Это стейт какого-то одного компонента? С твоих слов выглядит так, но на деле это глобальный стейт и не только компонентов, а вообще всего что душе угодно, любое место может пукнуть в этот стейт, а он должен знать как его сохранять и обрабатывать, где ты тут SRP видишь? Тут n ответственностей, где n это количество пукающих в твой стейт менеджер ака глобальную переменную.
>только от его интерфейса
Что ты несешь, полоумный, какой это интерфейс когда ты создаешь редюсеры, сторы, селекторы, а потом их напрямую импортишь и используешь также напрямую через диспатч. Нет никакой абстракции от этого стора и всей цепочки его зависимостей, DI это инверсия зависимостей, когда источник данных имплементирует интерфейс который задает ему компонент, т. е. интерфейс должен быть на стороне компонента, имплементация на стороне стора, в случае со стором интерфейс и имплементация полностью задаются на его стороне, компонент полностью зависит от стора, нет никакого DI.
>OCP - Норвую логику ты добавляешь в стейт менеждер, а в компотненты только акшен
>только акшен
Ну т. е. всё таки не клозед? Всё таки открыть надо? Еще и подебажить, пару костылей вставить в компонент. И почему у тебя новая логика в стейт менеджер добавляется, у него же SRP, какая нахуй логика компонент? Ах, да, ну это не только стейт, это еще всякая бизнес логика, а также юай логика, удобно когда все в одном месте! OCP это когда при добавлении новой логики ты не меняешь старый компонент, а добавляешь новый компонент расширяя старый (наследование), либо используя его в новом компоненте (композиция).
Да солид это не 9 заповедей.
1) Инпуты буду диспатчить. Инпуты это часть ответственносити UI. А отправка запроса, обработка данных, другая логика - нет
2) Кто тебе мешает интерфей выделить Если помнишь в тайпскрипте структурная типизация. Компонент от этой лабуды не зависит. Это чистая функция с аргументам в виде пропсов. Ты ее можешь из отдельно файла импортировать в файл компонента и в файл теста.
3) Покажи использование OCP где ничего не редактируется. Не надо так глупо трактовать этот принцип. Может только где нибудь спринге ты в хмл конфиге новую зависимоль прописываешь и она подхватывается и что-то там меняет в контейнере. В общем слуае OCP такого не требует. Вот если бы ты размазал логику по нескольким компонентам и каждое изменение затрагивало несколько компонентов, то тогда это нарушение OCP. В простм случает ты добавляешь в редьюсере в свитч еще один бранч с акшеном и обавляешь акшены в компоненты, а не лопатишь их логику useEffect по всем компонентам.
И да ты заебал. Я фулстек на ангуляре. На реакте я не пишу давно мне на него насрасрать в высокой колокольни.
почитал ваш срачь
нахуй вас и фронтенд ваш
ебанутые
лучше пойду токарем на завод
чем поеду кукухой как вы
залетный? т.е. завсегдатай сосача > завсегдатая вкудахте/пикабу? ухахаха
вкатился тебе за щеку, пес.
труЪ пацаны делают лаве и прут тяночек. неважно, чем занимаешься по жизни при этом - точишь детальки или фронтенд пилишь.
никчемные мудачьки спорят о какой то хуете по двое суток, на кой то хер доказывая свою правоту такому же еблану. холиварить - удел бездельников диванных. для всех остальных без задач.
пиздуй кнопочьки рисовать дедлайн горит, а то уволят и наймут индуса на твое место.
Нарисовал на схеме. Если переменная относится к контенту и хедер про неё ничего не знает тогда оставляй там. Если это например юзер (ты) который и в хедере и в контенте, то он глобальный.
Вся суть в том, что нужен один прокси-объект для любых вызовов. Делаю что-то вроде жиквери-хуйни.
ну тогда тебе пизда, потому что жс динамикодрися
Обкручивай то что передаешь в классы, а не передавай в свое апи жс примитивы. Ты можешь раздеть сущности
1) апи что принимает обект и делает полезнуб работу
2) конструкторы обектов, теги для строк возвращаюшие обекты
Кому нужен? Чем пользователю будет удобней иметь одну функцию которая может использоваться как тэг и просто как функция, вместо двух функций одну с суффиксом tag другую без него?
Тем что он по коду сможет найти место с тегами и место без. В целом код будет читаться лучше, когнитивная нагрузка меньше. Буквально такая же проблема как у того кто это говно сделал - непонятно как отличать. Поэтому чтобы этой проблемы не было, нужно разделять на функцию-тег и просто функцию.
Все нормальные популярные библиотеки проверяют так:
if (!Array.isArray(parts.raw) || !Object.isFrozen(parts.raw)) {
throw new InvalidInputError('Function must be called as a template literal.');
}
где parts это первый аргумент твоей функции (TemplateStringsArray)
понил! неплохо
Знаю что один хуй ничего не найду, но не сидеть же без дела. Давайте думать блять, подсказывайте.
Прежде всего ты знаешь, что:
> когда из требований кабанчика было знание html и css
- это не правда. Пару лет назад вкат был таким же тяжелым. Вкат был легким до 19г. А сейчас все: Ии, школота с уников и АйТи пузырь который лопнет. Вкат закрыт. Au revoir
Расскажи про макротаски и микротаски и в чём их различие. Стандартный вопрос на собесе.
Макротасков нет, их тасками обычными называют (слово макротаски вроде разрабы ангуляра используют), слово микротаски в стандарте есть (лень там искать). В доке мозилы https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide/In_depth
мимо
Как ты вообще до этого дошел?
>When greetUser() calls localGreeting(), another context is created to run that function. When this function returns, the context for localGreeting() is removed from the execution stack and destroyed.
Ты это понимаешь? Я английский очень долго дрочил я нихуя не понимаю. Что такое this и что такое that?
Шо там понимать челлл
let user = 'Вася'
function greetUser(word) {
__function localGreeting(delimeter) {
____console.log(word + delimiter + user)
__}
__localGreeting(', ')
}
greetUser('Здарова')
// Здарова, Вася
1. Сначала на полочку кладется контекст 1, назовем его GLOBAL.
В нем объявляются 2 переменные, GLOBAL.user и GLOBAL.greetUser.
Потом вызывается greetUser.
2. Создается контекст 2 и кладется сверху на полочку, назовем его GREET_USER
В нем объявляется 2 переменные, GREET_USER.word и GREET_USER.localGreeting
Потом вызывается localGreeting.
3. Создается контекст 3 и еще раз кладется сверху на полочку, назовем его LOCAL_GREETING
У этого контекста объявлена 1 локальная переменная, LOCAL_GREETING.delimiter.
Код этого контекста выполняется по порядку, и сначала ему нужно получить некие переменные word, delimiter, user.
Окей, он смотрит, delimiter - локальная переменная, равная ', '. Берет ее.
Локальной переменной word нет, он проваливается вниз по полочке, где лежат наши контексты, и находит ее там. Это штука, равная 'Здарова'.
Локальной переменной user тоже нет, он проваливается вниз в "родительский" контекст, там тоже нет user. Идет еще ниже - и наконец находит там юзера, равного 'Вася'.
Все, у контекста LOCAL_GREETING есть все переменные. Он делает консоль лог и грохает сам себя.
Контекст GREET_USER тоже все сделал, и грохает сам себя.
И наконец контекст GLOBAL тоже.
Когда GLOBAL себя грохнул, движок V8 получает ивент, мол, полочка пустая. У этого ивента калбек - посмотреть, нет ли микротасок в евент залупе. Если есть - кладет первую в очереди опять на полочку.
Шо там понимать челлл
let user = 'Вася'
function greetUser(word) {
__function localGreeting(delimeter) {
____console.log(word + delimiter + user)
__}
__localGreeting(', ')
}
greetUser('Здарова')
// Здарова, Вася
1. Сначала на полочку кладется контекст 1, назовем его GLOBAL.
В нем объявляются 2 переменные, GLOBAL.user и GLOBAL.greetUser.
Потом вызывается greetUser.
2. Создается контекст 2 и кладется сверху на полочку, назовем его GREET_USER
В нем объявляется 2 переменные, GREET_USER.word и GREET_USER.localGreeting
Потом вызывается localGreeting.
3. Создается контекст 3 и еще раз кладется сверху на полочку, назовем его LOCAL_GREETING
У этого контекста объявлена 1 локальная переменная, LOCAL_GREETING.delimiter.
Код этого контекста выполняется по порядку, и сначала ему нужно получить некие переменные word, delimiter, user.
Окей, он смотрит, delimiter - локальная переменная, равная ', '. Берет ее.
Локальной переменной word нет, он проваливается вниз по полочке, где лежат наши контексты, и находит ее там. Это штука, равная 'Здарова'.
Локальной переменной user тоже нет, он проваливается вниз в "родительский" контекст, там тоже нет user. Идет еще ниже - и наконец находит там юзера, равного 'Вася'.
Все, у контекста LOCAL_GREETING есть все переменные. Он делает консоль лог и грохает сам себя.
Контекст GREET_USER тоже все сделал, и грохает сам себя.
И наконец контекст GLOBAL тоже.
Когда GLOBAL себя грохнул, движок V8 получает ивент, мол, полочка пустая. У этого ивента калбек - посмотреть, нет ли микротасок в евент залупе. Если есть - кладет первую в очереди опять на полочку.
>макротаски и микротаски
Отвечаю:
- Я досконально изучил движок JavaScript и фактически перенял его принцип работы, и планирую руководствоваться им на рабочем месте.
Middle+ JavaScript Developer
>Кантор
Кто такой этот Кантор и каков его вес за пределами ру сектора? Почему на него шликают в ру?
не нравится кантор, есть mdn. не нравится mdn наслаждайся ECMAScript® 2025 Language Specification
Потому что где-то функция вернула undefined.
Перечисленный тобой стек это самая база для фуллстека, с точно таким же и работаю. Хз как сейчас выкатиться не рисуя 3 года опыта. Может через стажёрство в крупных компаниях.
Не узнал свою?
transform: scale(0.25)
Ты долбоеб?
>>64571
Почему девопсы? По-моему самые пидорасы это не только про специализацию, а ещё и про стек. Повышенное количество пидорасов наблюдается в датасаенсе и машинлёрнинге, среди бекендеров на руби и немейнстрмных языках (скала, эликсир, раст...), среди мобильных разрабов, особенно когда пишут под ios.
потому что везде, где я был девопсы были чсвшными красноглазыми чмошниками, которые ставят себя выше других только потому, что знают наизусть команду как посмотреть логи сервиса systemd и умеют тыкаться в гуй кубернетеса или его заменителя.
graphql это залупа из фейсбука для умственно отсталых, фронтов, да. Какая еще книга?
ооо, дай угадаю, наверное ты тот самый человек, который топит за ангуляр и ненавидит реакт?
Чини детектор
Зачем тебе это неюзабельное неудобное говнище? Разработчики в последние годы всё больше отказываются от использования этой мертворождённой технологии.
Но ведь гкл внатуре говно.
Вообще много васьков с завода свою жизнь тратят на изучение хуйни типа setinterval и как он в ивент залупе паткапотом работает? Хули им еще надо? Какие то реакт, редакс, флякс, хуякс, коммерческий опыт блядь, нест, гит, базы данных, проекты блядь резюме. Я бля 8-9 месяцев на изучение этой хуйни потратил, извольте на сРАБотку взять и за ручку первые полгода-год провести, очко у ваших ждунов илитариев от этого не выпадет. Капец кабаньё охуело, ебаный срыночек
таблетки
Если ты по наитию красишь кнопки так, что все девки текут, то бесспорно.
Суть такова, что есть например 55к строк js-кода, которые работают на сайте. И дрочиться выискивать одну переменную, особенно если её ещё шифруют всякими криптоалгоритмами постоянно оче тяжко, а если весь этот прикол еще обфусицирован, это вообще финиш.
Есть такая фича можно вставить лог на переменную и при запуске скрипта получить все значения, но опять же это геморно. Не понятно почему до сих пор нет ничего чтобы логировало все значения переменных и вставляло значения в код закоментированными.
Или например вообще имба была бы если бы запускал какой-то кусок например логина на сайт и вот из кода 55к строк на выходе было бы закоменченно всё что не работало при входе на сайт. Это была бы сказка, как бы сузилась область поиска.
Где вообще искать нечто подобное если стандартные средства хрома куцые для таких задач?
https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures-v8/learn-intermediate-oop-by-building-a-platformer-game/step-80
Быть помидором, т.е. уметь что-либо серьезное помимо верстки кнопок.
Ну я знаю что такое сентри.
Но ты ведь тогда спросишь что такое grub, я скажу что такое grub, ты спросишь в чём разница между setImmediate и process.nextTick, я отвечу, ты спросишь, как называлось дефолтное событие внутри v-modal до третьего Vue, я отвечу, ты спросишь разницу между __proto__ и [[proto]].
Это называется "зажрались". Это hr-вариант поиска принца на белом нуксте.
Да просто грех не потроллить мудаков, которые отбрасывают кандидатов из-за sentri, которая учится в обеденный перерыв.
>ты спросишь в чём разница между setImmediate и process.nextTick, я отвечу, ты спросишь, как называлось дефолтное событие внутри v-modal до третьего Vue, я отвечу, ты спросишь разницу между __proto__ и [[proto]].
Нет, я спрошу как бы ты строил архитектуру нового фронтового сервиса и что бы делал, что бы он не падал.
Так причем тут учится/не учится? Мне похуй, даже если чел ниразу в жизни им не пользовался, главное что он должен знать, как отлавливать ошибки на фронте раньше того, как их тебе принесет разъяренный продакт или вторая линия техсапа.
Ну обмажься тайпскриптом, юнит-тестами и штатом тестировщиков.
Но в достаточно сложной системе достаточно редкие логические ошибки не отловить никак, только десятками лет и миллионами юзеров.
Если бы да кабы. Тупорылый токсик, плез
>Ну обмажься тайпскриптом, юнит-тестами и штатом тестировщиков.
Одним тайпскриптом и тестированием сыт не будешь. Что будешь делать, когда на этапе тестирования проблему не выявили, на момент релиза все работало, а потом спустя несколько часов неожиданно полегло? Как от такого будешь защищаться?
>>66374
Я с нуля никогда фронтенд не учил. Планировал изначально вкатываться в эмбед, т.к. имею образование по специальности электроника.
>>66292
>воспроизводить в тесте
А вот не воспроизводится. Что будешь делать?
>Откат
Ну это да, откатили релиз, нашли проблемный код, починили. Как сделать так, что бы минимизировать вероятность такого факапа в будущем?
>а потом спустя несколько часов неожиданно полегло? Как от такого будешь защищаться?
Никак, лол. Разбудить среди ночи программиста-удалёнщика и пусть решает проблему на месте либо советует делать откат.
У меня пет-проект на ноде как-то выдал ошибку спустя почти 10 лет. Интересно, что я считал такую ошибку невозможной и поставил guard expression чисто для красоты. И вот эта строчка сидела без дела 10 лет, а потом хуяк и сработала.
>Как сделать так, что бы минимизировать вероятность такого факапа в будущем?
Ты как будто ждёшь волшебного слова, типа "юзай Sentry Pro+ Unlimited". На самом деле тут техпроцесс нужен по особому организованный.
Как в аэрокосмической отрасли: многоступенчатость проверок и проверки проверок. Кросс-ревью кодеров, затем ревью техлида, потом тестовый сервер, потом частичный накат на прод, потом прод. Сбор юзерских отзывов.
Делали так на сайте с историей в 20 лет и миллионной аудиторией, на моей памяти не падали.
Включил сегодня утром ноут и, не обновляя открытую страницу, наткнулся на такой баг, который возможен только если бы обнулилось значение одной из ранее заданных в замыкании переменных.
Что значит сервиса? Ты охуел? Чтобы "сервис" не падал, существуют SRE и девопсы. Схуяли я должен выполнять их работу? Фронтенд это блядь сбилженная статика либо обыкновенный SSR в ноде. А архитектура на фронте это долбоебизм откровенный, ты же про всякие feature sliced design? Это вредное говно. На фронте достаточно грамотной и логичной структуры проекта и следование бест практисам фреймворков/библиотек, например про правильное размещение стейта в реакте - локальный/глобальный стейт и т.д.
Я фронтендер сеньор, 7 лет опыта, могу ещё писать бекенд на ноде и го (не на уровне сеньора, конечно, но микросервисы умею), скоро буду искать работу, планировал назвать такие цифры: от 300 минимум, 400 в идеале, думаю 400 найду в итоге. Но у меня перерыв в работе, я довольно долго уже не работаю. Если бы не это, я бы говорил от 400 минимум, или вообще валютную удалёнку искал на $5к и выше.
Как бы ты учил фронтенд в 2024 с почти нуля?
>А эти нет.
В твою помойку и не собирался проходить. Sentry в любой нормальной контoре юзают, ErrorBoundary в реакте и т.д., а ты несёшь хуйню про архитектуру фронтенд сервиса. Какие сотрудники, такая и компания, я от таких мест держусь подальше.
Почему фичи TS тупо не сделают новым стандартом типа ES7? Я нафаня, мне такое не особо стыдно спрашивать.
Почему питону без типов нормально? Вот потому же. JS кроме прочего должен оставаться достаточно простым в своей основе, чтобы несложные вещи можно было писать без дрочения интерфейсов.
Вообще, TS своими бесконечными объявлениями мне всё больше напоминает печально известный язык Java. Ещё немного, и у тайпскрипта появится своя Scala и свой Kotlin, кек.
Хочешь чтобы сайты еще больше тормозили? Суть исключений это выбрасывание вычислений в унитаз.
myFunc
("my string")
то я могу быть уверенным, что это сработает на всех браузерах? это часть стандарта, или есть шанс, что какой-то интерпретатор поставит ; после myFunc?
Да ты бы и собаку обоссал
Не можешь. В любом случае, твой код пройдет через компилятор и минификатор, который будет решать, как это интерпретировать.
Пробуй. Саспенс в рякте полностью вокруг выкидывания организован и работает отлично.
>Чем вам нравится JS?
Очень совренменный, простой, с хорошими либами (включая встроаенные и npm) язык. Максимум чего не хватает - нормального многопотока.
Если до минификации код работал, а после - нет, то грош цена этому минификатору.
Нравится тем, что смог в него самостоятельно въехать и освоить. До этого покупал книги по разновидностям Си, и они меня от программирования только отталкивали. Я просыпался ночами в холодном поту и бормотал: public static final constexpr override reinterpret_cast.
Тайпскрипт больше напоосинает сишарп. Потому что, сюрприз, у них один создатель.
А в голанге пердолятся с мьютексами? Или в C#, джаве, скале? Не особо. В го к примеру почти всегда каналы юзаются. Я вот как и автор поста на который ты ответил тоже больше всего хочу чтобы в жс был нормальный многопоток. Потому что заебало писать отдельные микросервисы на другом языке, мне на жс/тс намного больше всех остальных языков нравится, в идеале хотел бы писать только на нём. И на самом деле далеко на все хайлоадные сервисы необходимо писать на другом языке, большой поток http запросов обрабатываются легко и с низкой задержкой, в этом жс на голову выше остальных скриптовых языков и не так уж сильно хуже джавы/дотнета/го, но с CPU bound тасками случается некоторое дерьмо, которое лучше будет обработать сервисом на голане или даже расте.
Стоит уже, хочется полноценную ide. Сидел бы в студии, но она не поддерживает вложенные стили
Че за "полноценная ide"? В джетбрейнс-говнище можно только полноценно трахаться с чисткой кэша и перезапуском
Да, это был 2010, кажется, год.
Что-то у меня уже жопа горит от вашего веба. Всё, что мне нужно это открыть веб страницу, на которой запустится скрипт на ts, и мне его нужно как-то отладить. Так я не могу! Я не могу в script указать ts в качестве src, только js, в итоге отлаживать получается только уже скомпилированный сука кода.
Впрочем сейчас наконец получилось все завести. Правда в изначальном проекте, который создал webstorm, у script был аттрибут type="module" и с ним почему-то нихуя не работало, CORS выдавал ошибку. В интернете советовали использовать liveserver, но с ним не работала уже отладка в вс коде.
А с какой стати браузеры должны уметь новейшее js-говно? Компилируй в es5-бандлы и не выёбывайся.
В смысле не поддерживает вложенные стили? Не подсвечивает синтаксис? Звучит как бред. У меня и в дефолтной теме подсвечивает, и в любых других.
Ругается на ошибку, и при автоформатировании выравнивает все стили по левому краю.
https://developercommunity.visualstudio.com/t/Support-native-CSS-Nesting-in-Text-Edito/10454267
Хз, у меня нету никаких ошибок, а встроенное в вскод форматирование я за 5+ лет никогда не юзал. Все используют prettier + stylelint.
Последняя нормальная студия была в 2008, прекрати насиловать стюардессу
А с какой стати браузеры должны корсами ебать мозги? Просто собирай сингл пейдж шетемеле со всеми стилями и скриптами и распространяй через локалку!
Попущенный крестовичок, например.
(function blabla1(){
//ничего не возвращается из функции
})(document, window, "yandex_metrika_callbacks");
Дайте, кто-нибудь, названия книг по js, чтобы полностью разобраться во всем этом ужасе.
IIFE
Функция создалась на коленке, функция вызвалась, другой код дёргать функцию больше не может.
>Как работает код, что ниже?
Обычная самовызывающаяся функция, притом странная какая-то нотация. "blabla1" вообще ни на что не влияет и нигде не остаётся, они могли бы назвать функцию "переходитеНаПродуктыЯндекса". Само слово "function" тоже не нужно, видимо сделано для поддержки IE7.
А вообще, самовызывающиеся функции традиционно используются в JS, когда надо на ровном месте создать изолированный блок, чтобы там сделать что-то, не захламляя окружение переменными. Сам на днях писал пикрил.
>А вообще, самовызывающиеся функции традиционно используются в JS, когда надо на ровном месте создать изолированный блок, чтобы там сделать что-то, не захламляя окружение переменными
А для такого надо использовать ключевое слово let или var?
Мы вам перезвоним
Без разницы, функция инкапсулирует и то, и другое.
Он шуткует, конечно, но доля правды в этом есть - код со словом function выглядит малость устаревшим, с тех пор как распространились стрелочные функции
ИЕ 8 не поддерживает стрелочные функции. Вкатун косил под олдфага но был пойман за руку как дешёвка.
Что из этого лучше учить?
>Что быстрее: React или Vue?
И на том и на другом можно написать как быстрый, так и медленный код.
> Где можно нормальные бенчмарки посмотреть
Таких нет, потому что никто не будет писать нормальный проект на разных фреймворках для прогона бенчмарков.
>Что из этого лучше учить?
Зависит от твоих целей.
Что ты несешь, наркоман, какие вставки. Веб-фреймворки никак не влияют на скорость кода
У нас ещё комичный случай был, когда "лид" всех заставлял пользоваться его самописным "скоростным" фреймворком на обсерверах. А потом выяснилось, что это жутко медленная параша.
Эх, были времена. Этот лид ещё постоянно выбирал какая музыка будет играть в офисе.
Даже здесь понятно, что проблема не в фреймворке
>синтетика
на то и синтетика
https://krausest.github.io/js-framework-benchmark/2024/table_chrome_128.0.6613.86.html
мимо
>https://krausest.github.io/js-framework-benchmark/2024/table_chrome_128.0.6613.86.html
Впервые за 10 лет мне пришлось вспомнить, что шифт+скрол = горизонтальный скрол. Пиздец.
В качественном коде обычно принято объявлять функции на верхнем уровне вложенности через function, например объявлять реакт компоненты.
Создаётся впечатление, что знать JS - это как иметь подтянутую попку: тебя всегда пытаются склонить к какому-то непотребству, в данном случае к перекраске кнопочек.
Но ведь покраска кнопок это охуенно, красишь не включая мозг и сотыги капают
Как можно работать недоучкой? Ведь нода постоянно озабочена синхронизацией фич с браузером.
Ну если у тебя проект по удалению-вставке строк в огромной таблице, то да, Vue значительно быстрее.
Мы вам перезвоним если скажете где в браузере коммонжс модули, а где в ноде дом апи и почему в ноде долго фетча не было, хотя в8 был. В8 это не все, у ноды даже свой ивент луп на libuv
В питоне это просто input, в обычном js я бы написал функцию с параметрами. В ноде я нагуглил только через readline, что выглядит как сущий пиздец, столько делать ради получения двух строк.
От какого компьютера, наркоман, от пользователя?
1) Напиши один файл с функцией ввода и рекварь его
2) Импортируй данные из jsonфайла
3) Используй готовую библиотеку
4) Выполняй в браузере. Там из коробки есть prompt("Введите чесло")
Ну а если я, к примеру, делаю задание на стажировку (пикрил), и там для решения доступно просто одно окно с нодой?
Читай в правилах к твоему литкоду. Во всех этих лидкодах в правилах объяснено откуда брать инпут, куда срать оутпут и куда писать коды.
>где в браузере коммонжс модули
Напомни, кто от кого отстаёт?
>фетча не было
Нинужно ведь есть пиздатый http модуль.
Очередное популярное в твиттере говно
IE, VBScript + ActiveX — наше всё.
Максимальная соя для нетакусиков.
>одна бабка сказала...
>на заборе написано...
И? Мейнстрим редко идет по разумному пути. Если и приходит на него, то не сразу. HTML over Websockets существует уже несколько лет.
>разобрались как переменную объявить-то?
В сигнатуре функций, естественно. Самый экономный вариант. А чтобы какой-нибудь дурак не передал лишние параметры, я пишу $ в начале.
Есть кнопка на html, при клике на нее открывается форма для редактирования информации.
Я хочу сделать так:
Клик по кнопке => js отправляет fetch на сервер, чтобы тот ответил, аутентифицирован пользователь или нет.
Сервер отвечает, что пользователь не аутентифицирован (например, нет валидного jwt токена в куке). js показывает div с формой для пароля. Ничего не проверяет. Сервер принимает пароль, проводит аутентификацию, ставит куки. И так по кругу. Норм тема такого общения js и сервера?
Как $ мешает передавать лишние параметры?
Обсуждения почитай, дегрод, там дуракам объяснили почему такие изменения больше вредят, чем помогают.
Норм. Делай.
Только он и актуален, все остальное - легаси
Недавно наткнулся в реддите на вопрос MERN vs spring boot, где выяснилось что оказывается мерн по сути node js этот мем стек для впаривания курсов вкатунам. Продакт бэк это спринг
Да нода это кал для бэка. Подходит только для минимального MVP, норм продукты пилят на плюсах/расте/джаве/го.
https://relevant.software/blog/big-companies-that-use-node-js-and-why-they-do-that/
Top 10 Global Companies Using Node.js for Backend
1. PayPal
2. Uber
3. LinkedIn
4. eBay
5. Netflix
6. Trello
7. NASA
8. Twitter
9. Walmart
10. Groupon
Мне не совсем вот понятно, а почему в Ноде такое внимание уделяется стримам?
Всё завязано на них, всё крутится вокруг них и всё такое. Файл прочитать это поток, входящий хттп запрос это поток и т.д.
Но по сути, ведь в других языках то же самое? Я ещё знаю Питон и Баш. И в них по идее, то же самое происходит.
Пайпы в Баше это стримы. cat, ">" это тоже стримы. В Питоне наверное тоже самое под капотом.
Но почему-то такого внимания потокам не уделяется. Просто эти потоки используются где-то внутри и всё. А в Ноде на каждом шагу жужжат про потоки и все АПИ завязаны на явном использовании потоков.
Я чего-то не понимаю или почему так?
Есть компонент на Реакте(назовем его компонент А), который использует другой компонент(назовем его компонент В) и возвращает коллекцию компонентов В.
Как сделать так, чтобы можно было передавать джейсонину в А, которая просто рендерила бы компонеты В из данных, которыей ей прилетели?
И как в Реакте передавать параметры из url?
Например, у нас есть url /api/v3/recipes/crepes/42342342
Я хочу, чтобы в компонент передавались параметры crepes и id. Т.е. грубо говоря, чтобы компонент понимал, что надо брать искать рецепт блина с таким-то id.
Какие библиотеки нужно использовать?
Еще более абстрактно написал бы, чтобы тебе точно никто не захотел помогать.
>Я чего-то не понимаю или почему так?
В ноде всё бьётся на чанки, чтобы не блокировать слишком долго поток выполенения.
>также как и нодобояре. Хуево.
Хз с чего ты это взял, я нодобоярин и поживаю лучше чем когда-либо.
>Например? Какой норм продукт написан на наоде?
Betboom, например. Лучший букмекер, популярный, работающий на много стран, с тир 1 продуктом по качеству. Топ-2 и топ-3 буки Winline и Pari тоже на ноде. Или бекенд Делимобиля, часть Яндекс Лавки и Яндекс Карт, Банки.ру, Сравни.ру, Леруа, в Тбанке несколько внутренних продуктов на ноде. В крипте вообще бесчисленное множество проектов, например p2p.org / Lido (крупнейший ETH стейкинг).
>Есть компонент на Реакте(назовем его компонент А), который использует другой компонент(назовем его компонент В) и возвращает коллекцию компонентов В.
>Как сделать так, чтобы можно было передавать джейсонину в А, которая просто рендерила бы компонеты В из данных, которыей ей прилетели?
https://react.dev/learn/rendering-lists
>И как в Реакте передавать параметры из url? Например, у нас есть url /api/v3/recipes/crepes/42342342 Я хочу, чтобы в компонент передавались параметры crepes и id. Т.е. грубо говоря, чтобы компонент понимал, что надо брать искать рецепт блина с таким-то id.
Тебе походу нужен клиентский роутинг
https://tanstack.com/router/latest
https://reactrouter.com/en/main
>И как в Реакте передавать параметры из url?
В чистом реакте - никак ёпт. Но есть фреймворки на базе рякта, которые это предоставляют.
https://nextjs.org/docs/app/api-reference/functions/use-search-params
https://remix.run/docs/en/main/hooks/use-search-params
>Как сделать так, чтобы можно было передавать джейсонину в А, которая просто рендерила бы компонеты В из данных, которыей ей прилетели?
Напрямую передавать джейсонину - это быдлокод. Надо отделять логику от презентации. У тебя должен быть отдельный хук который скачивает данные, а в компонент уже передаёшься обработанный объект. Короче устанавливаешь redux-toolkit, создаёшь createApi, вот пример как это делается https://www.youtube.com/watch?v=2hTkVEmhQZk
Чел не слушай предыдущие посты, просто поставь next.js.
Создаешь файл
/src/pages/recipes/crepes/[id].jsx
Это твой компонент-страница, который рендерится, если зайти по адресу https://site.com/recipes/crepes/golubci-s-govnom-1297341874
Дальше пишешь в нем getServerSideProps
https://nextjs.org/docs/pages/api-reference/functions/get-server-side-props
Получаешь params.id - это golubci-s-govnom-1292349237423
И там дергаешь свой /api/v3/..., возвращаешь данные в ретюрне, они пойдут в рядом лежающий export default Page
В компоненте Page считываешь эти данные и успех.
Или лучше SvelteKit, реакт это кал.
По сравнению с чем? По сравнению с другими скриптовыми/интерпретируемыми языками (пхп, питон, руби) лучше перформанс, часто намного лучше, со многих сторон сам язык (тайпскрипт) лучше, конкуренция относительно небольшая, крайне часто используется в крипте, которая лично мне очень интересна, да и зарплаты тут ощутимо выше. У вышеперечисленных языков плюс по-моему только один, больше инструментов в экосистеме, но в последние годы это уже не так актуально. По сравнению с го, джавой, дотнетом, плюсами, растом нода лучше скоростью разработки и опять же как язык тайпскрипт превосходит все перечисленные кроме раста и сишарпа, но у них с тайпскриптом один создатель. В целом для бекенда дотнет крутое решение, высокий перформанс, стабильность, скорость разработки нормальная. Похожая ситуация в го, но сам язык ограниченный, в этом есть и плюсы, и минусы. В моём представлении одно из лучших решений для крупных проектов это микросервисы, где большинство на ноде, а микросервисы с повышенной нагрузкой написаны на го или если там совсем жёсткая числодробилка то на расте. Но в моём опыте за 7 лет в крупных проектах перформанса ноды не хватало совсем редко и это было именно из-за CPU bound задач, и писать на тайпскрипте намного приятнее, чем на го или расте, тем более на расте хуй найдёшь работу, так что для меня нода на бекенде это топ выбор.
Дядя скуф, выпейте таблетки от склероза. Слово "юзверь" упоминалось еще в FIDO и компьютерных журналах 90-х.
>По сравнению с другими скриптовыми/интерпретируемыми языками (пхп, питон, руби) лучше перформанс, часто намного лучше
Что угодно будет быстрее руби. А давайте с LuaJIT сравним, вот здесь-то нода и обосрется.
Чел. На руби умные люди не хотели писать еще когда и голенгов в помине не было. Говорили что это наследник перла для write only скриптов
>давайте с LuaJIT сравним
Не думаю, что там будет разница в разы, кто бы ни выиграл. Вообще, луа язык не полноценный, и он такой by design. Не участвует в гонке фич, чтобы оставаться лайтвеигхт для эмбеда и лёрнабл за неделю.
Зачем сравнивать ноду с этим? Смысл тёплое с мягким сравнивать? Есть уже адекватные предметы для сравнения, например го и раст, которые используются на бекенде и уделывают практически что угодно.
Ладно ещё не "my", как в перле.
>пхп
>лучше перформанс
Дядь, поставь пхп последней версии и твоя нода пожрет говна в плане перформанса. Миф о медленном пхп был актуален лет 10 назад, когда на нем говнокодили все кому не лень (читай - битрикс и прочие CRM) и сам язык не развился так сильно как сейчас. тоже самое относится к jquery
flux'о-подобное говнище не уважаем. Mobx - лучший стейт менеджер, единственный минус которого - необходимость писать обсерверы.
>поставь пехепе и пожри говна
Спасибо уже нажрался за несколько лет. Симфони 7 может и няшка, но работы на симфони нет. Только говнопроекты на леравеле где все пишут как попало. Один из БД вытаскивает тонны данных, а потом фильтрует и вычисляет на пыхе, другой в простом круде абстракции с потолка высирает как на спринге, третий колбасит логику на фронтенде и все это в одном проекте..
> твоя нода пожрет говна в плане перформанса
>высирает какую-то хуйня про то что пишут как попало
я ебу вот это интеллект
У тебя есть пруфы? Вот у меня есть пруфы моих слов.
https://web-frameworks-benchmark.netlify.app/compare?f=express,hono,elysia,fastify,adonisjs6-http,moleculer,koa,laravel,symfony,yii
>По сравнению с другими скриптовыми/интерпретируемыми языками (пхп, питон, руби) лучше перформанс
Это не совсем так. Смотря в каких задачах. На некоторых задачах PHP быстрее чем Java и по скорости близок с Си. V8 очень быстрый движок, но в веб-приложениях Нода не тянет, ее сетевой стек дает большой оверхед. С либами/фреймворками Нода не быстрее Питона. У PHP движок тоже очень быстрый, но оверхед дает подъем виртуальной машины на каждый запрос. PHP-FPM тоже дает большой оверхед, если не ошибаюсь, его вообще забросили и много лет не обновляют. Стоит сделать из PHP долгоживущий процесс как у Ноды и он догоняет Джаву.
>На некоторых задачах PHP быстрее чем Java и по скорости близок с Си.
На каких?
>V8 очень быстрый движок, но в веб-приложениях Нода не тянет, ее сетевой стек дает большой оверхед. С либами/фреймворками Нода не быстрее Питона.
Это не так, в веб-приложениях нода очень даже тянет, и тем более по сравнению с питоном. Джанго просто пиздец какой медленный, а фастапи выдаёт перформанс уровня чуть-чуть выше экспресса, который самый медленный среди юзабельных инструментов в экосистеме ноды, тот же фастифай будет ощутимо лучше фастапи.
Так Elysia работает на Bun, который использует uWebSockets.js. Workeman и Swoole не слабее, а конкурентность в них более удобная. Еще uWebSockets.js работает в одном потоке.
https://www.techempower.com/benchmarks/#hw=ph&test=composite§ion=data-r22&l=zijzzz-cn1&f=zik0zj-zik0zj-zik0zj-zik0zj-zik0zj-zik0zj-zik0zj-zik0zj-zik0zj-zik0z3-zik0zj-zijugv-zik0zj-z89727-1czj
https://web-frameworks-benchmark.netlify.app/compare?f=hyper-express,elysia,hono-bun,swoole,workerman#totalRequestsPerS
>На каких?
CPU-bound.
>в веб-приложениях нода очень даже тянет
Голая Нода очень слабенькая. Это уже давно доказано. С Фреймворками и подавно. Поэтому и появились uWebSocket.js и Bun.
>>73862
>Джанго
Не сравнивай Джанго с фреймворками на Ноде. Это огромный комбайн, на Ноде и близко ничего такого по функционалу нет. ПОэтому и медленный. Фастапи не медленнее чем Нодовские фреймворки. В Питон завезли Socketify, который скопировали с uWebSockets.js.
Это не заслуга Ноды, это все благодаря uWebSockets.js, и Гиперэкспресс и Элизия работают на этом сетевом стеке.
>>73884
Ну да, bun не нода, но это по сути бекенд на js/ts. Я и не говорю, что workerman и swoole слабее. Какая там конкурентность не знаю. Чем она удобнее? А использование uWebSockets тут при чём? Внутри ещё и JavaScriptCore и кастомная имплементация async I/O на zig, или в самой ноде V8 и libuv, это же нас не смущает. В swoole плюсы в исходниках нас ведь тоже не смущают.
>Голая Нода очень слабенькая. Это уже давно доказано.
Примеров не будет?
>С Фреймворками и подавно.
Где пруфы? Я вижу обратное, например как популярный фастифай на ноде выдает перформанс намного больше популярных фреймворков на питоне или пхп.
>Фастапи не медленнее чем Нодовские фреймворки
Я тебе скинул пруфы, где показано, что фастапи по перформансу на уровне самого медленного фреймворка ноды.
>Нода написана плохо. uWebSockets.js не использует сетевой стек Ноды вообще, у него свой. Bun насколько мне известно под капотом использует uWebSockets.js.
И? У swoole тоже под капотом код на плюсах.
>В бенчах смотри или потести сам. Как минимум в 6 раз медленнее чем uWebSockets.js.
Бенчи подтверждают мои слова, я скриншоты все сюда скинул.
>Какая база на этот тред? Постгря? Мускуль? MS SQL? Sqlite? Монга?
Sqlite, если у тебя данных меньше 6 Гигов
Двачую. Сам когда-то познал дзен и стал использоваться SQLite, чтобы как страшный сон забыть менеджмент пула коннектов к базе данных.
И?
1) Мне пихуй на ваш перформанс. Я не пишу высокочастоную торговлю на бирже.
2) Пыха говно по многим причинам отличным от перформанса
3) Изкоробочного перформанса в пыхе нет
4) Пыхо проект обычно тормозит, потому что запросы к БД кривые написали
5) Тред не для того чтобы два чела между собой общались.
vite, esbuild, node, bun и прочее подобное
сложнее чем на бэке тут
так то оно так, но тут кабану решать
что кабан скажет, то и будет писать, никакого самовольства
В основном это баззворды из твиттера
Кушаешь много?
Обычно пишу так, когда надо притормозить до ближайшего requestAnimationFrame:
await new Promise(resolve => requestAnimationFrame(() => {
// всякая херня со стилями
resolve()
}))
Но ведь можно сделать функцию задержки до ближайшего requestAnimationFrame:
function nextRAF() {
return new Promise(resolve => requestAnimationFrame(resolve))
}
И затем писать так:
await nextRAF()
// всякая херня со стилями
Это ведь будет то же самое, что и в первом случае? Или есть какой-то смысл помещать код именно внутрь requestAnimationFrame, а не просто ждать, когда подойдёт его время?
Можно писать await doubleRAF(() => { ... }) // и внутри тоже можно авейтить
>пыха быстрее дефолтной ноды не на порядки а раза в два - три
Не надоел этот унылый троллинг? Тебя выше уже несколько раз опровергли с пруфами.
php -v
PHP 8.3.11 (cli) (built: Aug 27 2024 19:16:34) (NTS)
<?php
$s = 0;
for ($i=0; $i<1000_000_000; $i++) {
$s += $i;
}
echo $s;
time php test.php
499999999500000000
real0m6,651s
user0m6,622s
sys0m0,029s
node -v
v20.17.0
s = 0;
for (let i=0; i < 1000_000_000; i++) {
s+= i;
}
console.log(s)
time node test.js
499999999067109000
real0m16,368s
user0m16,348s
sys0m0,021s
php -v
PHP 8.3.11 (cli) (built: Aug 27 2024 19:16:34) (NTS)
<?php
$s = 0;
for ($i=0; $i<1000_000_000; $i++) {
$s += $i;
}
echo $s;
time php test.php
499999999500000000
real0m6,651s
user0m6,622s
sys0m0,029s
node -v
v20.17.0
s = 0;
for (let i=0; i < 1000_000_000; i++) {
s+= i;
}
console.log(s)
time node test.js
499999999067109000
real0m16,368s
user0m16,348s
sys0m0,021s
Хотя если на пыхе в флоатах считать чтобы интыджер оверфлоу не было
<?php
$s = 0.0;
for ($i=0.0; $i<1000_000_000; $i++) {
$s += $i;
}
echo $s;
то почти одинаковый по времени результат
time php test.php
4.9999999906711E+17
real0m11,805s
user0m11,786s
sys0m0,016s
Голенг быстрее сишки
package main
import "fmt"
func main() {
sum := 0.0
for i := 0.0; i < 1000_000_000; i++ {
sum += i
}
fmt.Println(sum)
}
time ./test
4.99999999067109e+17
real0m1,268s
user0m1,267s
sys0m0,004s
#include <stdio.h>
int main() {
double s = 0.0;
for (double i=0.0; i < 1000000000; i++) {
s += i;
}
printf("%e", s);
}
time ./test
5.000000e+17
real0m2,649s
user0m2,649s
sys0m0,000s
Голенг быстрее сишки
package main
import "fmt"
func main() {
sum := 0.0
for i := 0.0; i < 1000_000_000; i++ {
sum += i
}
fmt.Println(sum)
}
time ./test
4.99999999067109e+17
real0m1,268s
user0m1,267s
sys0m0,004s
#include <stdio.h>
int main() {
double s = 0.0;
for (double i=0.0; i < 1000000000; i++) {
s += i;
}
printf("%e", s);
}
time ./test
5.000000e+17
real0m2,649s
user0m2,649s
sys0m0,000s
Короче делать не буду, нафиг.
>обязательно ли знать html css для вката в жс и тс?
define "вкат"
чтобы учить JS и TS, html и css не нужны.
чтобы найти работу на JS и TS, html и css нужны, если только ты не найдёшь работу бэкендером на ноде
Это круто, конечно, только это не единственный показатель, по которому можно сделать вывод, что один язык быстрее другого. Бенчмарки конкретно по RPS, latency, запросам в БД, сериализации JSON и т.д. не не в пользу пхп.
>Бенчмарки конкретно по RPS, latency, запросам в БД, сериализации JSON и т.д. не не в пользу пхп.
Какие? Нодовские фреймворки медленнее тех что на PHP. Workerman написан на PHP без Си или чего-то другого. Ни один Нодовский фреймворк, который написан на чистом JS не дотянется до него. Потому что как я уже писал сто раз, у Ноды плохо написан сетевой стек. Ты ничего с этим не сделаешь. V8 не быстрее движка PHP. Поэтому никак Нода не может быть быстрее, если в PHP используется конкурентность.
1) Теперь тащи фремворки на пыхе заточенные под конкурентность на этих васянских велосипедах.
2) Милипиздрическая прибавка к перформансу никак не компенсирует убогость самой пыхи как языка и платформы
3) Если что-то потебуется считать на цпу, то ноду легче через к раббит соединить с тем же голенгом. Напиши на чистой пыхе один скрипт - одновременно консумер очереди чисел и хттп ручка отправляющая эти числа через SSE в браузер. На ноде делается стандартными средствами ноды. На пыхе только через васянское говно типа свуле
>плохо написан сетевой стек
Специалист по сетевым стекам? Тогда конкретнее выражай свою мысль.
мимо
В целом любое тестовое задание это дерьмо пеликана. Потому что я где-то делал и мне даже бывало не отвечали, типо вообще похую. Причем оно гавно на любом этапе, до интервью, после. Есть фирмы, которые платят за выполненное тестевое, даже если ты им не подошел. Все остальное - клоунада. То что ты сбросил, это можно на коленке сделать за пару часов или много много дольше. Картинка несет мало информации
>Какие?
Вот:
>>73955
>>73923
>>73876
>>73862
>>73847
>>73824
>Нодовские фреймворки медленнее тех что на PHP
В бенчмарках нодовские фреймворки быстрее. Я устал просить у тебя пруфы, так что просто констатирую, что ты либо троллишь, либо по какой-то причине фантазируешь и отрицаешь очевидную реальность.
>Workerman написан на PHP без Си или чего-то другого. Ни один Нодовский фреймворк, который написан на чистом JS не дотянется до него.
Да, workerman крут, только на нём никто не пишет бекенды, бекенды пишутся на симфони и ларе, которые очень медленные относительно ноды и тем более бана, и даже когда тот же симфони используется вместе с workerman, то он медленнее того же fastify, судя по >>73923
>Потому что как я уже писал сто раз, у Ноды плохо написан сетевой стек.
Ну допустим плохо, но в итоге в реальных условиях (сравнение rps и latency популярных веб фреймворков в типичных бекенд задачах) нода всё равно быстрее пхп.
>Ты ничего с этим не сделаешь. V8 не быстрее движка PHP
Вот тут видно >>73955 перформанс в CPU bound задачах посложнее инкремента (пхп есть только в 1 и 2 графике), и ещё раз добавлю в этот пост скрины бенчмарка, где видно, что у symfony-swoole и symfony-workerman перформнас ниже фастифая, и немногим выше дефолтного неста, который базируется на медленном экспрессе. yii2-workerman, laravel-workerman, laravel-swoole — всё 3 ниже тормознутого экспресса. Так что может workerman и крутой, но фреймворки добавляют какой-то пиздецовый оверхед. А фастифай вот быстрее голой ноды, ну не удивительно, там один из кор мейнтейнеров ноды в разрабах.
>Поэтому никак Нода не может быть быстрее, если в PHP используется конкурентность.
Если ты имеешь в виду голый swoole или workerman, то тогда справедливо сравнивать с решениями на uWebSockets. Но ещё раз, на голом воркермене не пишут.
>>75194
>1) Теперь тащи фремворки на пыхе заточенные под конкурентность на этих васянских велосипедах.
Да, в этом вся суть. На втором пике этого поста всё видно. В ноде тоже можно завелосипедить на uWebSocket, точнее такого уже много сделано. Но большинству проектов более чем достаточно nest-fastify.
>Какие?
Вот:
>>73955
>>73923
>>73876
>>73862
>>73847
>>73824
>Нодовские фреймворки медленнее тех что на PHP
В бенчмарках нодовские фреймворки быстрее. Я устал просить у тебя пруфы, так что просто констатирую, что ты либо троллишь, либо по какой-то причине фантазируешь и отрицаешь очевидную реальность.
>Workerman написан на PHP без Си или чего-то другого. Ни один Нодовский фреймворк, который написан на чистом JS не дотянется до него.
Да, workerman крут, только на нём никто не пишет бекенды, бекенды пишутся на симфони и ларе, которые очень медленные относительно ноды и тем более бана, и даже когда тот же симфони используется вместе с workerman, то он медленнее того же fastify, судя по >>73923
>Потому что как я уже писал сто раз, у Ноды плохо написан сетевой стек.
Ну допустим плохо, но в итоге в реальных условиях (сравнение rps и latency популярных веб фреймворков в типичных бекенд задачах) нода всё равно быстрее пхп.
>Ты ничего с этим не сделаешь. V8 не быстрее движка PHP
Вот тут видно >>73955 перформанс в CPU bound задачах посложнее инкремента (пхп есть только в 1 и 2 графике), и ещё раз добавлю в этот пост скрины бенчмарка, где видно, что у symfony-swoole и symfony-workerman перформнас ниже фастифая, и немногим выше дефолтного неста, который базируется на медленном экспрессе. yii2-workerman, laravel-workerman, laravel-swoole — всё 3 ниже тормознутого экспресса. Так что может workerman и крутой, но фреймворки добавляют какой-то пиздецовый оверхед. А фастифай вот быстрее голой ноды, ну не удивительно, там один из кор мейнтейнеров ноды в разрабах.
>Поэтому никак Нода не может быть быстрее, если в PHP используется конкурентность.
Если ты имеешь в виду голый swoole или workerman, то тогда справедливо сравнивать с решениями на uWebSockets. Но ещё раз, на голом воркермене не пишут.
>>75194
>1) Теперь тащи фремворки на пыхе заточенные под конкурентность на этих васянских велосипедах.
Да, в этом вся суть. На втором пике этого поста всё видно. В ноде тоже можно завелосипедить на uWebSocket, точнее такого уже много сделано. Но большинству проектов более чем достаточно nest-fastify.
Не пробовал у них спросить, нужно ли/можно ли использовать ui либы? Без либ это будет долго, но иногда просят именно без, чтобы увидеть как вручную будедь писать все эти дропдауны и прочее подобное
>тащи фремворки на пыхе заточенные под конкурентность
В гугле забанили?
https://github.com/walkor/webman
>Милипиздрическая прибавка к перформансу
120k rps на R5600G это небольшая прибавка? Нода даже 50к не вытянет. Латенси 50 миллисекунд!
>убогость самой пыхи как языка и платформы
ЯЗык и платформа имеют много плюсов, как и JS с V8. Минусы компенсируются встроенными либами и сторонними тулзами. На самом деле, в PHP давно есть мощные средства для конкуретного и параллельного исполнения, например либа Parallel. Проблема в людях, которые не используют все фичи. В Ноде нет ничего подобного Parallel или Workerman.
>Если что-то потебуется считать на цпу, то ноду легче через к раббит соединить с тем же голенгом.
В PHP есть простой в использовании FFI. Можно подключать код на Си или Расте.
https://engineering.wedevs.com/2023/08/18/supercharge-php-using-ffi/
>Специалист по сетевым стекам? Тогда конкретнее выражай свою мысль.
Погугли статьи создателей uwebsockets и just-js.
Зачем ты сравниваешь комбайн Symfony с нодовскими микрофреймворками? Они огромные и написаны без асинхронности.
Fastify 102-е место, у Slim 73-е место, даже без асинхронности!
https://www.techempower.com/benchmarks/#hw=ph&test=composite§ion=data-r22&l=zijzzz-cn3
О чем ты споришь вообще? Голый PHP без асинхронности 65-е место, а голая Нода 104-е! Кхм... Подключаем асинхронность с Workerman и получаем 33-е место в общем зачете! В общем зачете! Там где Rust, C/C++, Java, Go, .NET...
Нода в низах. И только uWebsockets.js (Hyperexpress тоже на нем работает) немного выше Workerman. Ну и Just-js, который хоть и хорош, не готов к работе, и это вообще отдельный рантайм. Авто uwebsockets крутой Си-хакер, он написал либу для работы с json на Go, которая оказалась в 3 раза! быстрее встроенной, написаной в Гугле. Но это не Нода, это отдельный Си и C++ код. Сама Нода медленная.
>Сама Нода медленная
Это не компенсирует что пыха уродливое говно, синтаксис которой даже двощ считает wipe symbols
Кому надо скорость будут писать не на пыхе. А пыха как фронтенд явно лишнее звено.
Это не правда. Синтаксис у PHP почти как у Си. JS же имеет куда больший минус, это язык для написания, но не для чтения. Его невозможно читать. На этом все его плюсы перечеркиваются.
Ты совершенно необъективен. С JS я познакомился гораздо раньше PHP. Мне нравится JS, в нем нет перекоса на использование классов, нет так называемого "ООП головного мозга", у него лаконичный синтаксис, можно писать и кратко и понятно. Проблема опять же в людях, которые понятно писать не умеют и не хотят.
Пыходебил высасывает хуйню из пальца, классика
насколько сложно workerman'а прикрутить и кром web socket'ов можно SSE использовать?
>насколько сложно workerman'а прикрутить
composer require workerman/workerman
>SSE
Зачем?
https://manual.workerman.net/doc/ru/http/SSE.html
Затем что вебсокеты нужны для чатов. А для того чтобы реализовать подписки на обновление данных больше подходит SSE.
У тебя кстати доктрина или элоквент готовы работать в долгоживущем воркере? Вот те же субскрайберы доктрины там будут работать асинхронно?
мимо
>Зачем ты сравниваешь комбайн Symfony с нодовскими микрофреймворками?
Fastify и nest это не микрофреймворки.
>Они огромные и написаны без асинхронности.
Под "без асинхронности" ты имеешь в виду symfony без workerman или swoole под капотом? Так я уже несколько раз скинул скрины, где symfony-workerman и symfony-swoole перформят чуть лучше самого медленного нодовского экспресса.
>Fastify 102-е место, у Slim 73-е место, даже без асинхронности!
>https://www.techempower.com/benchmarks/#hw=ph&test=composite§ion=data-r22&l=zijzzz-cn3
Зато symfony, laravel и yii ниже fastify даже с асинхронностью. На пхп пишут бекенды на чём-то кроме symfony, laravel и yii? По-моему нет.
>О чем ты споришь вообще? Голый PHP без асинхронности 65-е место, а голая Нода 104-е! Кхм... Подключаем асинхронность с Workerman и получаем 33-е место в общем зачете! В общем зачете! Там где Rust, C/C++, Java, Go, .NET...
Подключаем асинхронность с Workerman куда, в symfony? Тогда мы получаем место ближе к дну, на уровне тормознутого экспресса. И если ты берёшься сравнивать голый workerman, то справедливо сравнивать с решениям на uWS.
>Нода в низах. И только uWebsockets.js (Hyperexpress тоже на нем работает) немного выше Workerman. Ну и Just-js, который хоть и хорош, не готов к работе, и это вообще отдельный рантайм. Авто uwebsockets крутой Си-хакер, он написал либу для работы с json на Go, которая оказалась в 3 раза! быстрее встроенной, написаной в Гугле. Но это не Нода, это отдельный Си и C++ код. Сама Нода медленная.
V8 это тоже не нода, это отдельный низкоуровневый код? И какой-нибудь libuv тоже? Ты же знаешь, что нода в принципе написана на си и плюсах. Только swoole и workerman это не пхп, это же отдельные проекты. В bun uWS тоже не засчитывается почему-то с твоей странной точки зрения, хотя это прямо внутренняя часть бана.
>JS же имеет куда больший минус, это язык для написания, но не для чтения. Его невозможно читать. На этом все его плюсы перечеркиваются.
Так пиши на TS, он прекрасен и для написания, и для чтения.
https://wellfound.com/jobs/3093011-senior-backend-developer-node-js-100-remote
TS прекрасен для описания типов вместо решения задач. Задачи потом быстро быстро через any решаются
Какая нахуй пагинация, чел, это прошлый век, лупи инфинит скролл.
Никто в текущих реалиях на зепку в 120к$ не будет релоцировать из СНГ. Лучше уж сидеть на синьке у нас в бигтехе на 400.
>Задачи потом быстро быстро через any решаются
Что у тебя за задачи, где ты постоянно эникастишь?
Так ты же долбоеб, я any/unknown пишу примерно раз в полгода, потому что ТС интуитивно понятен.
Чмоня лоускильная, своей мамке перезванивай.
Я синьор на проекте с 30 фронтедерами, который приносит миллионы рублей в сутки. Так что спок.
Так о том и речь, что эти 30 фронтендеров делают все через any, сколько бы ты ни дрочил на типы
Зачем ты пишешь это? Еще напиши, что ездишь каждый день в автобусе, который стоит 30 млн и на нем зарабатывают 100 млн рублей клоун
Да, довольное ебало, потому что в критпе:
1. Много денег
2. Много интересных проектов
3. Удалёнка по всему миру, а не только по родной стране
>>75968
Подвоха нет, но есть нюансы. В процессе устройства на работу могут спросить текущее место пребывания и могут отказать в рассмотрении, если ты живёшь в России/Украине. После устройства уже похуй будет, лишь бы ты мог принимать зарплату. И с налогами придётся разбираться самостоятельно, но это не так уж сложно.
>>75516
А с чего ты вообще взял про релокацию? Придумал? В вакансии ничего про этого нет. Ты работаешь удалённо и живёшь в какой угодно точке мира, релоцируешь себя сам куда сможешь. 5000-10000к баксов в месяц неплохая сумма, но вполне обыкновенная дли работы в крипте, даже я бы сказал маленькая, учитывая, что это компания, разрабатывающая USDT. В российском бигтехе на синьке 400 это практически потолок, многие и за 300-350 работают. Короче, чистыми получается тысячи 4 баксов, а работа часто довольно унылая.
А ключи от квартиры где деньги лежат тебе не надо?
>правило на отсутсвтие any
Да все прекрасно знают, тупоскриптодебил, что вместо работы ты сочиняешь типы, а потом правила для контроля этих типов. А потом кабаныч выкидывает тебя на мороз и ему делают рабочий продукт, а не твой нерабочий типодроч.
Во-первых, описание типов это составная часть задач. Во-вторых, они и без any быстро решаются, если разработчик не лоускилл или не свежий неопытный вкатыш.
>>75526
Так any-хуйня это как раз чистый JS. Тебе, видимо, проекты на более серьёзном языке не доверяют, не хватает навыков, знаний, опыта, ума, чтобы быстро решать задачи на тайпскипте без использования any. Any можно в принципе практически никогда не использовать, есть unknown, который нормальными инженерами крайне редко используется в качестве замены any.
>>75813
В нормальных компаниях так делают, а полноценно используют типизацию. Ты просто скорее всего говоришь из своего опыта работы в третьесортных помойках, экстраполируешь его на все остальные компании и проекты, к которым тебя никогда близко не подпускали и не подпустят, потому что ты либо не очень умный, либо обиженный.
>>76071
Рабочий продукт, в исходниках которого нет типизации? В 2024? Курам на смех.
Со стороны джаваскриптодебила этот пустой выпук без аргументов звучит откровенно нелепо.
"Я люблю обмазываться типами и дрочить"
"Все серьезныеTM конторы"
И другие "выпуки с аргументами" от тайпскриптодурачка, не переключайте канал
Как устроен DeFi, dApps, блокчейн, самая популярная для работы крипта (Solana, Ethereum, TON), web3 библиотеки.
Ты в каком классе учишься? Symphony и Laravel огромные комбайны с миллионами строк кода, с функционалом которых никакой Nest не сравнится. Их писали давно, когда про асинхронность никто и не думал. Их код не рассчитан на конкурентное выполнение.
Нода медленная. uWS и Bun это не Нода, это отдельный компилируемый код. Workerman написан на PHP и производительней Ноды более чем в 5 раз! Даже голый PHP более производительный чем Нода. И uWS/Bun не быстрее чем Workerman.
>Symphony и Laravel огромные комбайны с миллионами строк кода, с функционалом которых никакой Nest не сравнится. Их писали давно, когда про асинхронность никто и не думал. Их код не рассчитан на конкурентное выполнение.
И что? Факт остаётся фактом: когда пишут бекенд на пхп, то берут Symphony и Laravel, когда пишут бекенд на ноде, берут Nest, Fastify, Express.
>Нода медленная.
Смотря относительно чего. Судя по многочисленным пруфам выше, не медленная, вполне средняя. Ок, прикреплю ещё раз результаты бенчмарка по CPU bound задачам, там и Bun есть. По RPS и latency в вебе уже не раз пруфал, что перформнас типичного бекенд фреймворка на пхп ощутимо хуже чем на ноде.
>uWS и Bun это не Нода, это отдельный компилируемый код. Workerman написан на PHP и производительней Ноды более чем в 5 раз!
Wokerman это тоже не PHP, это отдельный код, отдельный фреймворк. Да и будь он не отдельным, он перформит всего лишь чуть лучше Express, когда идёт в паре с Symfony/Laravel/Yii.
>Даже голый PHP более производительный чем Нода.
Смотря в чём. В CPU-bound нет, в веб-задачах в некоторых бенчмарках нет, в некоторых да. Но сравнивать голый PHP и голую Ноду нет смысла, на голых никто не пишет бекенды. Кстати, Techempower использует 18 версию Ноды, она медленее LTS 20 и последне 22.
>И uWS/Bun не быстрее чем Workerman.
Снова отрицанее реальности? Пик 2.
Nodejs - 104-е место
PHP - 65-е место
Fastify - 102-е место
Webman - 35-е место
PHP переигрывает Ноду по всем фронтам.
>описание типов это составная часть задач
Нет.
https://en.wikipedia.org/wiki/Simply_typed_lambda_calculus
А-ха-ха. Какие миллионы строк кода? Ты хоть писал на них, код читал? Или просто теоретик? Что симфони что ларавел простые как палка. Особенно ларавель. Да по документации сравни количество фич в лаке и в несте. Где у тебя в ларавеле поддержка тсп микросервисов? Ларка это просто инструмент чтобы хттп ручки с базой данных соединить, прикученна сбоку очередь, для игрушечных проектов и скафолдинг достаточно удобный. На несте билинги пишут, а на ларке форму заказа для шаурмичной.
Тебе в любом случает тоже напиздят с три короба. Тем более то мутные крипточерти...
А где сейчас не так?
В Ларе есть Octane, Livewire и еще куча фич, по сути отдельные проекты. Еще скажи, что Rails микрофреймворк. Лара по фичам и соответственно по объему кода примерно соответствует Рельсам. В Ноде никогда не было и не будет подобного фреймворка.
>тсп микросервисы
Чего?
На PHP написан Алиэкспресс и Алибаба. В Китае на PHP пишут сверхнагруженные приложения, включая реалтайм. Поизучай Gitee и Bilibili.
Что тебе октане дает. Ускорение? Ты застаь сначала пыхарая нормальные запросы к бд написать. Что ты собрался еше ускорять?
Лайвире ноуней хуйня от одного кренделя. Только хуево об ларке свидетельсвует, что она последнее время всяким дерьмом загадилась ради хайпа. Зачем тога формы выпилили из ларавеля. Хотели кодобазу почистить..
В симфони хоть хотвире из рельсов взяли а не стали всякую чушь тащить. Хотвире со стимулусом в любом фреймворке прикручивается.
Опять же это все хуйня для шаурмичных.
>В Ноде никогда не было и не будет подобного фреймворка.
Какого такого? Ты неста хоть доку открывал?
Ну да. Это говно чтобы UI компоненты на пыхе писать. Только нахой этим лисапедом для создания шаурмичных хвастаться. Я на пыхе за шесть лет так нормальной работы и не видел. Каждый раз либо мутный кабан с мутным проектом типа беттинга гамблинга, либо нищий кабан с магазином и интеграциями.
И ты не способен их опровергнуть, способен только серить в тред и бессильно взять слово аргументы в кавычки
Есть пруфы, что через USDT отмывают мафиозные деньги? Нет. Зато миллионы людей по всему миру используют USDT чтобы дёшево и быстро переводить деньги друг другу, особенно людям в другие страны.
Нет, нормальные люди не пойдут работать ни в один из российских банков
Тайпскриптодебил не унимается, читай, дурачок:
https://ru.wikipedia.org/wiki/Апелляция_к_авторитету
Мне пох. Я не про USDT пиздел. Анон вообще про крипту спрашивал. Если он будет в крипту вкатываться, то врядли в такие рафинированые компании, скорее в мутные ввяжется, которых в телеге дохуя, к челам со смехуечками из 90ых...
Вообще-то апелляция к хорошим компаниям, это не апелляция к авторитету. Хорошая компания подразумевает что в ней хорошие настроенные процессы, а значит они делают хорошие практики. Если бы он сказал, что Линус Торвальдс хорошо отзывался о тайпскрипте, тогда бы это была апелляция к авторитету.
мимо
Вот тут перечислены голые факты:
> Во-первых, описание типов это составная часть задач. Во-вторых, они и без any быстро решаются, если разработчик не лоускилл или не свежий неопытный вкатыш.
> Так any-хуйня это как раз чистый JS. Тебе, видимо, проекты на более серьёзном языке не доверяют, не хватает навыков, знаний, опыта, ума, чтобы быстро решать задачи на тайпскипте без использования any. Any можно в принципе практически никогда не использовать, есть unknown, который нормальными инженерами крайне редко используется в качестве замены any.
А вот тут просто вывод, сделанный из твоих постов:
> Ты просто скорее всего говоришь из своего опыта работы в третьесортных помойках, экстраполируешь его на все остальные компании и проекты, к которым тебя никогда близко не подпускали и не подпустят, потому что ты либо не очень умный, либо обиженный.
Правильно, не идите сюда. Тут даже во второсортных относительно Tether компаниях полная удалёнка, зарплаты ощутимо выше рынка, интересные проекты. Не думаю, что вам такое нужно, лучше пукать в кресло в офисе Сбера за 300 сотыг рупий.
Так и область слабо связанна с тематикой треда. Хочется логику на жс/тс писать, а не контракты на солидите. Почему именно из жс треда туда пойдут, а например не из питоньего или пхпешного. Я вообще как-то раз попал на написание криптоговна на пыхе. Но я не выбирал это, в галере проект прилетел.
Смотрим один из самых показательных тестов Fortunes:
fastify 70 место
symfony 115 место
yii2 104 место
laravel 120 место
В реальных веб-фреймворках в Fortunes пхп проигрывает по всем фронтам, включая:
symfony-workerman 76 место
yii2-workerman95 место
laravel-workerman 101 место
Смотрим второй важный тест, Data updates:
symfony-workerman 27
fastify 34
symfony 38
yii2-workerman66
yii2 83
laravel-workerman 103
laravel 110
О да, symfony-workerman слегка обогнал fastify. На elysia и UWS лучше не будет смотреть, а то станет слишком неприятно.
Контракты на солидити это отдельная специализация blockchain developer. А я речь веду про работу фронтом или беком в web3 компаниях, в этом случая работа это дефолтный react/next либо express/fastify/nest + web3 либы для подключения к потоку информации с блокчейна, а сами контракты такие люди не пишут.
пыхоплеяды*
Если Workerman это PHP, to UWS это Node.js. Если я буду писать бекенд на UWS, то я буду взаимодейтствовать только с Node.js и JavaScript. Если я пишу бекенд на Ноде без UWS, то я с написанными на C/C++ V8 и libuv тоже не взаимодействую.
>µWebSockets is exposed to Node.js as a simple-to-use, native V8 addon.
>Написан на PHP.
Но это отдельный фреймворк.
>Написан на C/C++.
И что? Вся Нода написана на C/C++
Все таки он https://github.com/walkor/workerman/blob/master/src/Worker.php#L722
написан на этой хуйне https://bitbucket.org/osmanov/pecl-event/src/master/
UWS тоже ка си++ расширение для ноды работает
так что спор не о чем.
>UWS тоже ка си++ расширение для ноды работает
Заменяя сетевой стек Ноды. Получается, что ты сравниваешь уже не Ноду с PHP. Нода медленнее PHP, даже если PHP без асинхронности.
И почему ты кстати запал на китайского вассермана если давно был Ratchet http://socketo.me/ с ивент лупом на той же самой хуйне
Ты как попугай говоришь про сетевой стек не ведая что ивент луп и организует в этот сетевой стек. Как у тебя сокеты селектятс если не через этот ивентлуп. У тебя в твоем васермане тоже стек заменяется получается. Точнее не заменяется а даже добавляется. Потому что без него пыха не может делать мультиплексинг сокетов
В процитированном тобой посте из бекенд фреймворков только Fastify, плюс ты привёл цифры из Composite Score, где в PHP учтены все результаты с workerman и swoole, а не только голый PHP. Ты, похоже, пытаешься троллить непробиваемой тупостью и твердолобостью. Так что я дополню что имел в виду в одном из своих первых постов >>73070
Тут имелась в виду коммерческая разработка бекенда на JS/TS, которая делается на ноде, хотя если начинать бессмысленно меряться хуями, то важно именно JS/TS, чтобы не было кукареков про "Bun не считается". Но я всё-таки имел в виду коммерческую разработку, которая делается именно на ноде, и именно на популярных инструментах (Express, Nest, Fastify, иногда что-то типа Moleculer...). Поэтому очевидным образом ведётся речь о том, что типичный бекенд на ноде (Nest-Fastify) будет быстрее бекенда на Фастапи/Рельсах/Симфони и т.п., что легко подтверждается. Ну а ты дольствуйся тем, что голый ПХП чуть-чуть быстрее голой Ноды, хотя стоит к нему навесить Симфони с Ларой, то начинается заметное падение перформанса по бенчмаркам, даже если привасянить к основному фреймворку твой не являющийся PHP workerman.
>В процитированном тобой посте из бекенд фреймворков только Fastify
А, ошибся, там Webman, а не Workerman. Ну тогда добавляй в сравнение Elysia, или UWS и hyperexpress.
Я уже много лет пишу на этом языке и по моим наблюдениям он только развивается, как и его экосистема. Но раст и сишарп крутые, не спорю, только зачем мне туда переходить, если мне и тут хорошо, да и микросервис на расте вполне смогу написать при необходимости.
>раст и сишарп крутые
В чем заключается крутизна раста? Зачем он нужен, когда есть тот же C++?
>В чем заключается крутизна раста? Зачем он нужен, когда есть тот же C++?
Тупорылые вопросы. А зачем нужен язык Х? Чтобы люди имели выбор! Или все обязаны использовать то, что ты используешь? Rust - это современный язык. Он блять появился не во время sourceforge и svn, когда трава была зелёной, а бородатые одмены писали баш скрипты вручную. С++ это мамонт программирования. Там каждая крохотуленька ебёт мозги, особенно окружение - надо autoconf настраивать, тесты, линтеры. Достоинство rust'а в том, что мне не надо об этом думать. Я не думаю о всех этих макросах, мейкфайлах, и т.д. Я просто сел и у меня уже все тесты, линтеры подхватились и настроились на раз-два. Мне не надо думать "а все ли зависимости установлены?". Если я ставлю вручную какую-то либу в С++, типа armadillo, мне надо ещё установить зависимости к зависимостям блять. Или если я в коде не там поставил указатель в С++, придётся гадать миллион лет, почему программа крашится. Такого не бывает в расте. С++ это дико переусложнённый язык.
В своё время он заборол AppleScript и VBScript, поэтому корпораты его ненавидят, выкатывают то Dart, то TypeScript, то ещё какую-нибудь парашу.
>выкатывают то Dart, то TypeScript
В чем проблема TypeScript?
Dart это вроде как недоаналог js-а?
Не надо свой опыт экстраполировать на всех остальных. Все коллеги, с которыми я работал, легко всё видели.
А каких апи не хватает? Недавно вот тестирование добавили, ещё экспериментальную поддержку тайпскрипта, вебсокеты и фетч без внешних зависимостей, watch mode (как в nodemon)
Не все работает
>А каких апи не хватает?
Да любых.
Вон как должна выглядеть нормальная стандартная библиотека:
https://docs.python.org/3/library/index.html
а в ноде это огрызок.
Спустя 10 лет в 2024 году аж тестирование добавили. Ору.
Сначала пыходебилы, теперь питонодауны. Все приходят сюда продавать свой кал. Нет, не купим, иди дальше, дорогой.
язык-name-хуесос порвался
Ты троллишь просто, а не орёшь. Добавлять в принципе нужды даже и не было, потому что с самого начала для этого было много сторонних инструментов в экосистеме, ими и продолжают пользоваться. Их даже слишком много. Jest, Vitest, uvu, Supertest, RTL, Cypress, Enzyme, Mocha, Chai, Jasmine, Puppeteer, Playwright, Ava, WebdriverIO, @web/test-runner...
>>76836
Это троллинг, засоряющий тред.
Они находятся в своем треде и не ходят ничего продавать, дурачок
Вы видите копию треда, сохраненную 15 ноября в 06:25.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.