Preventing and Debugging Memory Leaks in Node.js
Большая и обстоятельная статья про работу с утечками памяти в node.js. Статья буквально начинается с объяснения механизма выделения памяти в node.js, проходит через основные паттерны утечек памяти и заканчивается на примерах нахождения предотвращения утечек
Статью можно разделить на несколько разделов. Первый раздел: про то, что память выделяется на stack'е (переменные) и heap'е (все данные с динамичным размером) и механизм работы Garbage Collector
Далее статья рассказывает про основные источники утечек памяти:
- Глобальные объекты и переменные
- Замыкания
- Таймеры
После этого - исследование причин утечек памяти. Для начала автор показывает способ с получением дампа памяти через v8 через отправку процессу node.js специальный сигнал. Собираем дамп до нагрузки, собираем дамп после нагрузки, а затем анализируем разницу с помощью Chrome Dev Tools. В статье автор подробно показывает как собрать дампы и работать с дельтой двух снапшотов.
Но мало уметь писать хороший код и искать утечки с помощью современных инструментов. Необходимо также настроить автоматический мониторинг. Для этого можно использовать prometheus - один из популярнейших тулов для мониторинга состояния приложений.
В общем, очень хорошая статья про утечки памяти в node.js. Рекомендую к подробному изучению.
https://betterstack.com/community/guides/scaling-nodejs/high-performance-nodejs/nodejs-memory-leaks/
#development #recommended #nodejs #performance #memoryLeak
Большая и обстоятельная статья про работу с утечками памяти в node.js. Статья буквально начинается с объяснения механизма выделения памяти в node.js, проходит через основные паттерны утечек памяти и заканчивается на примерах нахождения предотвращения утечек
Статью можно разделить на несколько разделов. Первый раздел: про то, что память выделяется на stack'е (переменные) и heap'е (все данные с динамичным размером) и механизм работы Garbage Collector
Далее статья рассказывает про основные источники утечек памяти:
- Глобальные объекты и переменные
- Замыкания
- Таймеры
После этого - исследование причин утечек памяти. Для начала автор показывает способ с получением дампа памяти через v8 через отправку процессу node.js специальный сигнал. Собираем дамп до нагрузки, собираем дамп после нагрузки, а затем анализируем разницу с помощью Chrome Dev Tools. В статье автор подробно показывает как собрать дампы и работать с дельтой двух снапшотов.
Но мало уметь писать хороший код и искать утечки с помощью современных инструментов. Необходимо также настроить автоматический мониторинг. Для этого можно использовать prometheus - один из популярнейших тулов для мониторинга состояния приложений.
В общем, очень хорошая статья про утечки памяти в node.js. Рекомендую к подробному изучению.
https://betterstack.com/community/guides/scaling-nodejs/high-performance-nodejs/nodejs-memory-leaks/
#development #recommended #nodejs #performance #memoryLeak
Betterstack
Preventing and Debugging Memory Leaks in Node.js | Better Stack Community
Learn about Node.js memory leaks and their causes, how to debug and fix them,
prevention best practices, methods for monitoring leaks.
prevention best practices, methods for monitoring leaks.
👍12🔥5
The Bun Shell
Каждый раз, когда необходимо написать код для какого-нибудь cli-скрипта, у нас есть 2 классических стула: писать скрипт на bash или писать скрипт на чистом node.js. Оба способа неудобны. Скрипты на bash (или powershell на windows) писать сложно т.к. там неудобный синтаксис, их сложно дебажить и поддерживать. Писать скрипты на чистом JS удобно, пока не приходится работать с окружением: вызывать существующие бинари (например
Bun Shell - это экспериментальный язык и интерпретатор в рамках Bun, который позволяет выполнять кросс-платформенные shell-скрипты на JavaScript и TypeScript. Он упрощает выполнение shell-команд и написание скриптов, делая их более доступными и легкими в использовании по сравнению с традиционными методами. Bun Shell хорошо интегрируется с shell системы.
Вместо тысячи слов, примеры использования Bun Shell
Использование бинарей из системы:
Использование переменных в командах. Обратите внимание, что
Также весьма примечательно, что сделана интеграция с системой пайпов и потоков
Сам Bun не решается сравнивать свое решение с zx, но сравнение так и напрашивается. Я не очень хорошо помню все фишки zx, хотя использовать его приходилось. Но основная, на мой взгляд, фишка Bun Shell - это то, что он идет вместе с Bun из коробки. Никаких дополнительных пакетов, шагов установки - если у вас есть Bun, значит у вас есть и Bun Shell. И это круто.
https://bun.sh/blog/the-bun-shell
#development #bun #shell
Каждый раз, когда необходимо написать код для какого-нибудь cli-скрипта, у нас есть 2 классических стула: писать скрипт на bash или писать скрипт на чистом node.js. Оба способа неудобны. Скрипты на bash (или powershell на windows) писать сложно т.к. там неудобный синтаксис, их сложно дебажить и поддерживать. Писать скрипты на чистом JS удобно, пока не приходится работать с окружением: вызывать существующие бинари (например
ls
) или работать с файловой системой. Очевидное решение - сделать инструмент на JS, который берет сильные стороны JS и bash. Один такой мы уже знает - zx
от Google. Теперь же появился еще 1 инструмент от команды Bun - Bun Shell.Bun Shell - это экспериментальный язык и интерпретатор в рамках Bun, который позволяет выполнять кросс-платформенные shell-скрипты на JavaScript и TypeScript. Он упрощает выполнение shell-команд и написание скриптов, делая их более доступными и легкими в использовании по сравнению с традиционными методами. Bun Shell хорошо интегрируется с shell системы.
Вместо тысячи слов, примеры использования Bun Shell
Использование бинарей из системы:
import { $ } from "bun";
// to stdout:
await $`ls *.js`;
// to string:
const text = await $`ls *.js`.text();
Использование переменных в командах. Обратите внимание, что
filename
содержит в себе преднамеренную ошибку - если вставить значение переменной в команду as is, можно нечаянно грохнуть всю файловую систему на unix-like системах. Однако bun делает безопасную вставку. const filename = "foo.js; rm -rf /";
// This will run `ls 'foo.js; rm -rf /'`
const results = await $`ls ${filename}`;
console.log(results.exitCode); // 1
console.log(results.stderr.toString()); // ls: cannot access 'foo.js; rm -rf /': No such file or directory
Также весьма примечательно, что сделана интеграция с системой пайпов и потоков
import { $ } from "bun";
const buffer = new Response("bar
foo
bar
foo
");
await $`grep foo < ${buffer}`;
Сам Bun не решается сравнивать свое решение с zx, но сравнение так и напрашивается. Я не очень хорошо помню все фишки zx, хотя использовать его приходилось. Но основная, на мой взгляд, фишка Bun Shell - это то, что он идет вместе с Bun из коробки. Никаких дополнительных пакетов, шагов установки - если у вас есть Bun, значит у вас есть и Bun Shell. И это круто.
https://bun.sh/blog/the-bun-shell
#development #bun #shell
Bun
The Bun Shell
The Bun Shell is a cross-platform shell that allows you to run shell scripts in JavaScript & TypeScript
👍15
Все оценки сроков разработки ПО — ложь
Перевод большой статья про одну из больших проблем современной разработки: всем нужны оценки, но все оценки врут. В статье мысль немного растекается по древу, используются отсылки к лучшим практикам индустрии и лозунгам. Но в целом мысль такова: разработка - это бесконечное исследование. А исследования очень сложно оценивать (т.к. всегда присутствует неопределенность). Поэтому оценки всегда врут, но на их основе может строиться стратегия всей компании. Оценку создают ложную уверенность в том, что мы можем спланировать работу на долгий срок.
Автор не утверждает, что оценки не нужны вообще. Есть задачи, для которых оценки очень важны - это задачи с реальными дедлайнами или требующие синхронизации с другими компаниями или командами. Но вместо использования сложных схем с получением оценок и применением их для планирования, следует сконцентрироваться на эффективном донесении ценности, прозрачности и максимально простом процессе оценивания (например, NoEstimates)
https://habr.com/ru/companies/ruvds/articles/787058/
#managment #estimation #noEstimates
Перевод большой статья про одну из больших проблем современной разработки: всем нужны оценки, но все оценки врут. В статье мысль немного растекается по древу, используются отсылки к лучшим практикам индустрии и лозунгам. Но в целом мысль такова: разработка - это бесконечное исследование. А исследования очень сложно оценивать (т.к. всегда присутствует неопределенность). Поэтому оценки всегда врут, но на их основе может строиться стратегия всей компании. Оценку создают ложную уверенность в том, что мы можем спланировать работу на долгий срок.
Автор не утверждает, что оценки не нужны вообще. Есть задачи, для которых оценки очень важны - это задачи с реальными дедлайнами или требующие синхронизации с другими компаниями или командами. Но вместо использования сложных схем с получением оценок и применением их для планирования, следует сконцентрироваться на эффективном донесении ценности, прозрачности и максимально простом процессе оценивания (например, NoEstimates)
https://habr.com/ru/companies/ruvds/articles/787058/
#managment #estimation #noEstimates
Хабр
Все оценки сроков разработки ПО — ложь
▍ Разработка ПО — это исследование Требуют ли фармацевтические компании от исследователей сообщить им сроки создания лекарства от рака? Исследователи могут сообщить сроки выполнения конкретного...
👍14
Delicious Donut Components
Статья про композицию клиентских и серверных компонентов в React. Статья, в основном, фокусируется вокруг паттерна Donut Components (Пончиковые Компоненты). Серверные компоненты не могут импортироваться и использоваться в клиентских компонентах. Но можно прокидывать серверный компонент как child для клиентского. Это и есть паттерн пончика (извините, не могу удержаться от использования этого словосочетания на русском языке)
Статья содержит наглядные интерактивные примеры паттернов композиции компонентов, объясняет про проблемы передачи данных между серверными и клиентскими компонентами. Отдельно отмечу, что некоторые паттерны достаточно интересные. Например, прокидывание серверного экшна (могу ошибиться т.к. не до конца разбираюсь в терминологии Nextjs) в рендер-проп клиентского компонента.
https://frontendatscale.com/blog/donut-components/
#development #react #reactServerComponents
Статья про композицию клиентских и серверных компонентов в React. Статья, в основном, фокусируется вокруг паттерна Donut Components (Пончиковые Компоненты). Серверные компоненты не могут импортироваться и использоваться в клиентских компонентах. Но можно прокидывать серверный компонент как child для клиентского. Это и есть паттерн пончика (извините, не могу удержаться от использования этого словосочетания на русском языке)
Статья содержит наглядные интерактивные примеры паттернов композиции компонентов, объясняет про проблемы передачи данных между серверными и клиентскими компонентами. Отдельно отмечу, что некоторые паттерны достаточно интересные. Например, прокидывание серверного экшна (могу ошибиться т.к. не до конца разбираюсь в терминологии Nextjs) в рендер-проп клиентского компонента.
https://frontendatscale.com/blog/donut-components/
#development #react #reactServerComponents
Frontendatscale
Delicious Donut Components | Frontend at Scale
An interactive guide to component composition with React Server Components
👍6
TypeSpec
Команда TypeScript зарелизила инструмент для описания контрактов - TypeSpec. TypeSpec позволяет описывать контракты в удобном синтаксисе, очень похожем на TypeScript, а затем компилировать их в openapi-спеку, json schema и даже protobuf. Как я понял, можно написать свой компилятор, если вам нужно компилировать контракт во что-то еще (например в роуты nest.js)
Вот как описывается простой контроллер
https://typespec.io
#development #typespec #openapi #typescript #swagger #protobuf #jsonSchema
Команда TypeScript зарелизила инструмент для описания контрактов - TypeSpec. TypeSpec позволяет описывать контракты в удобном синтаксисе, очень похожем на TypeScript, а затем компилировать их в openapi-спеку, json schema и даже protobuf. Как я понял, можно написать свой компилятор, если вам нужно компилировать контракт во что-то еще (например в роуты nest.js)
Вот как описывается простой контроллер
import "@typespec/http";
using TypeSpec.Http;
model Pet {
name: string;
age: int32;
}
@route("/pets")
interface Pets {
list(@query filter: string): Pet[];
create(@body pet: Pet): Pet;
read(@path id: string): Pet;
}
https://typespec.io
#development #typespec #openapi #typescript #swagger #protobuf #jsonSchema
🔥15❤3
Дайджест за 2024-01-29 - 2024-02-02
⭐Preventing and Debugging Memory Leaks in Node.js
Большая и обстоятельная статья про работу с утечками памяти в node.js. Статья буквально начинается с объяснения механизма выделения памяти в node.js, проходит через основные паттерны утечек памяти и заканчивается на примерах нахождения предотвращения утечек
Статью можно разделить на несколько разделов. Первый раздел: про то, что память выделяется на stack'е (переменные) и heap'е (все данные с динамичным размером) и механизм работы Garbage Collector
The Bun Shell
Каждый раз, когда необходимо написать код для какого-нибудь cli-скрипта, у нас есть 2 классических стула: писать скрипт на bash или писать скрипт на чистом node.js. Оба способа неудобны. Скрипты на bash (или powershell на windows) писать сложно т.к. там неудобный синтаксис, их сложно дебажить и поддерживать. Писать скрипты на чистом JS удобно, пока не приходится работать с окружением: вызывать существующие бинари (например ls) или работать с файловой системой. Очевидное решение - сделать инструмент на JS, который берет сильные стороны JS и bash. Один такой мы уже знает - zx от Google. Теперь же появился еще 1 инструмент от команды Bun - Bun Shell.
Bun Shell - это экспериментальный язык и интерпретатор в рамках Bun, который позволяет выполнять кросс-платформенные shell-скрипты на JavaScript и TypeScript. Он упрощает выполнение shell-команд и написание скриптов, делая их более доступными и легкими в использовании по сравнению с традиционными методами. Bun Shell хорошо интегрируется с shell системы.
Все оценки сроков разработки ПО — ложь
Перевод большой статья про одну из больших проблем современной разработки: всем нужны оценки, но все оценки врут. В статье мысль немного растекается по древу, используются отсылки к лучшим практикам индустрии и лозунгам. Но в целом мысль такова: разработка - это бесконечное исследование. А исследования очень сложно оценивать (т.к. всегда присутствует неопределенность). Поэтому оценки всегда врут, но на их основе может строиться стратегия всей компании. Оценку создают ложную уверенность в том, что мы можем спланировать работу на долгий срок.
Автор не утверждает, что оценки не нужны вообще. Есть задачи, для которых оценки очень важны - это задачи с реальными дедлайнами или требующие синхронизации с другими компаниями или командами. Но вместо использования сложных схем с получением оценок и применением их для планирования, следует сконцентрироваться на эффективном донесении ценности, прозрачности и максимально простом процессе оценивания (например, NoEstimates)
Delicious Donut Components
Статья про композицию клиентских и серверных компонентов в React. Статья, в основном, фокусируется вокруг паттерна Donut Components (Пончиковые Компоненты). Серверные компоненты не могут импортироваться и использоваться в клиентских компонентах. Но можно прокидывать серверный компонент как child для клиентского. Это и есть паттерн пончика (извините, не могу удержаться от использования этого словосочетания на русском языке)
Статья содержит наглядные интерактивные примеры паттернов композиции компонентов, объясняет про проблемы передачи данных между серверными и клиентскими компонентами. Отдельно отмечу, что некоторые паттерны достаточно интересные. Например, прокидывание серверного экшна (могу ошибиться т.к. не до конца разбираюсь в терминологии Nextjs) в рендер-проп клиентского компонента.
TypeSpec
Команда TypeScript зарелизила инструмент для описания контрактов - TypeSpec. TypeSpec позволяет описывать контракты в удобном синтаксисе, очень похожем на TypeScript, а затем компилировать их в openapi-спеку, json schema и даже protobuf. Как я понял, можно написать свой компилятор, если вам нужно компилировать контракт во что-то еще (например в роуты nest.js)
——————————————
Спасибо что читаете, ставите реакции и отмечаетесь в комментариях. Если вы хотите помочь каналу - расскажите о нем своим коллегамдрузьям. Также оставляйте фидбек по формату, материалу и чему-угодно еще 🙂
⭐Preventing and Debugging Memory Leaks in Node.js
Большая и обстоятельная статья про работу с утечками памяти в node.js. Статья буквально начинается с объяснения механизма выделения памяти в node.js, проходит через основные паттерны утечек памяти и заканчивается на примерах нахождения предотвращения утечек
Статью можно разделить на несколько разделов. Первый раздел: про то, что память выделяется на stack'е (переменные) и heap'е (все данные с динамичным размером) и механизм работы Garbage Collector
The Bun Shell
Каждый раз, когда необходимо написать код для какого-нибудь cli-скрипта, у нас есть 2 классических стула: писать скрипт на bash или писать скрипт на чистом node.js. Оба способа неудобны. Скрипты на bash (или powershell на windows) писать сложно т.к. там неудобный синтаксис, их сложно дебажить и поддерживать. Писать скрипты на чистом JS удобно, пока не приходится работать с окружением: вызывать существующие бинари (например ls) или работать с файловой системой. Очевидное решение - сделать инструмент на JS, который берет сильные стороны JS и bash. Один такой мы уже знает - zx от Google. Теперь же появился еще 1 инструмент от команды Bun - Bun Shell.
Bun Shell - это экспериментальный язык и интерпретатор в рамках Bun, который позволяет выполнять кросс-платформенные shell-скрипты на JavaScript и TypeScript. Он упрощает выполнение shell-команд и написание скриптов, делая их более доступными и легкими в использовании по сравнению с традиционными методами. Bun Shell хорошо интегрируется с shell системы.
Все оценки сроков разработки ПО — ложь
Перевод большой статья про одну из больших проблем современной разработки: всем нужны оценки, но все оценки врут. В статье мысль немного растекается по древу, используются отсылки к лучшим практикам индустрии и лозунгам. Но в целом мысль такова: разработка - это бесконечное исследование. А исследования очень сложно оценивать (т.к. всегда присутствует неопределенность). Поэтому оценки всегда врут, но на их основе может строиться стратегия всей компании. Оценку создают ложную уверенность в том, что мы можем спланировать работу на долгий срок.
Автор не утверждает, что оценки не нужны вообще. Есть задачи, для которых оценки очень важны - это задачи с реальными дедлайнами или требующие синхронизации с другими компаниями или командами. Но вместо использования сложных схем с получением оценок и применением их для планирования, следует сконцентрироваться на эффективном донесении ценности, прозрачности и максимально простом процессе оценивания (например, NoEstimates)
Delicious Donut Components
Статья про композицию клиентских и серверных компонентов в React. Статья, в основном, фокусируется вокруг паттерна Donut Components (Пончиковые Компоненты). Серверные компоненты не могут импортироваться и использоваться в клиентских компонентах. Но можно прокидывать серверный компонент как child для клиентского. Это и есть паттерн пончика (извините, не могу удержаться от использования этого словосочетания на русском языке)
Статья содержит наглядные интерактивные примеры паттернов композиции компонентов, объясняет про проблемы передачи данных между серверными и клиентскими компонентами. Отдельно отмечу, что некоторые паттерны достаточно интересные. Например, прокидывание серверного экшна (могу ошибиться т.к. не до конца разбираюсь в терминологии Nextjs) в рендер-проп клиентского компонента.
TypeSpec
Команда TypeScript зарелизила инструмент для описания контрактов - TypeSpec. TypeSpec позволяет описывать контракты в удобном синтаксисе, очень похожем на TypeScript, а затем компилировать их в openapi-спеку, json schema и даже protobuf. Как я понял, можно написать свой компилятор, если вам нужно компилировать контракт во что-то еще (например в роуты nest.js)
——————————————
Спасибо что читаете, ставите реакции и отмечаетесь в комментариях. Если вы хотите помочь каналу - расскажите о нем своим коллегамдрузьям. Также оставляйте фидбек по формату, материалу и чему-угодно еще 🙂
👍12🔥1
Knip v4
Вышла 4 версия инструмента knip. Я уже писал о нем в канале - это инструмент для нахождения в проекте неиспользуемого кода. Легко встраивается в CI и быстро начинает приносить пользу. В новой версии не особо много изменений, но самое важное из них - knip теперь работает на 80% быстрее (видимо, в том числе благодаря другому изменению - теперь knip по-дефолту не анализирует использование свойств класса т.к. это требует много ресурсов)
https://knip.dev/blog/knip-v4
#development #javascript #knip #releaseNotes
Вышла 4 версия инструмента knip. Я уже писал о нем в канале - это инструмент для нахождения в проекте неиспользуемого кода. Легко встраивается в CI и быстро начинает приносить пользу. В новой версии не особо много изменений, но самое важное из них - knip теперь работает на 80% быстрее (видимо, в том числе благодаря другому изменению - теперь knip по-дефолту не анализирует использование свойств класса т.к. это требует много ресурсов)
https://knip.dev/blog/knip-v4
#development #javascript #knip #releaseNotes
Knip
Announcing Knip v4
👍19
The AHA Stack
Большой сайт, посвященный AHA-стеку: Astro + htmx + alpine.js. Если коротко, то основная идея стека крутится вокруг старого доброго веба, где сайты были легки, не было кучи JS в браузере, а основную работу делали серверы. Но все это с новым удобным и современным тулингом.
https://ahastack.dev
#development #javascript #aha #astro #htmx #alpinejs
Большой сайт, посвященный AHA-стеку: Astro + htmx + alpine.js. Если коротко, то основная идея стека крутится вокруг старого доброго веба, где сайты были легки, не было кучи JS в браузере, а основную работу делали серверы. Но все это с новым удобным и современным тулингом.
https://ahastack.dev
#development #javascript #aha #astro #htmx #alpinejs
AHA
The AHA Stack
The AHA Stack is a collection of technologies that work together to create a full-stack web application framework.
👍8💩7😁1
The Golden Rule of Assertions
Часто можно услышать правило "один тест - одна проверка". Проблема с этим утверждением, что его часто понимают слишком буквально, что приводит к проблемам. В статье предлагается еще 1 правило "A test must fail if, and only if, the intention behind the system is not met." (Тест должен упасть только тогда, когда намерение, заложенное в системе, не достигнуто).
Для понимания сути правила, автор приводит 2 примера его нарушения:
- Проверка внутренней имплементации, вместо внешнего поведения
- Нарушение границ теста
Пример проверки внутренней имплементации:
С границами теста пример не такой простой. Допустим, есть функция, делающая сетевой запрос
Мы можем написать тест, который будет исполнять этот сетевой запрос (без мокирования сети). Тестируемая нами логика (намерение системы): сделать правильный запрос и правильно его обработать. Но тест может упасть даже в том случае, если логика корректна. Например, если будут сетевые проблемы
Эту проблему можно обойти разными способами. Например, замокировав сеть.
https://www.epicweb.dev/the-golden-rule-of-assertions
#development #javascript #testing #assertions
Часто можно услышать правило "один тест - одна проверка". Проблема с этим утверждением, что его часто понимают слишком буквально, что приводит к проблемам. В статье предлагается еще 1 правило "A test must fail if, and only if, the intention behind the system is not met." (Тест должен упасть только тогда, когда намерение, заложенное в системе, не достигнуто).
Для понимания сути правила, автор приводит 2 примера его нарушения:
- Проверка внутренней имплементации, вместо внешнего поведения
- Нарушение границ теста
Пример проверки внутренней имплементации:
parseCookieName
использует внутри себя cookieUtils
. Тест проверяет, что cookieUtils
вызывается корректно, при вызове parseCookieName
. Этот тест проверяет имплементацию, а поэтому упадет, когда имплементацию изменят. Например, cookieUtils
будет заменен на библиотеку из npmimport { parseCookieName } from './parseCookieName'
import { cookieUtils } from './utils'
it('returns the cookie name from the given cookie', () => {
const cookieName = parseCookieName('sessionId=abc-123')
expect(cookieUtils.parse).toHaveBeenCalledWith(
'sessionId=abc-123',
{ pick: ['name'] }
)
expect(cookieName).toBe('sessionId')
})
С границами теста пример не такой простой. Допустим, есть функция, делающая сетевой запрос
export async function fetchUser(id) {
const response = await fetch(`https://example.com/user?id=${id}`)
const user = await response.json()
return user
}
Мы можем написать тест, который будет исполнять этот сетевой запрос (без мокирования сети). Тестируемая нами логика (намерение системы): сделать правильный запрос и правильно его обработать. Но тест может упасть даже в том случае, если логика корректна. Например, если будут сетевые проблемы
import { fetchUser } from './fetchUser'
it('fetches the user by id', async () => {
const user = await fetchUser('abc-123')
expect(user).toEqual({ name: 'Cody' })
})
Эту проблему можно обойти разными способами. Например, замокировав сеть.
https://www.epicweb.dev/the-golden-rule-of-assertions
#development #javascript #testing #assertions
Epic Web Dev
The Golden Rule of Assertions
Learn about The Golden Rule of Assertions that helps pinpoint good tests from bad ones.
🔥4👍2
Heat.js - JavaScript Heat Map
Heat.js - библиотека для визуализации данных в виде Heat Map. Heat Map - это визуализация, которую вы можете видеть на github или gitlab, просматривая свою активность по созданию коммитов в разрезе дней. Библиотека поддерживает разные кастомизации: цвета, кнопки, текста, отступы. А также есть разные фичи. Например, экспорт в csv.
https://www.william-troup.com/heat-js/
#development #javascript #library
Heat.js - библиотека для визуализации данных в виде Heat Map. Heat Map - это визуализация, которую вы можете видеть на github или gitlab, просматривая свою активность по созданию коммитов в разрезе дней. Библиотека поддерживает разные кастомизации: цвета, кнопки, текста, отступы. А также есть разные фичи. Например, экспорт в csv.
https://www.william-troup.com/heat-js/
#development #javascript #library
Heat.js - JavaScript Heat Map
A powerful Heat Map and Chart. With tons of settings, Heat.js can be tailored to suit your every need. Lightweight. Learn more.
👍7
qr-code - web-component, реализующий анимированные QR-коды
Интересная библиотека для отрисовке QR-кодов. Библиотека позволяет делать анимированные QR-коды на svg, но при этом все API представляет собой web-компонент. Демка на странице проекта выглядит весьма хорошо.
https://github.com/bitjson/qr-code
#development #javascript #library
Интересная библиотека для отрисовке QR-кодов. Библиотека позволяет делать анимированные QR-коды на svg, но при этом все API представляет собой web-компонент. Демка на странице проекта выглядит весьма хорошо.
https://github.com/bitjson/qr-code
#development #javascript #library
GitHub
GitHub - bitjson/qr-code: A no-framework, no-dependencies, customizable, animate-able, SVG-based <qr-code> HTML element.
A no-framework, no-dependencies, customizable, animate-able, SVG-based <qr-code> HTML element. - bitjson/qr-code
👍11
Дайджест за 2024-02-05 - 2024-02-09
Knip v4
Вышла 4 версия инструмента knip. Я уже писал о нем в канале - это инструмент для нахождения в проекте неиспользуемого кода. Легко встраивается в CI и быстро начинает приносить пользу. В новой версии не особо много изменений, но самое важное из них - knip теперь работает на 80% быстрее (видимо, в том числе благодаря другому изменению - теперь knip по-дефолту не анализирует использование свойств класса т.к. это требует много ресурсов)
The AHA Stack
Большой сайт, посвященный AHA-стеку: Astro + htmx + alpine.js. Если коротко, то основная идея стека крутится вокруг старого доброго веба, где сайты были легки, не было кучи JS в браузере, а основную работу делали серверы. Но все это с новым удобным и современным тулингом.
The Golden Rule of Assertions
Часто можно услышать правило "один тест - одна проверка". Проблема с этим утверждением, что его часто понимают слишком буквально, что приводит к проблемам. В статье предлагается еще 1 правило "A test must fail if, and only if, the intention behind the system is not met." (Тест должен упасть только тогда, когда намерение, заложенное в системе, не достигнуто).
Heat.js - JavaScript Heat Map
Heat.js - библиотека для визуализации данных в виде Heat Map. Heat Map - это визуализация, которую вы можете видеть на github или gitlab, просматривая свою активность по созданию коммитов в разрезе дней. Библиотека поддерживает разные кастомизации: цвета, кнопки, текста, отступы. А также есть разные фичи. Например, экспорт в csv.
qr-code - web-component, реализующий анимированные QR-коды
Интересная библиотека для отрисовке QR-кодов. Библиотека позволяет делать анимированные QR-коды на svg, но при этом все API представляет собой web-компонент. Демка на странице проекта выглядит весьма хорошо.
——————————————
Спасибо что читаете, ставите реакции и отмечаетесь в комментариях. Если вы хотите помочь каналу - расскажите о нем своим коллегамдрузьям. Также оставляйте фидбек по формату, материалу и чему-угодно еще 🙂
Knip v4
Вышла 4 версия инструмента knip. Я уже писал о нем в канале - это инструмент для нахождения в проекте неиспользуемого кода. Легко встраивается в CI и быстро начинает приносить пользу. В новой версии не особо много изменений, но самое важное из них - knip теперь работает на 80% быстрее (видимо, в том числе благодаря другому изменению - теперь knip по-дефолту не анализирует использование свойств класса т.к. это требует много ресурсов)
The AHA Stack
Большой сайт, посвященный AHA-стеку: Astro + htmx + alpine.js. Если коротко, то основная идея стека крутится вокруг старого доброго веба, где сайты были легки, не было кучи JS в браузере, а основную работу делали серверы. Но все это с новым удобным и современным тулингом.
The Golden Rule of Assertions
Часто можно услышать правило "один тест - одна проверка". Проблема с этим утверждением, что его часто понимают слишком буквально, что приводит к проблемам. В статье предлагается еще 1 правило "A test must fail if, and only if, the intention behind the system is not met." (Тест должен упасть только тогда, когда намерение, заложенное в системе, не достигнуто).
Heat.js - JavaScript Heat Map
Heat.js - библиотека для визуализации данных в виде Heat Map. Heat Map - это визуализация, которую вы можете видеть на github или gitlab, просматривая свою активность по созданию коммитов в разрезе дней. Библиотека поддерживает разные кастомизации: цвета, кнопки, текста, отступы. А также есть разные фичи. Например, экспорт в csv.
qr-code - web-component, реализующий анимированные QR-коды
Интересная библиотека для отрисовке QR-кодов. Библиотека позволяет делать анимированные QR-коды на svg, но при этом все API представляет собой web-компонент. Демка на странице проекта выглядит весьма хорошо.
——————————————
Спасибо что читаете, ставите реакции и отмечаетесь в комментариях. Если вы хотите помочь каналу - расскажите о нем своим коллегамдрузьям. Также оставляйте фидбек по формату, материалу и чему-угодно еще 🙂
👍8❤3🤩3
Top Front-End Tools Of 2023
Список лучших frontend-инструментов 2023-го года. Список большой и содержит всякое разное: UI-библиотеки, инструменты для CSS, AI-инструменты, инструмент для 3D-моделирования на CSS, шаблонизатор писем и многое другое. Что-то конкретно выделять не хочу, но, я думаю, каждый найдет в этом списке что-то для себя
https://www.smashingmagazine.com/2024/01/top-frontend-tools-2023/
#development #javascript #css #list
Список лучших frontend-инструментов 2023-го года. Список большой и содержит всякое разное: UI-библиотеки, инструменты для CSS, AI-инструменты, инструмент для 3D-моделирования на CSS, шаблонизатор писем и многое другое. Что-то конкретно выделять не хочу, но, я думаю, каждый найдет в этом списке что-то для себя
https://www.smashingmagazine.com/2024/01/top-frontend-tools-2023/
#development #javascript #css #list
Smashing Magazine
Top Front-End Tools Of 2023 — Smashing Magazine
Useful front-end tools for CSS and JavaScript developers that were most popular last year and will help you speed up your development workflow. Let’s dive in!
👍9❤1
Новость для тех, кто в Новосибирске.
Тинькофф на следующей неделе (20 февраля) в своем офисе проведет неофрмальный квартирник по тестированию.
Темы:
— о параллельной разработке как способе достижения независимости бэклога;
— контейнерных тестах: это панацея или ловушка.
Регистируйтесь, а также зовите коллег и друзей 💛
20.02, 19:00 Нск, БЦ Кронос (ул. Советская, 5)
Тинькофф на следующей неделе (20 февраля) в своем офисе проведет неофрмальный квартирник по тестированию.
Темы:
— о параллельной разработке как способе достижения независимости бэклога;
— контейнерных тестах: это панацея или ловушка.
Регистируйтесь, а также зовите коллег и друзей 💛
20.02, 19:00 Нск, БЦ Кронос (ул. Советская, 5)
❤7💩1
How to Detect Clicks Anywhere on a Page in React
Небольшая заметка про то, как трекать любой клик в рамках страницы в React. Для многих описанное в статье не будет откровением (спойлер: обработчик вешается на
https://spacejelly.dev/posts/how-to-detect-clicks-anywhere-on-a-page-in-react
#development #javascript #react
Небольшая заметка про то, как трекать любой клик в рамках страницы в React. Для многих описанное в статье не будет откровением (спойлер: обработчик вешается на
body
), но в статье есть интересный кусок с добавлением условной логики в глобальный обработчик на основе условия "является ли событие - событием из формы". Для меня стало открытием, что у любого события есть метод composedPath
, который позволяет определить, через какие элементы проходило событие.https://spacejelly.dev/posts/how-to-detect-clicks-anywhere-on-a-page-in-react
#development #javascript #react
Space Jelly
How to Detect Clicks Anywhere on a Page in React on Space Jelly
Read How to Detect Clicks Anywhere on a Page in React at Space Jelly.
👍15🔥2
Tale of a Refactor
Неплохая статья про рефакторинг кодовой базы. Прочитав название статьи, я думал, что это про реальный кейс крупного рефакторинга. Но, оказалось, что это не так. Автор рассказывает на простом примере, как с помощью рефакторинга упростить код фичи, при этом получив возможность добавлять новые под-фичи без правок в уже существующие под-фичи
Простой пример в статье: это форма оплаты. Изначально она содержит 1 тип оплаты, а затем появляются еще 2 типа оплаты. Естественно, логично предположить, что могут появиться еще новые типы оплаты.
Логичный первый порыв разработчика - поставить
Вместо этого автор предлагает выделить основные обобщенные части формы оплаты (подпись, кнопка, тело) в интерфейс, с которым работает обобщенная форма оплаты и который имплементирует каждый тип оплаты
Что-то вроде
Статья достаточно подробно рассказывает, как разделить и верстку и логику. На самом деле итоговая имплементация в статье другая, не как у меня в блоке выше, т.к. я сильно упростил ситуацию. Но сама реализация не так важна (кстати, там все сделано через контексты), важен сам паттерн: вместо размазывания фичи по
https://commerce.nearform.com/blog/2024/tale-of-a-refactor/
#development #javascript #react #refactoring
Неплохая статья про рефакторинг кодовой базы. Прочитав название статьи, я думал, что это про реальный кейс крупного рефакторинга. Но, оказалось, что это не так. Автор рассказывает на простом примере, как с помощью рефакторинга упростить код фичи, при этом получив возможность добавлять новые под-фичи без правок в уже существующие под-фичи
Простой пример в статье: это форма оплаты. Изначально она содержит 1 тип оплаты, а затем появляются еще 2 типа оплаты. Естественно, логично предположить, что могут появиться еще новые типы оплаты.
Логичный первый порыв разработчика - поставить
switch case
или if else
в код, связанный с рендером каждого блока формы оплаты. Однако, это плохой путь, потому что фича определенного типа оплаты получается размазанной по всей кодовой базе. Кроме того, при добавлении новых способов оплаты придется трогать большой код с условиями.Вместо этого автор предлагает выделить основные обобщенные части формы оплаты (подпись, кнопка, тело) в интерфейс, с которым работает обобщенная форма оплаты и который имплементирует каждый тип оплаты
Что-то вроде
// Обобщенный тип
type PayForm = {
Label: Component,
Button: Component,
Body: Component
}
// В файле somePayType.tsx
/* До экспорта написан код, имплементирующий элементы формы */
export SomePayType: PayForm = {
Label: () => <div> Some Pay Type </div>,
Button: SomePayTypeButton
Body: SomePayTypeBody
}
// В самой форме
const PayFormComponent = () => {
/* всякий разный код */
// Узнаем, какой тип оплаты надо отобразить
const paymentType = useGetPaymentType();
// Получаем элементы типа оплаты
const getElements: PayForm = useGetPayTypeFormElements(paymentType);
/* код идет дальше как-то это все рендерить */
}
Статья достаточно подробно рассказывает, как разделить и верстку и логику. На самом деле итоговая имплементация в статье другая, не как у меня в блоке выше, т.к. я сильно упростил ситуацию. Но сама реализация не так важна (кстати, там все сделано через контексты), важен сам паттерн: вместо размазывания фичи по
switch case
следует обобщить код, а потом предоставить несколько реализаций для этого кодаhttps://commerce.nearform.com/blog/2024/tale-of-a-refactor/
#development #javascript #react #refactoring
Nearform
Tale of a Refactor | Nearform
Nearform is an independent team of engineers, designers and strategists. We build digital capability and software solutions for ambitious enterprises seeking sustained business impact. We love what we do.
❤8👍2👎2
Method Shorthand Syntax Considered Harmful
Небольшая статья про то, что TypeScript некорректно проверяет методы структуру, объявленные через shorthand синтаксис.
Объявим структуру Dog
Теперь скажем, что есть не только собаки, но и маленькие собаки, которые обладают уникальной способностью
Теперь объявим собаку, которая умеет гавкать на маленьких собак
Т.к. каждая маленькая собака (SmallDog) является собакой (Dog), то все выглядит легально.
Но проблема в том, что мы можем прокину
Почему так происходит? Я бы объяснил это так: Typescript проверяе
Исправляется это через отказ от использования shorthand синтаксиса для объявления методов
Это исправляет ситуацию, потому что TS немного по другому обрабатывает синтаксис короткого описания метода. TS считает, что такие методы могут быть и шире и уже, с точки зрения системы типов. Во всех других ситуациях допускается только сужение типов.
Это ошибка, которая может выстрелить в любом проекте т.к. держать такие нюансы постоянно в голове невозможно. Поэтому есть правило
Eslint-правило
Для тех кто дочитал до конца пасхалка. Если перейти от этой статьи к списку всех статей, то рядом будет про то, когда необходим тайпкаст в
https://www.totaltypescript.com/method-shorthand-syntax-considered-harmful
#development #typescript #methodShorthand
Небольшая статья про то, что TypeScript некорректно проверяет методы структуру, объявленные через shorthand синтаксис.
Объявим структуру Dog
interface Dog {
barkAt(dog: Dog): void;
}
Теперь скажем, что есть не только собаки, но и маленькие собаки, которые обладают уникальной способностью
interface SmallDog extends Dog {
whimper: () => void;
}
Теперь объявим собаку, которая умеет гавкать на маленьких собак
const brian: Dog = {
barkAt(smallDog: SmallDog) {
smallDog.whimper();
},
};
Т.к. каждая маленькая собака (SmallDog) является собакой (Dog), то все выглядит легально.
Но проблема в том, что мы можем прокину
ть об
ычную собаку в brian, хотя там ожидается маленькая собака. В результате чего произойдет ошибка в рантайме.
const normalDog: Dog = {
barkAt() {},
};
brian.barkAt(normalDog); // runtime error here!
Почему так происходит? Я бы объяснил это так: Typescript проверяе
т мет
од в brian на совместимость к интерфейсу, но далее в проверке не использует эти знания и считает
что brian соответствует инте
рфейсу Dog. Т.е. по хорошему TS не должен считать расширение типа аргумента совместимым относительно оригинального типа.Исправляется это через отказ от использования shorthand синтаксиса для объявления методов
interface Dog {
barkAt: (dog: Dog) => void;
}
interface SmallDog extends Dog {
whimper: () => void;
}
Это исправляет ситуацию, потому что TS немного по другому обрабатывает синтаксис короткого описания метода. TS считает, что такие методы могут быть и шире и уже, с точки зрения системы типов. Во всех других ситуациях допускается только сужение типов.
Это ошибка, которая может выстрелить в любом проекте т.к. держать такие нюансы постоянно в голове невозможно. Поэтому есть правило
Eslint-правило
@typescript-eslint/method-signature-style
, запрещающее такие объявления методов.Для тех кто дочитал до конца пасхалка. Если перейти от этой статьи к списку всех статей, то рядом будет про то, когда необходим тайпкаст в
as never
. Короткое, но занимательное чтиво про то, как выстрелить себе в ногу.https://www.totaltypescript.com/method-shorthand-syntax-considered-harmful
#development #typescript #methodShorthand
Total TypeScript
Method Shorthand Syntax Considered Harmful
Using the method shorthand syntax for function annotations in TypeScript can result in runtime errors. It is recommended to use object property syntax instead.
👍17👎1💩1
Towards Qwik 2.0: Lighter, Faster, Better
Команда разработки Qwik готовит релиз 2 версии фреймворка. Qwik использует концепцию Virtual Dom для работы, поэтому есть проблема восстановления Virtual Dom исходя из HTML разметки после серверного рендера. В данной статье описывается изменение решения этой проблемы во второй версии qwik, которое улучшает перформанс-метрики приложения
Если коротко, то в текущей реализации qwik ставит комментарии в HTML, а также использует кастомные атрибуты
В новом qwik HTML-комментарии исчезнут, что делает верстку намного чище.
Тем не менее, qwik'у нужна информацию, которая была в комментариях. Эту информацию переместили в отдельный
Код компонента для верстки выше выглядит вот так:
Информация о его виртуальных нодах выглядит следующим образом
-
-
-
-
-
-
-
Выглядит одновременно элегантно и жутко, но, очевидно, что такая нотация очень компактна.
Также виртуальные ноды станут ленивыми и будут более эффективно использовать память. Ноды будут использовать массивы вместо объектов, лениво инициализироваться, а также переиспользовать DOM-ноды
https://www.builder.io/blog/qwik-2-coming-soon
#development #qwik #javascript
Команда разработки Qwik готовит релиз 2 версии фреймворка. Qwik использует концепцию Virtual Dom для работы, поэтому есть проблема восстановления Virtual Dom исходя из HTML разметки после серверного рендера. В данной статье описывается изменение решения этой проблемы во второй версии qwik, которое улучшает перформанс-метрики приложения
Если коротко, то в текущей реализации qwik ставит комментарии в HTML, а также использует кастомные атрибуты
<div q:container="paused" q:render="static-ssr" q:version="dev" q:base="/build/" q:locale q:manifest-hash="dev">
<main>
<!--qv q:s q:sref=5 q:key=-->
<!--qv q:id=7 q:key=xYL1:zl_0-->
<!--qv q:key=H1_0-->
Count:
<!--t=8-->123<!---->!
<button on:click="..." q:id="9">
+1
</button>
<!--/qv-->
<!--/qv-->
<!--/qv-->
</main>
<script type="qwik/json">{...}</script>
</div>
В новом qwik HTML-комментарии исчезнут, что делает верстку намного чище.
<div q:container="paused" q:render="static-ssr" q:version="dev"
q:base="/build/" q:locale q:manifest-hash="dev">
<main>
Count: 123!
<button on:click="...">+1</button>
</main>
<script type="qwik/state">[...]</script>
<script type="qwik/vnode">!{{HDB1}}</script>
</div>
Тем не менее, qwik'у нужна информацию, которая была в комментариях. Эту информацию переместили в отдельный
<script type="qwik/vnode">
в конце документа. При этом информация записывается в специальном формате и есть даже разбор нотации для компонентаКод компонента для верстки выше выглядит вот так:
<main>
<Counter>
<>
{'Count: '}
{signal.value}
{'!'}
<button on:click="...">+1</button>
</>
</Counter>
</main>
Информация о его виртуальных нодах выглядит следующим образом
!{{HDB1}}
. Это расшифровывается вот так:-
!
описывает сколько элементов надо скипнуть до <main>
-
{
- <main>
имеет виртуальный элемент-
{
- еще 1 виртуальный элемент <>
-
H
- H - это 7 буква алфавита (начиная с 0), поэтому из Count: 123
мы берем первые 7 символов и получаем виртуальную ноду Count:
-
D
- D - это 3 буква алфавита (начиная с 0), следующая текстовая нода 123
-
B
- это 1, поэтому следующая нода !
-
1
- описывает количество элементов, которые надо просто использовать. В нашем случае это buttonВыглядит одновременно элегантно и жутко, но, очевидно, что такая нотация очень компактна.
Также виртуальные ноды станут ленивыми и будут более эффективно использовать память. Ноды будут использовать массивы вместо объектов, лениво инициализироваться, а также переиспользовать DOM-ноды
https://www.builder.io/blog/qwik-2-coming-soon
#development #qwik #javascript
Builder.io
Towards Qwik 2.0: Lighter, Faster, Better
Announcing the roadmap to Qwik 2.0: a community project focused on a lighter, faster, better Qwik for everyone.
👍2🔥2❤1
Дайджест за 2024-02-12 - 2024-02-16
Top Front-End Tools Of 2023
Список лучших frontend-инструментов 2023-го года. Список большой и содержит всякое разное: UI-библиотеки, инструменты для CSS, AI-инструменты, инструмент для 3D-моделирования на CSS, шаблонизатор писем и многое другое. Что-то конкретно выделять не хочу, но, я думаю, каждый найдет в этом списке что-то для себя
How to Detect Clicks Anywhere on a Page in React
Небольшая заметка про то, как трекать любой клик в рамках страницы в React. Для многих описанное в статье не будет откровением (спойлер: обработчик вешается на body), но в статье есть интересный кусок с добавлением условной логики в глобальный обработчик на основе условия "является ли событие - событием из формы". Для меня стало открытием, что у любого события есть метод composedPath, который позволяет определить, через какие элементы проходило событие.
Tale of a Refactor
Неплохая статья про рефакторинг кодовой базы. Прочитав название статьи, я думал, что это про реальный кейс крупного рефакторинга. Но, оказалось, что это не так. Автор рассказывает на простом примере, как с помощью рефакторинга упростить код фичи, при этом получив возможность добавлять новые под-фичи без правок в уже существующие под-фичи
Простой пример в статье: это форма оплаты. Изначально она содержит 1 тип оплаты, а затем появляются еще 2 типа оплаты. Естественно, логично предположить, что могут появиться еще новые типы оплаты.
В комментариях к посту в канале мнения на счет статьи разделились: кому-то рефакторинг понравился, кому-то показалось, что стало только хуже
Method Shorthand Syntax Considered Harmful
Небольшая статья про то, что TypeScript некорректно проверяет методы структуру, объявленные через shorthand синтаксис.
Towards Qwik 2.0: Lighter, Faster, Better
Команда разработки Qwik готовит релиз 2 версии фреймворка. Qwik использует концепцию Virtual Dom для работы, поэтому есть проблема восстановления Virtual Dom исходя из HTML разметки после серверного рендера. В данной статье описывается изменение решения этой проблемы во второй версии qwik, которое улучшает перформанс-метрики приложения
——————————————
Спасибо что читаете, ставите реакции и отмечаетесь в комментариях. Если вы хотите помочь каналу - расскажите о нем своим коллегамдрузьям. Также оставляйте фидбек по формату, материалу и чему-угодно еще 🙂
Top Front-End Tools Of 2023
Список лучших frontend-инструментов 2023-го года. Список большой и содержит всякое разное: UI-библиотеки, инструменты для CSS, AI-инструменты, инструмент для 3D-моделирования на CSS, шаблонизатор писем и многое другое. Что-то конкретно выделять не хочу, но, я думаю, каждый найдет в этом списке что-то для себя
How to Detect Clicks Anywhere on a Page in React
Небольшая заметка про то, как трекать любой клик в рамках страницы в React. Для многих описанное в статье не будет откровением (спойлер: обработчик вешается на body), но в статье есть интересный кусок с добавлением условной логики в глобальный обработчик на основе условия "является ли событие - событием из формы". Для меня стало открытием, что у любого события есть метод composedPath, который позволяет определить, через какие элементы проходило событие.
Tale of a Refactor
Неплохая статья про рефакторинг кодовой базы. Прочитав название статьи, я думал, что это про реальный кейс крупного рефакторинга. Но, оказалось, что это не так. Автор рассказывает на простом примере, как с помощью рефакторинга упростить код фичи, при этом получив возможность добавлять новые под-фичи без правок в уже существующие под-фичи
Простой пример в статье: это форма оплаты. Изначально она содержит 1 тип оплаты, а затем появляются еще 2 типа оплаты. Естественно, логично предположить, что могут появиться еще новые типы оплаты.
В комментариях к посту в канале мнения на счет статьи разделились: кому-то рефакторинг понравился, кому-то показалось, что стало только хуже
Method Shorthand Syntax Considered Harmful
Небольшая статья про то, что TypeScript некорректно проверяет методы структуру, объявленные через shorthand синтаксис.
Towards Qwik 2.0: Lighter, Faster, Better
Команда разработки Qwik готовит релиз 2 версии фреймворка. Qwik использует концепцию Virtual Dom для работы, поэтому есть проблема восстановления Virtual Dom исходя из HTML разметки после серверного рендера. В данной статье описывается изменение решения этой проблемы во второй версии qwik, которое улучшает перформанс-метрики приложения
——————————————
Спасибо что читаете, ставите реакции и отмечаетесь в комментариях. Если вы хотите помочь каналу - расскажите о нем своим коллегамдрузьям. Также оставляйте фидбек по формату, материалу и чему-угодно еще 🙂
👍6🤩1
Union, intersection, difference, and more are coming to JavaScript Sets
В Set добавляют новые методы (и вроде они уже есть в новом Chrome):
В целом, названия говорят сами за себя:
-
-
-
-
-
-
-
https://www.sonarsource.com/blog/union-intersection-difference-javascript-sets/
#development #javascript #set
В Set добавляют новые методы (и вроде они уже есть в новом Chrome):
union
, intersection
, difference
, symmetricDifference
, isSubsetOf
, isSupersetOf
и isDisjointFrom
. В целом, названия говорят сами за себя:
-
setA.union(setB)
- создает новый Set со всеми значениями из setA и setB (объединение множеств)-
setA.intersection(setB)
- создает новый Set со значениями, который есть и в setA и в setB (пересечение множеств)-
setA.difference(setB)
- создает новый Set со значениями, который есть в setA, но нету в setB-
setA.symmetricDifference(setB)
- создает новый Set со значениями, которые есть только в одном из двух сетов-
setA.isSubsetOf(setB)
- вернет true, если все значения setA есть в setB (А - подмножество Б)-
setA.isSupersetOf(setB)
- вернет true, если все значения setB есть в setA (А - надмножество Б)-
setA.isDisjointFrom(setB)
- вернет true, если ни одного значения в setA нет среди значений setB (множества не пересекаются)https://www.sonarsource.com/blog/union-intersection-difference-javascript-sets/
#development #javascript #set
Sonarsource
Union, intersection, difference, and more are coming to JavaScript Sets
The JavaScript Set was introduced to the language in the ES2015 spec, but it has always seemed incomplete. That's about to change with the addition of functions like intersection, union and difference.
🔥23👍4❤2