Deno, будущий TypeScript и Laravel
Frontend-разработка — это тысячи инструментов, сотни языков и десятки фреймворков. Сегодня узнаем, для чего создавался фреймворк Deno, взглянем на бета-версию языка TypeScript 5 и расскажем о ключевых фичах Laravel 9.51.
Deno от создателя Node.js
Инновационные идеи часто рождаются из критики. Американский программист Райан Даль (Ryan Dahl) был крайне недоволен существующими ограничениями самого популярного, на тот момент, веб-сервера Apache. Он решил самостоятельно изменить подход к веб-разработке и к ноябрю 2009 года создал Node.js. Этот фреймворк завоевал бешеную популярность. Разработчиков привлекала лёгкость, высокая масштабируемость и обширное комьюнити.
У Node.js были и недостатки, часть из которых были заложены ещё на этапе проектирования. Исправить их спустя много лет развития уже было нельзя. Но там, где одни видят проблемы, другие видят возможности. Рантайм Deno стал для Райана Даля своеобразной «работой над ошибками». Релиз несколько раз переносился и был выпущен лишь через 2 года после анонса на JSConf.
Deno безопасен по-умолчанию, это сделано на уровне архитектуры. Он не может просто так получить доступ к файловой системе или сети. Используется модель явного предоставления разрешений. Делается это флагами командной строки или запросами во время выполнения. Такой подход позволяет снизить риск атак через цепочки поставок.
Другой задачей Deno было обеспечить более низкоуровневый доступ к железу. При помощи JavaScript можно решать множество задач из сферы машинного обучения и статистики. Но при этом сразу же встаёт вопрос производительности. Достичь высокой скорости вычислений можно с помощью переноса на GPU. Так что Райан решил включить поддержку стандарта WebGPU, дающего доступ к API для программирования видеокарт. Этот гибрид из Vulkan, Metal, и Direct3D 12 пока ещё не имеет статус официального стандарта консорциума W3C и находится в стадии черновика.
Очевидно, что дальнейшее развитие Deno и стандарта WebGPU может изменить сложившийся баланс, при котором языки R и Python занимают лидирующие позиции в сфере ML. А простота и защищённость, может быть, заставят обратить на себя внимание тех разработчиков, которые сомневаются и предпочитают оставаться на Node.js.
TypeScript 5 Beta
Грядущее обновление обещает быть крайне интересным. Прежде всего в TypeScript 5 Beta появились декораторы для повторного использования классов и их элементов. Но это не та экспериментальная функция, которая активировалась флагом --experimentalDecorators. Раньше без этого флага попытка использовать декораторы приводила к ошибке.
Сейчас же декораторы заработают и без дополнительных флагов, а их поведение будет значительно отличаться. Они несовместимы с --emitDecoratorMetadata, а также обладают ещё одним дополнительным ограничением. Для файлов JavaScript декоратор класса должен объявляться только после ключевого слова export (если таковое есть):
export @register class Foo {
// ...
}
export
@Component({
// ...
})
class Bar {
// ...
}
На файлы TypeScript это ограничение не распространяется. Старое поведение декораторов никуда не делось и по-прежнему включается флагом --experimentalDecorators.
Конструкцию as const теперь можно не раскидывать по разным местам кода, а указать, что это вывод по-умолчанию. Файлам конфигурации добавили гибкости. Расширять их с помощью поля extends можно было и раньше, но оно принимало только одно значение. Теперь там можно указать несколько записей:
{
"compilerOptions": {
"extends": ["a", "b", "c"]
}
}
В случае конфликтов полей «выигрывает» последняя запись.
Ещё разработчики убрали путаницу между двумя существующими типами перечислений. Числовое перечисление раньше представляло собой просто набор однотипных числовых констант. С версии TypeScript 2.0 появился литеральный тип перечислений — каждый элемент перечисления обладал собственным типом. Фактически, перечисление становилось объединением типов. Это давало бонус в виде возможности ссылаться на подмножество типов или сужать их.
Работало это, только если у каждого элемента перечисления имелось вычисляемое значение. Если внезапно элемент инициализировался вызовом функции, то TypeScript сдавался и делал вид, что никакого литерального типа перечислений тут нет. То есть все плюшки от литерального типа перечислений исчезали. Новая версия TypeScript 5 убирает разницу, создавая некий гибрид из существующих типов перечислений. Это означает, что теперь все они могут быть сужены, а их элементам можно указывать собственные типы.
Это лишь некоторые существенные изменения будущей версии. Полный список изменений есть в блоге проекта. Попробовать пятую бету в деле уже можно через NuGET или npm:
npm install typescript@beta
Laravel обновился до 9.51
Любопытное событие произошло буквально вчера. За неделю до релиза Laravel 10 было внесено несколько полезных изменений. Инструмент Laravel Sail для взаимодействия с Docker пополнился командой sail:add. Он нужна, если вы забыли указать какой-либо сервис во время инициализации. Больше это не будет головной болью.
У инструмента для end-to-end тестирования Laravel Dusk появился трейт DatabaseTruncation, помогающий при первом тесте осуществить миграцию базы данных и выполнить усечение таблиц. За счёт этого последующие тесты будут выполняться значительно быстрее. Но перед использованием нужно не забыть установить пакет doctrine/dbal:
composer require --dev doctrine/dbal
Ещё одно полезное изменение обезопасит код от непреднамеренной генерации новых запросов к базе данных. Теперь можно указать ожидаемое количество запросов и выбросить исключение при их превышении:
public function testItWorksEfficiently()
{
$this->expectsDatabaseQueryCount(5);
// do stuff...
// throws an exception on tearDown if more than 5 queries have run
// since the expectation was created.
}
Ещё в эту версию вошёл билдер для выстраивания отношений «has-one-through» и «has-many-through». Тут нет ничего нового, но с точки зрения ментальной модели такое выражение будет значительно понятнее.
From A through B give me C:
$a->through($a->b())->has(fn ($b) => $b->c());
Предположим, что у нас есть связи:
- Mechanic -> Has One -> Car
- Car -> Has One -> Owner
Таким образом отношение «has one through» теперь можно выразить кодом:
class Mechanic extends Model
{
public function owner()
{
return $this->through($this->car())
->has(fn (Car $car) => $car->owner());
}
public function car()
{
return $this->hasOne(Car::class);
}
}
Для второго примера возьмём следующие связи:
- Project -> Has Many -> Environment
- Environment -> Has Many -> Deployment
Отношение «has many through» также становится нагляднее и проще:
class Project extends Model
{
public function deployments()
{
return $this->through($this->environments())
->has(fn (Environment $env) => $env->deployments());
}
public function environments()
{
return $this->hasMany(Environment::class);
}
}
Вишенкой на торте стала доработка HTTP-клиента Laravel, куда были добавлены URI-шаблоны, основанные на guzzlehttp/uri-templates:
Http::withUrlParameters([
'endpoint' => 'https://laravel.com',
'page' => 'docs',
'version' => '9.x',
'thing' => 'validation',
])->get('{+endpoint}/{page}/{version}/{thing}');
// https://laravel.com/docs/9.x/validation
Полный changelog есть на GitHub.
Митапы
Frontend meetup
26 апреля 2023
Рады сообщить, что у нас запланирован весенний Frontend Meetup. Программа мероприятия формируется. Подать заявку на участие спикера можно до 10 апреля. Детальная информация будет опубликована позже, следите за нашими новостями.
Теперь следить за митапами Evrone стало удобнее. В Telegram-канале Evrone meetups мы выкладываем анонсы с подробными описаниями докладов, а также студийные записи после мероприятий. А ещё, у нас можно выступить, мы поможем оформить вашу экспертизу в яркое выступление. Подписывайтесь и пишите @andrew_aquariuss, чтобы узнать подробности.
Вакансии
Удаленка / Офис
Evrone
Мы рады новым Frontend-разработчикам. Удалённая работа с первого дня, помощь в подготовке выступлений на профессиональных конференциях, поощрение и оплата участия в Open-source проектах. Прозрачный способ увеличить грейд через обучение и проверку навыков под контролем ментора. Здесь есть понимание, как организовать разработку комфортно и эффективно. Присоединяйтесь!