Оператор безопасного присваивания?
Недавно был представлен пропозал для ECMAscript - оператор безопасного присваивания.
Суть его работы в том, что он преобразует полученный результат в кортеж. Например, если функция завершилась успешно, то получаем
При работе на чистом JS, асинхронные функции оборачиваются в блок try/catch. Довольно часто с добавлением нескольких уровней вложенности. Данный оператор призван устранить этот недостаток. Использовать предлагается, примерно, вот так:
Оператор задизайнен для работы с промисами, async/await, с оператором using.
На мой взгляд, у решения есть несколько минусов.
📌 Получаем больше бойлерплейта с if/else для каждого оператора (fetch, parse и тд). При этом конструкция не заставляет обрабатывать исключения. Как и в случае с try/catch, синтаксис не обязывает это делать.
📌 Еще один способ делать одно и тоже, вместо стандартизации одного подхода.
📌 Отсутствие сигнатуры типов. Как обрабатывать ошибки разного типа? В случае интеграции c TS, компилятору не будет понятно, что за тип ошибки возвращается и как ее обрабатывать.
Что же, поглядим, пропозал пока даже не в основном репозитории комитета TC39.
#js
Недавно был представлен пропозал для ECMAscript - оператор безопасного присваивания.
Суть его работы в том, что он преобразует полученный результат в кортеж. Например, если функция завершилась успешно, то получаем
[null, result]. Если с ошибкой, возвращается [error, null]. Немного прослеживается аналогия с Go,Swift, Rust. Предложение вызвало споры о том, насколько это вообще нужно и насколько удобно.При работе на чистом JS, асинхронные функции оборачиваются в блок try/catch. Довольно часто с добавлением нескольких уровней вложенности. Данный оператор призван устранить этот недостаток. Использовать предлагается, примерно, вот так:
const [error, response] ?= await fetch("https://api.example.com/data")const [validationError, data] ?= validator.parse(json);
if (validationError) {
handleValidationError(validationError);
return;
}
return data;
Оператор задизайнен для работы с промисами, async/await, с оператором using.
На мой взгляд, у решения есть несколько минусов.
📌 Получаем больше бойлерплейта с if/else для каждого оператора (fetch, parse и тд). При этом конструкция не заставляет обрабатывать исключения. Как и в случае с try/catch, синтаксис не обязывает это делать.
📌 Еще один способ делать одно и тоже, вместо стандартизации одного подхода.
📌 Отсутствие сигнатуры типов. Как обрабатывать ошибки разного типа? В случае интеграции c TS, компилятору не будет понятно, что за тип ошибки возвращается и как ее обрабатывать.
Что же, поглядим, пропозал пока даже не в основном репозитории комитета TC39.
#js
👍1🤔1
Новости Material
Я не слежу пристально за Material, поскольку в ежедневной работе использую другой ui-kit. А оказывается зря, здесь такие нововведения!😅
📌 В свежей версии 18.2.0 добавили свойство (input)
Это может быть полезно, например, если вы хотите показать тултип (matTooltip), но внешне элемент должен отображаться, как disabled. Нововведение исправит огромную проблему для скринридеров при работе с disabled элементами. Крайне рекомендую к использованию. Работает даже с VoiceOver! Еще один шаг в сторону доступности!
И еще одна, не менее важная доработка!
📌 Добавили поддержку drag&drop для обеих осей одновременно! Появился параметр «mixed». Раньше cdk поддерживал перетаскивание по горизонтали или по вертикали. И делается это с помощью CSS transform, а набор элементов обычный массив. Новый способ производит изменения непосредственно в DOM, что позволяет переносить объект на следующую строку.
Я помню, что на одном из проектов было большой проблемой и приходилось писать много дополнительного кода и анимаций, чтобы решение смотрелось приемлемо при перетаскивании элементов.
#material
Я не слежу пристально за Material, поскольку в ежедневной работе использую другой ui-kit. А оказывается зря, здесь такие нововведения!😅
📌 В свежей версии 18.2.0 добавили свойство (input)
disabledInteractive, который, в отличие от свойства disabled, позволяет отлавливать события и фокус на элементе.Это может быть полезно, например, если вы хотите показать тултип (matTooltip), но внешне элемент должен отображаться, как disabled. Нововведение исправит огромную проблему для скринридеров при работе с disabled элементами. Крайне рекомендую к использованию. Работает даже с VoiceOver! Еще один шаг в сторону доступности!
И еще одна, не менее важная доработка!
📌 Добавили поддержку drag&drop для обеих осей одновременно! Появился параметр «mixed». Раньше cdk поддерживал перетаскивание по горизонтали или по вертикали. И делается это с помощью CSS transform, а набор элементов обычный массив. Новый способ производит изменения непосредственно в DOM, что позволяет переносить объект на следующую строку.
Я помню, что на одном из проектов было большой проблемой и приходилось писать много дополнительного кода и анимаций, чтобы решение смотрелось приемлемо при перетаскивании элементов.
#material
👍2🔥2
Standalone по умолчанию
На прошлой неделе я пропустил новость, которая будет частью предстоящего обновления. Все же публикую, хоть и с опозданием.
После релиза 14 версии и добавления standalone компонентов, CLI и сами разработчики указывали параметр
После релиза 19 версии делается следующий шаг, как говорит команда Angular. Теперь значение флага по умолчанию будет
При обновлении будет автоматическая миграция, в ходе которой удалится флаг
#angular
На прошлой неделе я пропустил новость, которая будет частью предстоящего обновления. Все же публикую, хоть и с опозданием.
После релиза 14 версии и добавления standalone компонентов, CLI и сами разработчики указывали параметр
standalone: true для написания приложения, не использующего модули. Кстати, я писал о своем опыте миграции на standalone. Можете прочитать, если интересно. После релиза 19 версии делается следующий шаг, как говорит команда Angular. Теперь значение флага по умолчанию будет
false, если необходимо использовать NgModule. Подчеркивается, что модули не переходят в статус deprecated. По крайней мере, пока что😉При обновлении будет автоматическая миграция, в ходе которой удалится флаг
standalone: true для существующих standalone сущностей и добавится standalone: false для NgModule. При желании можно включить режим компилятора strictStandalone для генерации только таких компонентов. Я раньше не слышал об этом, вы тоже? 🤔#angular
👍3🔥1
Что еще ожидается от предстоящего обновления?
Был представлен примитив
Эта штука полностью замещает случаи, где нужно использовать
Но подобные конструкции стоит выполнять с осторожностью. А вот почему, я еще не смотрел. Если вы разобрались, напишите в комментарии, пожалуйста.Не утверждаю, скорее всего, дело в производительности и срабатывании эффектов при изменении или пересчетах DOM.
#angular
Был представлен примитив
afterRenderEffect().Эта штука полностью замещает случаи, где нужно использовать
effect(). Кроме того, как я понял по содержимому комита, API позволяет создавать effects для работы с DOM элементами. При этом Angular будет оптимизировать подобные вызовы. Но подобные конструкции стоит выполнять с осторожностью. А вот почему, я еще не смотрел. Если вы разобрались, напишите в комментарии, пожалуйста.
#angular
GitHub
feat(core): introduce `afterRenderEffect` (#57549) · angular/angular@be2e496
Implement the `afterRenderEffect` primitive, which creates effect(s) that
run as part of Angular's `afterRender` sequence. `afterRenderEffect` is a
useful primitive for expressing DOM opera...
run as part of Angular's `afterRender` sequence. `afterRenderEffect` is a
useful primitive for expressing DOM opera...
👍1🔥1
Всем привет! Я был в отпуске и немного забросил написание постов. За это время вышло несколько новостей, которые я решил объединить.
📌 19 версия Angular будет представлена с новыми схематиками. Pre-release версия уже их содержит.
Первый обновляет @Input, а второй DOM Queries на сигнальные.
📌 Кроме того, из dev preview выйдут input, output, model API.
📌 И еще одна заметная новость! Для material добавили компонент TimePicker! Я сначала попытался найти его в разделе DatePicker. Я предположил, что время сделают, как опциональный параметр даты. Но нет, нужно пролистать ниже, это отдельный полноценный элемент.
Пару-тройку лет назад, на многих проектах, с использованием Material, picker добавляли отдельным пакетом. Я думаю, что все помнят и сейчас с грустью или радостью читают этот пост. Мне понравился внешний вид picker, можно в autocomplete-режиме выбрать нужное время. Но у меня уже получилось крашнуть страницу с примером - при выборе секунды, как интервала времени. Я надеялся, что, в этом случае, добавится отдельный инпут, изменится отображение. Но, посмотрев код, понял, что это не так. Отправил обратную связь команде.
#angular #material
📌 19 версия Angular будет представлена с новыми схематиками. Pre-release версия уже их содержит.
Первый обновляет @Input, а второй DOM Queries на сигнальные.
ng generate @angular/core:signal-input-migration
ng generate @angular/core:signal-queries-migration
📌 Кроме того, из dev preview выйдут input, output, model API.
📌 И еще одна заметная новость! Для material добавили компонент TimePicker! Я сначала попытался найти его в разделе DatePicker. Я предположил, что время сделают, как опциональный параметр даты. Но нет, нужно пролистать ниже, это отдельный полноценный элемент.
Пару-тройку лет назад, на многих проектах, с использованием Material, picker добавляли отдельным пакетом. Я думаю, что все помнят и сейчас с грустью или радостью читают этот пост. Мне понравился внешний вид picker, можно в autocomplete-режиме выбрать нужное время. Но у меня уже получилось крашнуть страницу с примером - при выборе секунды, как интервала времени. Я надеялся, что, в этом случае, добавится отдельный инпут, изменится отображение. Но, посмотрев код, понял, что это не так. Отправил обратную связь команде.
#angular #material
👍3❤🔥2
Ограничения Clipboard API
Мы привыкли, что во многих веб приложениях пользуемся буфером обмена. Google Docs, Figma и тд. Для его добавления существует Clipboard API. Этим я и пользовался на одном из проектов для реализации копирования и вставки текста и картинок. Тогда не задумался об ограничениях, т.к. ничего сверхъестественного не требовалось, а сейчас нашел статью об API и его особенностях.
Оказывается, что буфер обмена хранит данные в разных представлениях, поэтому скопированный текст будет отличаться при вставке на сайте и VS Code, например. Из особенностей, которые я отметил для себя, сказано, что, по соображениям безопасности, могут быть обработаны только типы данных: text/plain, text/html и image/png. Причем раньше типов было больше, а ограничения ввели позднее.
Кроме того, у нас есть более старый Clipboard Events API. Он не имеет ограничений по типам. Но для его работы необходимо, чтобы пользователь вызвал событие копирования и вставки. Это, в свою очередь, может быть проблемой при создании кастомных событий в приложениях.
Alex Harri рассказывает про API, показывает примеры. Отличный, подробный гайд.
#js
Мы привыкли, что во многих веб приложениях пользуемся буфером обмена. Google Docs, Figma и тд. Для его добавления существует Clipboard API. Этим я и пользовался на одном из проектов для реализации копирования и вставки текста и картинок. Тогда не задумался об ограничениях, т.к. ничего сверхъестественного не требовалось, а сейчас нашел статью об API и его особенностях.
Оказывается, что буфер обмена хранит данные в разных представлениях, поэтому скопированный текст будет отличаться при вставке на сайте и VS Code, например. Из особенностей, которые я отметил для себя, сказано, что, по соображениям безопасности, могут быть обработаны только типы данных: text/plain, text/html и image/png. Причем раньше типов было больше, а ограничения ввели позднее.
Кроме того, у нас есть более старый Clipboard Events API. Он не имеет ограничений по типам. Но для его работы необходимо, чтобы пользователь вызвал событие копирования и вставки. Это, в свою очередь, может быть проблемой при создании кастомных событий в приложениях.
Alex Harri рассказывает про API, показывает примеры. Отличный, подробный гайд.
#js
👍2🔥1
Обновления работы effect()
Команда Angular озвучила вчера то, какие изменения нас ждут.
Сейчас API
После получения обратной связи от разработчиков решили отказаться от флага и разрешить подобные изменения других сигналов.
Следующее изменение тоже касается принципов работы. Сейчас эффекты выполняются в очереди, похоже, как очередь микротасков. Теперь они будут выполняться согласно иерархии компонентов в CD, что позволит избежать ошибок, когда эффекты выполнялись слишком рано или слишком поздно.
Как мы видим, немного обновились принципы. Есть то, на что стоит обратить внимание. Например, при работе с DOM элементами, формами, учитывать очередность выполнения. Подробнее по ссылке.
#angular #signals
Команда Angular озвучила вчера то, какие изменения нас ждут.
Сейчас API
effect() запрещает изменять сигналы внутри функции effect(), намекая, что для этого лучше использовать computed(). Или добавлять специальный флаг allowSignalWrites. На примере ниже это показано.from = signal('Hamburg');
to = signal('Graz');
effect(() => {
this.to.set(this.from());
}, { allowSignalWrites: true })После получения обратной связи от разработчиков решили отказаться от флага и разрешить подобные изменения других сигналов.
Следующее изменение тоже касается принципов работы. Сейчас эффекты выполняются в очереди, похоже, как очередь микротасков. Теперь они будут выполняться согласно иерархии компонентов в CD, что позволит избежать ошибок, когда эффекты выполнялись слишком рано или слишком поздно.
Как мы видим, немного обновились принципы. Есть то, на что стоит обратить внимание. Например, при работе с DOM элементами, формами, учитывать очередность выполнения. Подробнее по ссылке.
#angular #signals
👍2🔥2
Время анонсов!
📌 Уже послезавтра состоится Angular Event, на котором должны представить новую версию!
Ставьте 👍🏻, кто планирует смотреть трансляцию! Подключаемся в 21:00.
📌 Кроме того, Microsoft выпустила статью в блоге о бете TS 5.7. Из особенностей я бы отметил:
- Обещания в улучшении статического анализа файлов, позволяющие выявлять переменные, которые были объявлены, но не инициализированы.
- Введён новый параметр компилятора
- Добавление поддержки новых возможностей ECMAScript 2024
#angular #typescript
📌 Уже послезавтра состоится Angular Event, на котором должны представить новую версию!
Ставьте 👍🏻, кто планирует смотреть трансляцию! Подключаемся в 21:00.
📌 Кроме того, Microsoft выпустила статью в блоге о бете TS 5.7. Из особенностей я бы отметил:
- Обещания в улучшении статического анализа файлов, позволяющие выявлять переменные, которые были объявлены, но не инициализированы.
- Введён новый параметр компилятора
--rewriteRelativeImportExtensions, который позволяет автоматически изменять расширения файлов в относительных импортах, что особенно полезно при работе с различными модулями и системами сборки, где требуются специфические расширения.- Добавление поддержки новых возможностей ECMAScript 2024
#angular #typescript
👍4🔥3
Enum или сплошное разочарование
Мы знаем некоторые особенности работы с enum. Например, объявление через const enum, что позволяет сделать меньше бандл, а TS напрямую обращаться к свойствам. Столкнувшись опять с несовершенством enum, я решил показать пару примеров, где использовать его не стоит.
1. Для типизации параметров функций. Здесь должна возникнуть ошибка, но фактически ее нет.
Это поведение объясняется тем, что типу enum с числовым значением можно присвоить любое число. Поэтому он небезопасен. Такая конструкция разработана, чтобы допускать структуры битовых флагов. Грубо говоря, это оптимизация хранения логических значений. Каждый бит в числе - отдельное значение. Для управления битами создаются enum с числами (где есть каждый флаг по отдельности) и потом комбинируются между собой. Результат объединения флагов в один не обязательно одно из чисел, которое есть в enum. Поэтому, если создать переменную с типом enum, то C# допускает хранить число соответствующей размерности, а TS позволяет объявить переменную с типом вашего enum и присвоить ей любое число.
Здесь важно, на мой взгляд, знать, почему так сделано, а не просто ругать "недостатки" языка.
2. Типы enum со строковыми значениями имеют номинальную типизацию, вместо структурной. В примере ниже будет ошибка, несмотря на то, что строка "эквивалентна" enum. Но это не так, потому что для работы с битовыми полями enum дает доп слой безопасности.
По этой же причине разные enum нельзя присвоить друг другу:
Подобные детали работы с enum давно известны, но здесь я решил для себя структурировать в один пост и дать ответ на вопросы. А выводы изложить в виде кода.
Как пишете вы? Не стесняйтесь комментировать, скидывать свои примеры.
#typescript
Мы знаем некоторые особенности работы с enum. Например, объявление через const enum, что позволяет сделать меньше бандл, а TS напрямую обращаться к свойствам. Столкнувшись опять с несовершенством enum, я решил показать пару примеров, где использовать его не стоит.
1. Для типизации параметров функций. Здесь должна возникнуть ошибка, но фактически ее нет.
const enum StatusEnum { approved = 1, declined = 0 }
function checkStatus(param: StatusEnum) {
console.log(param);
}
let x: number = 10;
checkStatus(x);Это поведение объясняется тем, что типу enum с числовым значением можно присвоить любое число. Поэтому он небезопасен. Такая конструкция разработана, чтобы допускать структуры битовых флагов. Грубо говоря, это оптимизация хранения логических значений. Каждый бит в числе - отдельное значение. Для управления битами создаются enum с числами (где есть каждый флаг по отдельности) и потом комбинируются между собой. Результат объединения флагов в один не обязательно одно из чисел, которое есть в enum. Поэтому, если создать переменную с типом enum, то C# допускает хранить число соответствующей размерности, а TS позволяет объявить переменную с типом вашего enum и присвоить ей любое число.
Здесь важно, на мой взгляд, знать, почему так сделано, а не просто ругать "недостатки" языка.
2. Типы enum со строковыми значениями имеют номинальную типизацию, вместо структурной. В примере ниже будет ошибка, несмотря на то, что строка "эквивалентна" enum. Но это не так, потому что для работы с битовыми полями enum дает доп слой безопасности.
enum Flavor {
VANILLA = 'vanilla',
CHOCOLATE = 'chocolate',
STRAWBERRY = 'strawberry',
}
function scoop(flavor: Flavor) { /* ... */ }
scoop('vanilla'); // ОшибкаПо этой же причине разные enum нельзя присвоить друг другу:
enum PackStatus {
Draft = "Draft",
Approved = "Approved",
}
enum PackStatus2 {
Draft = "Draft",
}
const logStatus = (status: PackStatus) => {...};
logStatus(PackStatus2.Draft); // ОшибкаПодобные детали работы с enum давно известны, но здесь я решил для себя структурировать в один пост и дать ответ на вопросы. А выводы изложить в виде кода.
// Если нужно объявить набор строковых параметров, используйте string union
type Country = 'Russia' | 'Finland' | 'Germany';
function printCountry(country: Country) {}
// Если нужен mapping между ключами и ззначениями, используйте 'as const'
const Countries = {
Russia: 'RU',
Finland: 'FI',
Germany: 'DE',
} as const;
// Тип с доступными ключами
type CountryKeys = keyof typeof Countries;
// "Russia" | "Finland" | "Germany"
// Тип с доступными значениями
type CountryValues = typeof Countries[CountryKeys];
// "RU" | "FI" | "DE"
Как пишете вы? Не стесняйтесь комментировать, скидывать свои примеры.
#typescript
👍6🔥2
Анонсы пятницы
На прошлой неделе команда Angular сильно удивила.
📌 Сначала представили Incremental Hydration для компонентов, который, скорее всего, добавят в 19 версии.
Я не работал никогда с SSR, но, как я понял, подход повышает производительность и улучшает метрики Core Web Vitals.
Грубо говоря, гидратация — это процесс, в ходе которого статически сгенерированный HTML, полученный с сервера, "оживает", благодаря JS. Это позволяет пользователям взаимодействовать с контентом, не дожидаясь полной загрузки. Минус в том, что процесс ресурсоемкий, при этом время отклика замедляется.
А представленный механизм позволяет загружать те части приложения, которые нужны в первую очередь. Напомнило lazy loading или deferrable views, если смотреть RFC. Пример из комментариев, объясняющий принцип работы:
📌 Анонсирован Resource API. Это способ работы с запросами, удобно интегрированный с сигналами.
Мы можем прокидывать в resource сигналы в виде параметров. Resource имеет тип Resource<T>, который включает сигналы для хранения текущего состояния. WritableResource расширяет этот тип, чтобы позволить локальные преобразования resource через значение сигнала (двусторонняя привязка).
Кроме того, API позволяет
- конвертировать результат работы в Observable,
- отклонять предыдущий запрос, если значение сигнала изменилось.
Подробности по ссылке. Все три примитива
Я заметил, что подход нацелен на работу с промисами. Потому что по умолчанию работает именно с ними. На мой взгляд, это шаг в сторону отказа от RxJS. Постепенный отказ от библиотеки и желание не делать жесткое связывание нового API на работу с ними. А вы заметили?
#angular
На прошлой неделе команда Angular сильно удивила.
📌 Сначала представили Incremental Hydration для компонентов, который, скорее всего, добавят в 19 версии.
Я не работал никогда с SSR, но, как я понял, подход повышает производительность и улучшает метрики Core Web Vitals.
Грубо говоря, гидратация — это процесс, в ходе которого статически сгенерированный HTML, полученный с сервера, "оживает", благодаря JS. Это позволяет пользователям взаимодействовать с контентом, не дожидаясь полной загрузки. Минус в том, что процесс ресурсоемкий, при этом время отклика замедляется.
А представленный механизм позволяет загружать те части приложения, которые нужны в первую очередь. Напомнило lazy loading или deferrable views, если смотреть RFC. Пример из комментариев, объясняющий принцип работы:
Есть список элементов. Если не знаем, будет ли пользователь взаимодействовать с элементом, помещаем его в defer блок с синтаксисом гидратации. В этом случае элемент отобразится, но код для компонента загрузится по мере необходимости. Если контент статичный, то помещается в блок hydrate never.
📌 Анонсирован Resource API. Это способ работы с запросами, удобно интегрированный с сигналами.
Мы можем прокидывать в resource сигналы в виде параметров. Resource имеет тип Resource<T>, который включает сигналы для хранения текущего состояния. WritableResource расширяет этот тип, чтобы позволить локальные преобразования resource через значение сигнала (двусторонняя привязка).
Кроме того, API позволяет
- конвертировать результат работы в Observable,
- отклонять предыдущий запрос, если значение сигнала изменилось.
Подробности по ссылке. Все три примитива
resource, rxResource, toResource будут доступны в developer preview в Angular 19. Я заметил, что подход нацелен на работу с промисами. Потому что по умолчанию работает именно с ними. На мой взгляд, это шаг в сторону отказа от RxJS. Постепенный отказ от библиотеки и желание не делать жесткое связывание нового API на работу с ними. А вы заметили?
#angular
👏5👍2
Наткнулся на статью, где указываются плюсы/минусы разных подходов в Angular. Рекомендую к прочтению, учитывая, сколько сейчас появилось способов сделать одно и то же разными способами. Почему это плохо, я уже писал в канале. Если подходы все же есть, стоит знать, где и какой применять.
https://www.angularspace.com/angular-friction-points/
#angular
https://www.angularspace.com/angular-friction-points/
#angular
Angular Space
Angular Friction Points
Angular is a very opinionated framework, with multiple different rules and solidified approaches that help developers easily navigate decisions within their projects.
However, as with any tool, there is some variability, and the core team cannot, and, more…
However, as with any tool, there is some variability, and the core team cannot, and, more…
👍7🔥1
Тут Пол Грэм написал заметку с посылом, что отдавая все больше вещей на откуп AI, мы сами можем разучиться ясно мыслить. Он считает очень важным умение писать, качественно выражать свои мысли на бумаге (либо пикселями на экране).
Автор считает, что невозможно научиться ясно выражать свои мысли и думать, без умения изложить их на письме (привет голосовые сообщения? 😅), при этом с развитием генеративных AI люди будут все реже писать что-то сами.
По мнению Пола, через пару десятилетий, мир может разделиться на тех, кто умеет писать и тех, кто не умеет совсем, т.е. исчезнет золотая середина из людей, кто может не идеально, но писать о чем-либо (мысли, статьи, что-то серьезнее).
Он приводит цитату американского ученого компьютерщика и математика Лесли Лэмпорта (Leslie Lamport):
В качестве аналогии Пол приводит пример, что в доиндустривальную эпоху большинство людей были сильными благодаря обилию тяжелой работы, которую они выполняли. В современном мире, мы вынуждены ходить в тренажерный зал, чтобы держать свое тело в форме.
Что думаете по этому поводу, господа и госпожи(господыни) ?
Автор считает, что невозможно научиться ясно выражать свои мысли и думать, без умения изложить их на письме (привет голосовые сообщения? 😅), при этом с развитием генеративных AI люди будут все реже писать что-то сами.
По мнению Пола, через пару десятилетий, мир может разделиться на тех, кто умеет писать и тех, кто не умеет совсем, т.е. исчезнет золотая середина из людей, кто может не идеально, но писать о чем-либо (мысли, статьи, что-то серьезнее).
Он приводит цитату американского ученого компьютерщика и математика Лесли Лэмпорта (Leslie Lamport):
If you're thinking without writing, you only think you're thinking.
В качестве аналогии Пол приводит пример, что в доиндустривальную эпоху большинство людей были сильными благодаря обилию тяжелой работы, которую они выполняли. В современном мире, мы вынуждены ходить в тренажерный зал, чтобы держать свое тело в форме.
So there are still strong people, but only those who choose to be.
Что думаете по этому поводу, господа и госпожи
🔥3👍1
Команда Angular (совместно с авторами Angular Space community) обновят весьма устаревший style guide!
На прошлой неделе RFC (Request For Comments) был опубликован, просмотреть у меня получилось только на выходных.
Я предполагал, что в гайде покажут стиль работы с новыми API, интеграции с RxJS, работу с конвертацией
Из интересного:
📌 Автор в комментах предлагает помечать свойства класса, которые используются только в шаблонах, как
📌 Добавление типа сущности в имена (component, service, pipe) - от данного подхода RFC предлагает отказаться, что вызвало бурное обсуждение. На мой взгляд, подобное правило приведет к путанице. Данный подход не должен быть регламентирован в официальном style guide, а принят в конкретном проекте командой/техлидом и изменен, если считаете, что это лучше отразит функциональность.
📌 Рекомендация писать отдельный файл для шаблона, если размер превышает несколько строк - будет убрана. И здесь, конечно же, отсылка к распространению JSX. О DevExp команда предпочла здесь забыть…
Что же, ждем. После столь значительных нововведений разработчики должны знать, на что ссылаться, применять на проектах. Ссылка на RFC здесь для вас.
Чат для обсуждений
#angular
На прошлой неделе RFC (Request For Comments) был опубликован, просмотреть у меня получилось только на выходных.
Я предполагал, что в гайде покажут стиль работы с новыми API, интеграции с RxJS, работу с конвертацией
toSignal() / toObservable() и тд. Но для этого придется ждать последующих обновлений.Из интересного:
📌 Автор в комментах предлагает помечать свойства класса, которые используются только в шаблонах, как
protected и уже сейчас переписать тесты, опираясь на это правило.📌 Добавление типа сущности в имена (component, service, pipe) - от данного подхода RFC предлагает отказаться, что вызвало бурное обсуждение. На мой взгляд, подобное правило приведет к путанице. Данный подход не должен быть регламентирован в официальном style guide, а принят в конкретном проекте командой/техлидом и изменен, если считаете, что это лучше отразит функциональность.
📌 Рекомендация писать отдельный файл для шаблона, если размер превышает несколько строк - будет убрана. И здесь, конечно же, отсылка к распространению JSX. О DevExp команда предпочла здесь забыть…
Что же, ждем. После столь значительных нововведений разработчики должны знать, на что ссылаться, применять на проектах. Ссылка на RFC здесь для вас.
Чат для обсуждений
#angular
🔥6
Для тех, кто еще не знает, анонсирован Angular Developer Event, на котором состоится выход 19 версии.
В вторник 19 ноября в 20:00 MSK. На скрине дата неправильная.
А чего бы вы хотели увидеть в новой версии?
На мой взгляд, эта версия скорее минорная. Из основного:
📌 Выход из dev preview многих фичей.
📌 Resource API. Experimental mode. В целом, сомнительный подход.
📌 Incremental hydration.
📌 Улучшение HMR (кто не знает, это обновление шаблонов, стилей без полной перезагрузки приложения).
Мне кажется, что переписывание Forms API на сигналы было бы куда интереснее. Но, в настоящее время, команда Angular только определила основные ограничения и находится в состоянии обсуждения возможных изменений. После чего планирует поделиться с сообществом конкретными предложениями в форме RFC.
#angular
В вторник 19 ноября в 20:00 MSK. На скрине дата неправильная.
А чего бы вы хотели увидеть в новой версии?
На мой взгляд, эта версия скорее минорная. Из основного:
📌 Выход из dev preview многих фичей.
📌 Resource API. Experimental mode. В целом, сомнительный подход.
📌 Incremental hydration.
📌 Улучшение HMR (кто не знает, это обновление шаблонов, стилей без полной перезагрузки приложения).
Мне кажется, что переписывание Forms API на сигналы было бы куда интереснее. Но, в настоящее время, команда Angular только определила основные ограничения и находится в состоянии обсуждения возможных изменений. После чего планирует поделиться с сообществом конкретными предложениями в форме RFC.
#angular
🔥5👍2
Что с ресурсами?
Попробую в заметке выяснить, что это и коротко подчеркнуть плюсы/минусы, которые вижу я.
Ресурс состоит из функции loader(), возвращающей
Новое API:
📌 обладает семантикой switchMap. Другими словами, предыдущие запросы будут отклонены и возвращены последние запрашиваемые данные.
📌 позволяет удобно обрабатывать ошибки и состояние загрузки. Можно просто обратиться к ресурсу и получить состояние.
📌 присутствует совместимость с RxJS.
Преимущества
1. Позволяет легко управлять состоянием загрузки, успешного завершения и ошибок без необходимости писать собственные велосипеды.
2. Возможная интеграция с Angular Forms. Это было бы круто связать данные между формами и асинхронными источниками. Есть в сети примеры с linkedSignal и формами.
3. Кэширование данных, что может значительно повысить производительность приложения, уменьшая количество запросов к серверу.
Недостатки
📌 Снова получаем 1000 и 1 способ сделать одно и то же.
Противоречие существующему
📌 Будет ли такая гибкость, как у RxJS? Пока что есть ощущение, что придется преобразовывать туда/обратно, что приведет к невообразимому количеству бойлерплейта. Если хотели уменьшить порог входа, то получили пока ровно обратное.
Пример, как на фото в комментариях, лично для меня сложно читаем. Это то, что ждут от Angular сейчас? Чтобы не тратить часы на разбор, цель в примере: получить список городов по запрашиваемому году основания.
Чат для обсуждений
#angular
Попробую в заметке выяснить, что это и коротко подчеркнуть плюсы/минусы, которые вижу я.
Ресурс состоит из функции loader(), возвращающей
Promise и опционального сигнала. Функция срабатывает при инициализации ресурса и при изменении параметров сигнала.cities = resource({
request: () => ({ id: this.id() }),
loader: (param) => {
return this.service.findCity(param.request);
}
});Новое API:
📌 обладает семантикой switchMap. Другими словами, предыдущие запросы будут отклонены и возвращены последние запрашиваемые данные.
📌 позволяет удобно обрабатывать ошибки и состояние загрузки. Можно просто обратиться к ресурсу и получить состояние.
this.cities.isLoading;
this.cities.error;
📌 присутствует совместимость с RxJS.
Преимущества
1. Позволяет легко управлять состоянием загрузки, успешного завершения и ошибок без необходимости писать собственные велосипеды.
2. Возможная интеграция с Angular Forms. Это было бы круто связать данные между формами и асинхронными источниками. Есть в сети примеры с linkedSignal и формами.
3. Кэширование данных, что может значительно повысить производительность приложения, уменьшая количество запросов к серверу.
// EditUserComponent
userId = input<string>();
userRes = rxResource({
request: () => ({ id: this.userId() }),
loader: (param) => this.service.getUser(param.id);
})
form = {
name: linkedSignal(() => this.userRes.value().name),
email: linkedSignal(() => this.userRes.value().email)
};
Недостатки
📌 Снова получаем 1000 и 1 способ сделать одно и то же.
Противоречие существующему
HttpClient. Очень интересно, представят ли в следующих версиях отдельный HttpClient с тем же API, но возвращающим Promise?📌 Будет ли такая гибкость, как у RxJS? Пока что есть ощущение, что придется преобразовывать туда/обратно, что приведет к невообразимому количеству бойлерплейта. Если хотели уменьшить порог входа, то получили пока ровно обратное.
Пример, как на фото в комментариях, лично для меня сложно читаем. Это то, что ждут от Angular сейчас? Чтобы не тратить часы на разбор, цель в примере: получить список городов по запрашиваемому году основания.
Чат для обсуждений
#angular
👍4🤔3
На недавней конференции разработчики Angular говорили о возможном расширении лексического окружения, которое будет распространяться на шаблоны. Примеры того, как это может выглядеть, показаны на скрине.
Это означает, что мы могли бы использовать всё то же, что и в классе компонента, но без необходимости объявлять свойства в классе.
И уже есть МР, добавляющий поддержку глобального this для шаблонов.
Возвращение к AngularJS? Что вы думаете об этом?
И, еще из недавних обновлений, прочитал на выходных, что LinkedSignal все-таки будет в dev preview, (не experimental) в 19 версии.
Чат для обсуждений
#angular
Это означает, что мы могли бы использовать всё то же, что и в классе компонента, но без необходимости объявлять свойства в классе.
И уже есть МР, добавляющий поддержку глобального this для шаблонов.
Возвращение к AngularJS? Что вы думаете об этом?
И, еще из недавних обновлений, прочитал на выходных, что LinkedSignal все-таки будет в dev preview, (не experimental) в 19 версии.
Чат для обсуждений
#angular
👍6🤔1
Привет!
Мы знаем, что вы до сих пор спите и видите сны на TypeScript! 🌟
Мы прекрасно знаем, как вы любите Angular. Сейчас ещё есть возможность зарегистрироваться на Angular Meetup #23.
Мы будем обсуждать текущее состояние Angular и что нас ждет. Узнаем, сколько версий фреймворка нужно пропустить, чтобы считать свой проект устаревшим. 👩💻
В конце нас ждет афтепати в лучших традициях: настолки, задачи на написание кода и неформальный нетворкинг с единомышленниками.
✅ Если ты с нами
1️⃣ Регистрируйся здесь
2️⃣ Добавляй напоминание в календарь
3️⃣ Поделись этим сообщением с друзьями - чем больше нас будет, тем веселее!
Если не получится прийти на митап, можно посмотреть трансляцию онлайн.
Мы знаем, что вы до сих пор спите и видите сны на TypeScript! 🌟
Мы прекрасно знаем, как вы любите Angular. Сейчас ещё есть возможность зарегистрироваться на Angular Meetup #23.
Мы будем обсуждать текущее состояние Angular и что нас ждет. Узнаем, сколько версий фреймворка нужно пропустить, чтобы считать свой проект устаревшим. 👩💻
В конце нас ждет афтепати в лучших традициях: настолки, задачи на написание кода и неформальный нетворкинг с единомышленниками.
✅ Если ты с нами
1️⃣ Регистрируйся здесь
2️⃣ Добавляй напоминание в календарь
3️⃣ Поделись этим сообщением с друзьями - чем больше нас будет, тем веселее!
Если не получится прийти на митап, можно посмотреть трансляцию онлайн.
🔥4
Angular 19 вышел
Что нового? Я подчеркнул основные фичи, на мой взгляд.
📌 Поддержка TS 5.7
📌 Теперь в статусе stable: takeUntilDestroyed, signal quieries, model, inputs, outputToObservable, outputFromObservable, @let
📌 Добавлены схематики для конвертации @Input , DOM queries на сигнальные.
📌 При обновлении будет автоматическая миграция, в ходе которой удалится флаг standalone: true для существующих standalone сущностей и добавится standalone: false для NgModule. При желании можно включить режим компилятора strictStandalone для генерации только таких компонентов.
📌 Добавлено свойство для обнаружения неиспользуемых импортов standalone сущностей. Опция включается в tsconfig.
📌 Добавлен input в RouterOutlet, который позволит передавать данные из родительского компонента в компоненты вывода. Значение будет доступно для дочерних компонентов через токен ROUTER_OUTLET_DATA.
Подробнее по ссылке
#angular
Что нового? Я подчеркнул основные фичи, на мой взгляд.
📌 Поддержка TS 5.7
📌 Теперь в статусе stable: takeUntilDestroyed, signal quieries, model, inputs, outputToObservable, outputFromObservable, @let
📌 Добавлены схематики для конвертации @Input , DOM queries на сигнальные.
ng generate @angular/core:signal-input-migration
ng generate @angular/core:signal-queries-migration
📌 Добавлен afterRenderEffect() замещает случаи, где нужно использовать effect(). позволяет создавать эффекты для работы с DOM элементами. При этом Angular будет оптимизировать подобные вызовы.📌 При обновлении будет автоматическая миграция, в ходе которой удалится флаг standalone: true для существующих standalone сущностей и добавится standalone: false для NgModule. При желании можно включить режим компилятора strictStandalone для генерации только таких компонентов.
📌 Добавлено свойство для обнаружения неиспользуемых импортов standalone сущностей. Опция включается в tsconfig.
{ "angularCompilerOptions": {
"extendedDiagnostics": {
"checks": {
"unusedStandaloneImports": "suppress"
}
}
}
}
📌 Добавлено новое Incremental Hydration API.📌 Добавлен input в RouterOutlet, который позволит передавать данные из родительского компонента в компоненты вывода. Значение будет доступно для дочерних компонентов через токен ROUTER_OUTLET_DATA.
Подробнее по ссылке
#angular
Medium
Meet Angular v19
In the past two years we doubled down on our investment in developer experience and performance — in every single release we’ve been…
❤7👍2
Немного для дизайнеров
Я очень редко публикую какие-либо заметки о дизайне. И сейчас тот самый случай)
Нашел ресурсы, которые могут быть полезны как для начинающих, так и для опытных специалистов, стремящихся улучшить свои навыки в области дизайна и разработки.
📌 designsystems.surf - здесь можно найти ссылки на дизайн системы известных компаний. Можно вдохновиться решениями.
📌 component.gallery - посвящен UI компонентам для веба. Тут собраны дизайны из разных UI библиотек. Для тех, кто сейчас проектирует систему, собирает макет и тд может быть весьма полезен. Мне стало интересно, что будет написано о компоненте Popover. На странице указаны рекомендации по реализации, советы в области a11y. Даже показан пример недавно появившегося Popover API.
В общем, может пригодится:) Надо же разбавить фронтовые темы небольшими рекомендациями из сферы дизайна.
#ux_design
Я очень редко публикую какие-либо заметки о дизайне. И сейчас тот самый случай)
Нашел ресурсы, которые могут быть полезны как для начинающих, так и для опытных специалистов, стремящихся улучшить свои навыки в области дизайна и разработки.
📌 designsystems.surf - здесь можно найти ссылки на дизайн системы известных компаний. Можно вдохновиться решениями.
📌 component.gallery - посвящен UI компонентам для веба. Тут собраны дизайны из разных UI библиотек. Для тех, кто сейчас проектирует систему, собирает макет и тд может быть весьма полезен. Мне стало интересно, что будет написано о компоненте Popover. На странице указаны рекомендации по реализации, советы в области a11y. Даже показан пример недавно появившегося Popover API.
В общем, может пригодится:) Надо же разбавить фронтовые темы небольшими рекомендациями из сферы дизайна.
#ux_design
❤3👍2
Директивы ngStyle and ngClass deprecated!
В 19.1 уже будет рекомендация их не использовать. Вместо этого предлагается биндить значения к встроенным
МР содержит заметку с ограничениями, которые есть у нативных способов привязки:
📌 Нет поддержки Set.
📌 Не получится добавить несколько стилей/классов, разделенных пробелом.
Например, вместо подобной записи
можно использовать такую:
Как обычно, прикрепляю МР с подробностями.
И еще небольщое обновление: теперь здесь можно выбрать версию и посмотреть статус фичи, которая вас интересует.
Подписывайся / Чат
#angular
В 19.1 уже будет рекомендация их не использовать. Вместо этого предлагается биндить значения к встроенным
[class] и [style]. Давно собирались это сделать, решили только сейчас, несмотря на то, что фича продолжает довольно широко использоваться в проектах:) МР содержит заметку с ограничениями, которые есть у нативных способов привязки:
📌 Нет поддержки Set.
📌 Не получится добавить несколько стилей/классов, разделенных пробелом.
Например, вместо подобной записи
<div [ngClass]="{ 'ring ring-pink-500 ring-offset-2 dark:ring-green-500' : condition }">можно использовать такую:
<div class="{{ condition ? 'ring ring-pink-500 ring-offset-2 dark:ring' : '' }}"></div>Как обычно, прикрепляю МР с подробностями.
И еще небольщое обновление: теперь здесь можно выбрать версию и посмотреть статус фичи, которая вас интересует.
Подписывайся / Чат
#angular
❤4👍2
Обновление безопасности (CSP)
Только сейчас узнал, что еще было добавлено в новой версии! Теперь Angular автоматически будет генерировать hash-based CSP, реализуя строгую политику безопасности. Необходимо добавить параметр в angular.json:
Hash-based CSP позволяет указывать хеши для каждого встроенного скрипта, что делает их безопасными для выполнения. Это означает, что только скрипты с известными хешами будут выполняться, и злоумышленники не смогут внедрить свой код без соответствующего хеша.
Сегодня вместо того, чтобы предоставлять список разрешений, из которого можно загружать скрипты, рекомендуется использовать строгий CSP, который бывает двух видов: nonce-based и hash-based. Первый требует генерации уникального идентификатора для каждого ответа, CSP на основе хэша - идеальный выбор для статически обслуживаемого контента без рендеринга на стороне сервера (SSR).
Подписывайся / Чат
#angular #js
Только сейчас узнал, что еще было добавлено в новой версии! Теперь Angular автоматически будет генерировать hash-based CSP, реализуя строгую политику безопасности. Необходимо добавить параметр в angular.json:
"security": {
"autoCSP": true
}Hash-based CSP позволяет указывать хеши для каждого встроенного скрипта, что делает их безопасными для выполнения. Это означает, что только скрипты с известными хешами будут выполняться, и злоумышленники не смогут внедрить свой код без соответствующего хеша.
Сегодня вместо того, чтобы предоставлять список разрешений, из которого можно загружать скрипты, рекомендуется использовать строгий CSP, который бывает двух видов: nonce-based и hash-based. Первый требует генерации уникального идентификатора для каждого ответа, CSP на основе хэша - идеальный выбор для статически обслуживаемого контента без рендеринга на стороне сервера (SSR).
Подписывайся / Чат
#angular #js
👍5🔥3