Войдите или зарегистрируйтесь
Вы сможете писать комментарии и посты, ставить лайки и другое
Поиск
Тёмная тема

Посты по тегу: веб-разработка

Nuxt 3 и 4: проблема со множественными вызовами navigateTo

3 дн. назад
На работе на одном проекте столкнулся в Nuxt 4 с проблемой, когда в page-компоненте нужно делать разные редиректы через navigateTo() по различным условиям в процессе выполнения setup функции. Примерно так:

<template>
  Some page
</template>

<script lang="ts" setup>
if (1 + 1 === 2) {
  await navigateTo('/?abc=1', {
    redirectCode: 302,
  });
}

if (2 + 2 === 4) {
  await navigateTo('/?abc=2', {
    redirectCode: 302,
  });
}

if (3 + 3 === 6) {
  await navigateTo('/?abc=3', {
    redirectCode: 302,
  });
}

if (4 + 4 === 8) {
  await navigateTo('/?abc=4', {
    redirectCode: 302,
  });
}
</script>

Тут возникает проблема: в конечном итоге срабатывает редирект на самый последний урл, т.е. в коде выше переход будет на /?abc=4. Я порылся в документации, не нашёл ничего встроенного, чтобы избежать срабатывания последующих вызовов navigateTo. Вроде как это поведение связано с vue router.

Вот так написать тоже нельзя:
if (1 + 1 === 2) {
  await navigateTo('/?abc=1', {
    redirectCode: 302,
  });
  return; // так нельзя в script setup
}

Пришлось делать единственное решение - это завести boolean-переменную и проверять уже её.

let isAlreadyRedirected = false;

if (1 + 1 === 2) {
  await navigateTo('/?abc=1', {
    redirectCode: 302,
  });
  isAlreadyRedirected = true;
}

if (!isAlreadyRedirected && 2 + 2 === 4) {
  await navigateTo('/?abc=2', {
    redirectCode: 302,
  });
  isAlreadyRedirected = true;
}

if (!isAlreadyRedirected && 3 + 3 === 6) {
  await navigateTo('/?abc=3', {
    redirectCode: 302,
  });
  isAlreadyRedirected = true;
}

if (!isAlreadyRedirected && 4 + 4 === 8) {
  await navigateTo('/?abc=4', {
    redirectCode: 302,
  });
  isAlreadyRedirected = true;
}
Ещё раз - это единственное, что решило проблему. Если у вас есть какое-то другое решение, напишите плиз.
Показать полностью...
+2
7

Пагинация курсором в PostgreSQL: не путайте реальный CURSOR и фейковый курсор из WHERE

9 дн. назад
На любом собесе по system design и хайлоаду вас наверняка спросят про пагинацию. И вопрос этот с подвохом, т.к. на хайлоаде БД очень большие, с миллионами записей. Например, спросят как сделать бесконечную ленту последних постов с подгрузкой. И тут главное не обос****ться как я сделал на своем собесе 😂

Итак, что мы знаем про курсоры? В PostgreSQL есть самые настоящие курсосы! Они так и называются CURSOR. В постгресе они работают только внутри транзакций.
BEGIN;
DECLARE zhopa_cursor CURSOR FOR
  SELECT id, title, created_at FROM posts;

-- Получаем 10 строк:
FETCH 10 FROM zhopa_cursor;

-- Получаем еще следующие 10 строк сразу после места, где остановились до этого:
FETCH 10 FROM zhopa_cursor;

CLOSE zhopa_cursor;
COMMIT;

Обратите внимание, что обязательны транзакция и конкретное имя для курсора. Можно ли это использовать в вебе? Нет. Но я на собесе начал заливать про эти курсоры постгреса и про хранение имен курсоров, хотя непонятно как это все реализовать для веба. Типа не закрывать некоторое время транзакцию и держать открытой некоторое время пока идут http запросы? 😂

Короче, в веб разработке есть так называемые курсоры, которые никакими курсорами на самом деле не являются. Это обычные WHERE условия в SQL! Но за каким-то х***м это называется курсором.

Вот SQL получения первого списка постов для ленты:

SELECT id, title, created_at
FROM posts
ORDER BY created_at DESC, id DESC
LIMIT 20;

Далее браузер в http запросе для получения следующих 20 постов передает payload:

"last_created_at": "2026-01-15 12:30:00+00",
"last_id": 12345,

И бэк делает SQL запрос:

SELECT id, title, created_at
FROM posts
WHERE (created_at, id) < ($1, $2)
ORDER BY created_at DESC, id DESC
LIMIT 20;

Вот эта строка:
WHERE (created_at, id) < ($1, $2)
это и есть как бы наш курсор, хотя нифига это не курсор.

Такой запрос с псевдо-курсором намного быстрее, чем юзанье OFFSET когда постгрес читает все подходящие записи в таблице и тут же скипает часть их.
Показать полностью...
+2
7

Внимание владельцам сайтов: Gmail почта позволяет создавать дубликаты аккаунтов в огромных количествах

недавно
На многих сайтах регистрация аккаунта осуществляется через email-адрес. Одно мыло - один аккаунт, вроде всё просто. Если забанить такого пользователя, то он не сможет зарегистрироваться снова на тот же самый email. Но это теоретически.

А практически при наличии одной электронной почты на Gmail можно создавать в интернет-сервисах огромное количество аккаунтов, не меняя адреса. Дело в том, что Gmail игнорирует регистр символов и наличие точек в имени пользователя.

Допустим есть пользователь c такой гугловской почтой:
vasya.pupkin.example@gmail.com
Если поменять регистр букв в имени юзера и отправить письмо на:
Vasya.PUPkin.example@gmail.com
то ему придёт письмо в настоящий ящик!

Сколько таких комбинаций возможно? Очень много!

Мало того, можно подобавлять точки в адрес:
va.s.ya.pu.p.k.in.example@gmail.com
и ему тоже придёт письмо в ящик-оригинал.
Даже если убрать точки из оригинала:
vasyapupkinexample@gmail.com
то письмо тоже придёт!

Представьте, сколько десятков тысяч комбинаций можно сделать с точками и изменениями регистра букв. Можно насоздавать тысячи вредительских аккаунтов, если сайт не защитился от этой "фишки" гуглопочты. Банить устанешь.
+2
138

ChatGPT 5 - туфта, не заменит программистов (реальный пример на Nuxt 4)

недавно
OpenAI зарелизили ChatGPT 5 - очередную самую крутую модель своей нейросети. А что в итоге?
Мой промпт:
Я делаю build nuxt 3 / nuxt 4 приложения.
Как понять в какие чанки какие файлы залезли?
Почему чанки такие большие?

До этого спрашивал у 4-ки - предлагал ставить vite-bundle-visualizer. Сразу говорю - это не надо делать, всё уже есть встроенное. Сегодня появилась возможность спросить у 5-ки - повторно спросил. Пятый ChatGPT опять предлагает поставить пакет, на этот раз rollup-plugin-visualizer.

Окей, пытаюсь добиться у него информации, которая должна по моему мнению быть показана в ответе (CLI команды), ChatGPT 5 выдаёт:
Пытаюсь узнать про "npx nuxi analyze", он ищет в интернете и долго думает и всё равно выдаёт:
Показать полностью...
+1
22

Nuxt продан: Vercel, который владеет Next.js, теперь владеет и главным SSR-фреймворком для Vue

недавно
Новость пришла откуда не ждали: монополизация во фронтенде - Vercel купил Накст. Они и так владели Некстом (главным SSR-фреймворков для Реакта), а теперь у них руки добрались и до вьюшной экосистемы.

Об этом сообщил создатель NuxtJS - Daniel Roe (ник danielroe на Гитхабе). Чисто теоретически Накст остаётся независимым, а Vercel купил только NuxtLabs, а также нанял себе ключевых разработчиков Накста. А практически - у них теперь Nuxt и они теперь будут задавать направление развития.

Не знаю, хорошо это и плохо, но монополизация - это точно плохо.
+2
123

Не выпендривайтесь знанием английского языка на работе

недавно
Работаю работу в мультиязычном коллективе, где всё общение идёт на английском и задачи пишутся на английском. Пришла задача в канбане с заголовком:
Add site copy
Плюс в описании задачи были тексты.

Как вы думаете, что имела в виду автор задачи? Создать копию сайта с новыми текстами? Я спросил у пары русскоязычных коллег, как бы они перевели заголовок, все ответили, что подумали про копию сайта.

Так вот автор этой задачи имела в виду "Добавить на сайт текстовой контент", ни про какую копию сайта речи не шло. Оказывается в американском английском слово "copy" иногда используется в значении "текстовой материал":
Ну и зачем так выпендриваться? Во-первых, в коллективе все из разных стран и английский не является родным для большинства. А во-вторых, и это самое главное, фразу можно истолковать и перевести по-другому - по самому явному основному переводу, а не по редкому второстепенному.
+2
56

Популярность Vue.js в России в 2025 году

недавно
В комментах на ютубе поспорил о популярности Vue JS. Мне доказывали, что балом правит Реакт, а Vue где-то на задворках. Увы, реакт-разработчики варятся в своём котле и не видят текущих тенденций. А текущая тенденция такова, что в России Вьюха постепенно откусывает кусок у Реакта.

Для анализа выбрал тематику недвижимости - застройщики. Список крупнейших застройщиков России в 2025 году, данные с Домклика, по количеству сделок:
1. ПИК
2. Самолет
3. ЮгСтройИнвест
4. Холдинг Setl Group
5. ССК
6. Страна Девелопмент
7. ГК ФСК
8. Гранель
9. ЛСР
10. DOGMA
11. АКВИЛОН
12. Домостроительный комбинат
13. ГК Кортрос
14. Талан
15. ГК "А101"
16. ЭНКО
17. Брусника
18. ГК Расцветай
19. GloraX
20. DARS Development
Смотрим сайты:
pik.ru - React
samolet.ru - Vue
gk-usi.ru - другое
setlgroup.ru - Vue
sskuban.ru - Vue
strana-development.ru - другое
fsk.ru - Vue
granelle.ru - Vue
lsr.ru - React
dogma.ru - React
group-akvilon.ru - Vue
dsk1.ru - Vue
kortros.ru - Vue
ижевск.талан.рф - Vue
a101.ru - Vue
enco.ru - другое
moskva.brusnika.ru - Vue
гкрасцветай.рф - другое
glorax.com - Vue
dars.ru - React

Ну как вам? Реакт - 4 сайта, VueJS - 12 сайтов. Сам не ожидал таких результатов, тут Вью опережает Реакт в 3 раза! Но обычно примерно 50/50 или даже чуть больше у Реакта.

Единственная сфера деятельности в России, где засилье Реакта - это банки. Так сложилось по историческим причинам, там началось всё с Реакта и остальные банки стали как обезьянки повторять и ставить себе Реакт тоже.

Многие React-разработчики просто не пробовали что-то другое. Я пробовал React, я пробовал Vue и сделал свой выбор в пользу второго. Стоит начать писать код на Vue и к React-у не захочется возвращаться.
Показать полностью...
+3
83

Firefox не чинит баг уже 13 лет

недавно
На Famabara появилась возможность перетаскивать мышкой части формы поста, если лень сортировать кнопками вверх/вниз. И, оказалось, что эта функция не работает в Firefox.
Багу 13 лет!!! Вы когда-нибудь видели, чтобы у популярного продукта не чинили баг столько времени? Пожалуйста:
https://bugzilla.mozilla.org/show_bug.cgi?id=739071

Если у предка стоит атрибут draggable="true", то клик мышкой по <textarea >или по <input type="text"> не позволит сфокусировать нормально в нужном месте текста. Мигающий промт возникнет или в начале текста или в том месте, где уже был до блюра.

<div draggable="true">
  <input value="Кликните в середину текста" type="text" />
</div>

Ну это совсем позорище! Багу поставили Priority: P3 и Severity: S3 (типа неважные вещи), а все дублирующие баг-репорты закрывают уже в течение 13 лет.

Есть одно решение, найденное в схожем багрепорте FF, но для contenteditable="true" - надо зажать Alt и кликнуть. Удобно, да? :)
+2
126

Живой сайт родом из 90-х

недавно
Давным-давно, лет 20-25 назад в Рунете было очень мало сайтов. И с тех времён я запомнил один интересный сайт о больших кошках - https://bigcats.ru

Недавно вспомнил о нём, и какое же было моё удивление, когда увидел, что сайт всё ещё работает. Мало того, дизайн не изменился с тех лет! Сейчас это не просто сайт, это мини-музей по сайтам из 90-х и нулевых.

Посмотрите на это чудо:
Меню - цветастенькое. Я помню на многих сайтах меню были вообще картинками сделаны, т.к. у всех были проблемы со шрифтами. Но здесь меню всё-таки текстовое.
Показать полностью...
+3
22

Иногда position: fixed может не работать

1 г. назад
Я матёрый веб-разраб, но иногда офигеваю, когда узнаю, что-то новое среди банальных вещей, которые по идее уже знаю больше десяти лет. Сейчас речь о CSS.

Вот вы знали, что position: fixed может не работать в некоторых редких случаях? Если у любого (!) предка задано, например, свойство transform, то всё, привет: блок с position: fixed уже привязывается не к вьюпорту. Хотя transform у элемента-предка мог быть задан всего лишь для сдвига какой-нибудь менюхи вбок или вообще для выравнивания position-absolute-блока по центру родителя. Но нет, уже не будет работать, таковы правила.

Аналогично ведут себя CSS свойства perspective, will-change или filter у любого из предка.

Век живи - век учись.
+4
116
1