Bun.password упрощает безопасное хеширование и проверку паролей.
Алгоритм, который используется для генерации хеша, хранится внутри самого хеша. Если используется bcrypt, возвращаемый хеш кодируется в Modular Crypt Format для совместимости с большинством существующих реализаций bcrypt. Если применяется argon2, результат кодируется в более новом PHC формате. Функция verify автоматически определяет алгоритм по входному хешу и использует правильный метод проверки. Она корректно определяет алгоритм как из PHC-, так и из MCF-кодированных хешей.
По умолчанию библиотека bcrypt обрезает пароли длиннее 72 байт. В Bun, если передать Bun.password.hash пароль длиннее 72 байт и использовать алгоритм bcrypt, пароль сначала будет захеширован через SHA-512, а затем уже отправлен в bcrypt. То есть вместо того чтобы отправить в bcrypt 500-байтный пароль, который без предупреждения обрежется до 72 байт, Bun сначала прогонит его через SHA-512 и передаст в bcrypt уже получившийся хеш (только если длина превышает 72 байта). Это более безопасное поведение по умолчанию.
@WebDev_Plus
Алгоритм, который используется для генерации хеша, хранится внутри самого хеша. Если используется bcrypt, возвращаемый хеш кодируется в Modular Crypt Format для совместимости с большинством существующих реализаций bcrypt. Если применяется argon2, результат кодируется в более новом PHC формате. Функция verify автоматически определяет алгоритм по входному хешу и использует правильный метод проверки. Она корректно определяет алгоритм как из PHC-, так и из MCF-кодированных хешей.
По умолчанию библиотека bcrypt обрезает пароли длиннее 72 байт. В Bun, если передать Bun.password.hash пароль длиннее 72 байт и использовать алгоритм bcrypt, пароль сначала будет захеширован через SHA-512, а затем уже отправлен в bcrypt. То есть вместо того чтобы отправить в bcrypt 500-байтный пароль, который без предупреждения обрежется до 72 байт, Bun сначала прогонит его через SHA-512 и передаст в bcrypt уже получившийся хеш (только если длина превышает 72 байта). Это более безопасное поведение по умолчанию.
@WebDev_Plus
❤4
This media is not supported in your browser
VIEW IN TELEGRAM
Отличный веб-компонент для создания эффекта спойлера на вашем веб-сайте. Совместим с React, Vue, Angular, Svelte и другими.
@WebDev_Plus
> npm install spoilerjs
@WebDev_Plus
❤3
This media is not supported in your browser
VIEW IN TELEGRAM
Шарь свой localhost кому угодно прямо из VS Code 🤯
В VS Code есть встроенная фишка с портами, которая позволяет открыть твой локальный сервер в интернет без всяких сторонних тулз.
Как это юзать:
Открой вкладку Ports в терминальной панели
Жми Forward a Port
Введи номер локального порта (у меня был 5173, у тебя может быть 3000, 3001 и т. д.)
VS Code сгенерит ссылку — правой кнопкой и Make Public
Копируй ссылку и кидай кому надо
Идеально для демо, тестов на других девайсах или чтобы показать работу клиентам и команде :)
В видео есть пошаговый разбор, как это делается👌
@WebDev_Plus
В VS Code есть встроенная фишка с портами, которая позволяет открыть твой локальный сервер в интернет без всяких сторонних тулз.
Как это юзать:
Открой вкладку Ports в терминальной панели
Жми Forward a Port
Введи номер локального порта (у меня был 5173, у тебя может быть 3000, 3001 и т. д.)
VS Code сгенерит ссылку — правой кнопкой и Make Public
Копируй ссылку и кидай кому надо
Идеально для демо, тестов на других девайсах или чтобы показать работу клиентам и команде :)
В видео есть пошаговый разбор, как это делается
@WebDev_Plus
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
Очень интересный ресурс для программистов и веб-дизайнеров. Инструмент для создания анимированных фонов с цветовыми градиентами.
https://www.krumzi.com/tools/animated-background-generator
@WebDev_Plus
https://www.krumzi.com/tools/animated-background-generator
@WebDev_Plus
Совет по NgRx на сегодня (и чуть вопрос)
Когда используешь
ты можешь подписаться на события из фичи, которая вообще не инжектит стор.
В таком случае стор может ещё не создаться, и события просто проглотятся😅
В целом логично, это стандартное поведение DI в Angular, но я почему-то предполагал, что в NgRx есть какая-то магия, которая из коробки стартует «глобальные» сторы (срезы состояния) заранее.
Решение: заинжектить глобальные сторы в app.config.ts (или core.ts), чтобы инстанс стора создавался с самого начала.
@WebDev_Plus
Когда используешь
@ngrx/signals/events с{ providedIn: 'root' }ты можешь подписаться на события из фичи, которая вообще не инжектит стор.
В таком случае стор может ещё не создаться, и события просто проглотятся
В целом логично, это стандартное поведение DI в Angular, но я почему-то предполагал, что в NgRx есть какая-то магия, которая из коробки стартует «глобальные» сторы (срезы состояния) заранее.
Решение: заинжектить глобальные сторы в app.config.ts (или core.ts), чтобы инстанс стора создавался с самого начала.
@WebDev_Plus
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Совет по JavaScript:
Можно обернуть аргументы console.log() в фигурные скобки, чтобы в выводе были видны имена переменных.
@WebDev_Plus
Можно обернуть аргументы console.log() в фигурные скобки, чтобы в выводе были видны имена переменных.
@WebDev_Plus
❤10👍4😁1
Насколько быстрый Bun?
Настолько, что он успел сломать настройку нашей тестовой базы, которая крутится в Docker-контейнере.
Bun выполнил SQL-запросы до того, как база вообще успела подняться. Пришлось прикрутить sleep(), чтобы дать контейнеру время стартануть.
Жесть. С pnpm такого никогда не было.
@WebDev_Plus
Настолько, что он успел сломать настройку нашей тестовой базы, которая крутится в Docker-контейнере.
Bun выполнил SQL-запросы до того, как база вообще успела подняться. Пришлось прикрутить sleep(), чтобы дать контейнеру время стартануть.
Жесть. С pnpm такого никогда не было.
@WebDev_Plus
❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Держите полезную CLI-утилиту — npkill, предназначенную для удаления всех папок
Позволяет освободить значительное количество места на диске
Запускаешь команду:
Дальше, просто нажимаешь [
Удобно ещё и то, что она показывает, сколько дней назад была последняя модификация
@WebDev_Plus
node_modules в проектах.Позволяет освободить значительное количество места на диске
Запускаешь команду:
npx npkill
Дальше, просто нажимаешь [
Пробел], чтобы удалить те папки, которые больше не используешьУдобно ещё и то, что она показывает, сколько дней назад была последняя модификация
@WebDev_Plus
❤4
TypeScript: единый источник для значений, меток и сравнений
@WebDev_Plus
export const ORDER_TYPES = {
product: "Product Order",
service: "Service Order",
} as const;
// Тип, представляющий ключи ORDER_TYPES
export type OrderType = keyof typeof ORDER_TYPES;
// Опции для дропдауна
export const ORDER_TYPE_OPTIONS = Object.entries(ORDER_TYPES).map(
([value, label]) => ({ value: value as OrderType, label }),
);
// Пример использования:
// - Сравнение: if (type === "product")
// - Получить метку: ORDER_TYPES[type]
// - Для дропдауна: <Select options={ORDER_TYPE_OPTIONS} />@WebDev_Plus
❤3
This media is not supported in your browser
VIEW IN TELEGRAM
CSS карточка с параллакс-эффектом через pointermove и кастомные CSS-переменные
Фишка: координаты курсора мапятся в поворот карточки по 3D-оси,
а кольца двигаются по 2D-плоскости для создания иллюзии объёма🤙
@WebDev_Plus
<div class="ring" style="--i: 2">
.ring {
translate: calc(var(--px) * (var(--i) * -2rem))
calc(var(--py) * (var(--i) * 2rem));
}
Фишка: координаты курсора мапятся в поворот карточки по 3D-оси,
а кольца двигаются по 2D-плоскости для создания иллюзии объёма
@WebDev_Plus
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6
JavaScript может форматировать числа гораздо умнее, чем вы думаете
@WebDev_Plus
// Intl.NumberFormat — форматирование чисел: единицы измерения, сокращения, валюты
// Пример форматирования со скоростью (единицы измерения)
const numberFmt = new Intl.NumberFormat("en", {
style: "unit", // стиль "единица измерения"
unit: "kilometer-per-hour", // километры в час
});
// Пример форматирования в компактной форме (например, "15.3K" вместо "15320")
const compactFmt = new Intl.NumberFormat("en", {
notation: "compact", // компактная запись (K, M и т. д.)
maximumFractionDigits: 1, // максимум 1 знак после запятой
});
// Пример форматирования валюты (йены, без округления вверх)
const currencyFmt = new Intl.NumberFormat("en", {
style: "currency", // стиль "валюта"
currency: "JPY", // японская йена
roundingMode: "floor", // округление вниз
});
// Примеры вывода
console.log(numberFmt.format(88)); // "88 km/h"
console.log(compactFmt.format(15320)); // "15.3K"
console.log(currencyFmt.format(4999.99)); // "¥4,999"
@WebDev_Plus
❤1👍1
Сегодня узнал про предложение в JS под названием Declarations in Conditionals.
Оно позволяет писать const или let прямо внутри if или while.
Интересно, стал бы ты так писать?
Мне кажется, идея неплохая — код станет чуть короче, но при этом останется понятным.
(Сейчас это Stage 1 в TC39, на следующей неделе будут выносить на Stage 2.)
@WebDev_Plus
Оно позволяет писать const или let прямо внутри if или while.
Интересно, стал бы ты так писать?
Мне кажется, идея неплохая — код станет чуть короче, но при этом останется понятным.
(Сейчас это Stage 1 в TC39, на следующей неделе будут выносить на Stage 2.)
@WebDev_Plus
👍1
Хватит использовать TypeScript enum'ы.
Почему?
Enum'ы добавляют скрытый код в итоговый файл, тогда как as const — вообще ничего не добавляет.
Типы лучше, бандл меньше.
@WebDev_Plus
Почему?
Enum'ы добавляют скрытый код в итоговый файл, тогда как as const — вообще ничего не добавляет.
Типы лучше, бандл меньше.
@WebDev_Plus
❤5
This media is not supported in your browser
VIEW IN TELEGRAM
Разработчик показал, как современные браузеры позволяют обходиться без фреймворков
Один из разработчиков продемонстрировал, что даже сегодня можно писать сайты в духе начала 2000-х — на чистом HTML и CSS, без React, Vue или других фреймворков. Он собрал небольшой сервер на Deno, который рендерит обычные HTML-страницы без роутинга и сложной логики.
Интересно, что навигация между страницами выглядит плавной: панель навигации не мигает при перезагрузке благодаря технологии paint holding, поддерживаемой браузерами уже много лет.
Кроме того, разработчик добавил эффект перехода с помощью CSS-директивы
что сделало переходы между страницами ещё приятнее.
По его словам, современные браузеры стали настолько умными, что History API уже не нужен для плавной навигации — достаточно обычных ссылок и немного прогрессивного улучшения через HTML Custom Elements.
@WebDev_Plus
Один из разработчиков продемонстрировал, что даже сегодня можно писать сайты в духе начала 2000-х — на чистом HTML и CSS, без React, Vue или других фреймворков. Он собрал небольшой сервер на Deno, который рендерит обычные HTML-страницы без роутинга и сложной логики.
Интересно, что навигация между страницами выглядит плавной: панель навигации не мигает при перезагрузке благодаря технологии paint holding, поддерживаемой браузерами уже много лет.
Кроме того, разработчик добавил эффект перехода с помощью CSS-директивы
@view-transition { navigation: auto; }что сделало переходы между страницами ещё приятнее.
По его словам, современные браузеры стали настолько умными, что History API уже не нужен для плавной навигации — достаточно обычных ссылок и немного прогрессивного улучшения через HTML Custom Elements.
@WebDev_Plus
❤3
Похоже, маленькая скромная компания Apple забыла вырубить сорсмапы в проде, и в итоге энтузиасты раскопали полную структуру фронтенда App Store.
В сеть попал исходник на Svelte и TypeScript — со всей логикой, компонентами, стилями и даже комментариями разработчиков Apple. Всё это аккуратно собрано и выложено на GitHub «для образовательных целей».
Кто хочет поглазеть - вот: https://github.com/rxliuli/apps.apple.com
@WebDev_Plus
В сеть попал исходник на Svelte и TypeScript — со всей логикой, компонентами, стилями и даже комментариями разработчиков Apple. Всё это аккуратно собрано и выложено на GitHub «для образовательных целей».
Кто хочет поглазеть - вот: https://github.com/rxliuli/apps.apple.com
@WebDev_Plus
❤4
Стартап переписал весь свой Python-бэкенд на Node.js… всего через неделю после запуска продукта.
Причина? Снизить латентность, улучшить асинхронность и лучше справляться с конкуренцией запросов.
Значит ли это, что Node лучше Python?
Нет. Это значит, что идеального стека не существует, но технические решения реально имеют значение, когда ты понимаешь их ограничения.
И статья, в которой они объясняют причины, просто жемчужина.
https://blog.yakkomajuri.com/blog/python-to-node
Опять же, это их случай. Это не значит, что это ваш случай. Но аргументы очень убедительны, и я думаю, что из этих случаев можно извлечь немало полезного.
@WebDev_Plus
Причина? Снизить латентность, улучшить асинхронность и лучше справляться с конкуренцией запросов.
Значит ли это, что Node лучше Python?
Нет. Это значит, что идеального стека не существует, но технические решения реально имеют значение, когда ты понимаешь их ограничения.
И статья, в которой они объясняют причины, просто жемчужина.
https://blog.yakkomajuri.com/blog/python-to-node
Опять же, это их случай. Это не значит, что это ваш случай. Но аргументы очень убедительны, и я думаю, что из этих случаев можно извлечь немало полезного.
@WebDev_Plus
❤1
Довольно дико, насколько лучше Angular стал со временем благодаря treeshaking.
610 KB, но там уже есть всё, что нужно для нормальной разработки:
✅ NgRx signals store (с events plugin, по сути как redux)
✅ Tailwind для адаптивной сетки и стилей
✅ Angular Material 3 + тема
✅ Signal forms
@WebDev_Plus
610 KB, но там уже есть всё, что нужно для нормальной разработки:
@WebDev_Plus
Please open Telegram to view this post
VIEW IN TELEGRAM