Forwarded from Dev News от Максима Соснова
Default Exports in JavaScript Modules Are Terrible
Ещё одна статья, в которой рассказывается, почему не стоит использовать
В кратце:
- Автокомплит не подсказывает, что у модуля есть
- То, что экспортируется через
Если вам нужен аргумент против использования
В целом у
Лично я предпочитаю забанить
https://www.lloydatkinson.net/posts/2022/default-exports-in-javascript-modules-are-terrible/
#development #javascript #modules
Ещё одна статья, в которой рассказывается, почему не стоит использовать
export default.В кратце:
- Автокомплит не подсказывает, что у модуля есть
export default, если вы начали делать импорт через { }- То, что экспортируется через
export default может быть импортировано под любым именем. Это создает сразу несколько проблем: возможность криво назвать, то что импортируется; возможность назвать по-разному одну и ту же сущность в разных файлах; возможность неконсистентного именования при импортах из пакетовЕсли вам нужен аргумент против использования
export default в своих проектах - посмотрите эту статью.В целом у
export default есть боле мене адекватные места для применения. Например, библиотеки. import React from 'react' - это как раз случай, когда export default не делает хуже. Хотя и с именоваными экспортами было бы нормально.Лично я предпочитаю забанить
export default в проектах на уровне линтера. Отсутствие адекватного автокомплита и возможность накосячить с именованием слишком сильно бьют по DX в проектеhttps://www.lloydatkinson.net/posts/2022/default-exports-in-javascript-modules-are-terrible/
#development #javascript #modules
Lloyd Atkinson
Default Exports in JavaScript Modules Are Terrible
Default exports lead to mismatched and confusing names. Named exports should be used instead.
👍27👎5
Forwarded from Dev News от Максима Соснова
Ecma International approves ECMAScript 2025: What’s new?
25 июня зафиксировали стандарт ECMAScript 2025.
Что зафиксировали: импорт-атрибуты (нужны для JSON-модулей), хелперы для итераторов, новые методы Set, немного улучшили RegExp, добавили
Import attributes
Добавили в язык возможность импортировать не JS код. Для этого понадобилось добавлять синтаксис, который бы объяснял движку или рантайму, что сейчас будет импорчено
Хелперы для итераторов
Для массивов есть удобные методы, а для итераторов - нет. Решили исправить эту несправедливость и перенесли часть методов на итераторы
Адаптированные для итератора методы
-
-
-
-
-
-
-
-
Также сделали аналоги
-
-
Еще сделали удобный метод для преобразования итератора в массив
Новые методы Set
- Создание нового сета из двух существующих:
-
-
-
-
- Определение отношения наборов:
-
-
-
Улучшения RegExp
Флаги теперь можно применять не ко всему RegExp, а к отдельным группам
Можно использовать одинаковые имена для групп
Promise.try
Если функция
Работа с 16-битными числами
По дефолту числа в JS представлены 64-битными числами с плавающей точкой. Но есть кейсы, когда необходимо вести все вычисления в 16 или 32-битных числах. В JS добавили разные хелперы для работы с такими числами, например
https://2ality.com/2025/06/ecmascript-2025.html
#development #javascript #ecmascript #releaseNotes
25 июня зафиксировали стандарт ECMAScript 2025.
Что зафиксировали: импорт-атрибуты (нужны для JSON-модулей), хелперы для итераторов, новые методы Set, немного улучшили RegExp, добавили
Promise.try и поддержки 16-битных чисел с плавающей точкойImport attributes
Добавили в язык возможность импортировать не JS код. Для этого понадобилось добавлять синтаксис, который бы объяснял движку или рантайму, что сейчас будет импорчено
import configData1 from './config-data.json' with { type: 'json' };
// Dynamic import
const configData2 = await import(
'./config-data.json', { with: { type: 'json' } }
);
Хелперы для итераторов
Для массивов есть удобные методы, а для итераторов - нет. Решили исправить эту несправедливость и перенесли часть методов на итераторы
const arr = ['a', '', 'b', '', 'c', '', 'd', '', 'e'];
assert.deepEqual(
arr.values() // creates an iterator
.filter(x => x.length > 0)
.drop(1)
.take(3)
.map(x => `=${x}=`)
.toArray()
,
['=b=', '=c=', '=d=']
);
Адаптированные для итератора методы
-
iterator.filter(filterFn)-
iterator.map(mapFn)-
iterator.flatMap(mapFn)-
iterator.some(fn)-
iterator.every(fn)-
iterator.find(fn)-
iterator.reduce(reducer, initialValue?)-
iterator.forEach(fn)Также сделали аналоги
slice-
iterator.drop(limit) возвращает новый итератор без первых limit значений (по сути slice(limit))-
iterator.take(limit) возвращает новый итератор с первыми limit значениями (по сути slice(0, limit))Еще сделали удобный метод для преобразования итератора в массив
iterator.toArray()Новые методы Set
- Создание нового сета из двух существующих:
-
Set.prototype.intersection(other) - пересечение - только те значения, которые есть в обоих наборах-
Set.prototype.union(other) - объединение - значение из обоих наборов-
Set.prototype.difference(other) - позволяет достать множество, которое получится если из множества А убрать все элементы множества Б -
Set.prototype.symmetricDifference(other) - позволяет достать множество, которое содержит элементы которые входят только в одно из множеств- Определение отношения наборов:
-
Set.prototype.isSubsetOf(other) - является ли набор А - подмножеством набора Б-
Set.prototype.isSupersetOf(other) является ли набор А - надмножеством набора Б-
Set.prototype.isDisjointFrom(other) - возвращает true, если у множеств нет пересеченийassert.deepEqual(
new Set(['a', 'b', 'c']).union(new Set(['b', 'c', 'd'])),
new Set(['a', 'b', 'c', 'd'])
);
assert.deepEqual(
new Set(['a', 'b', 'c']).intersection(new Set(['b', 'c', 'd'])),
new Set(['b', 'c'])
);
assert.deepEqual(
new Set(['a', 'b']).isSubsetOf(new Set(['a', 'b', 'c'])),
true
);
assert.deepEqual(
new Set(['a', 'b', 'c']).isSupersetOf(new Set(['a', 'b'])),
true
);
Улучшения RegExp
RegExp.escape(text) позволяет вставить текст в RegExp и быть уверенным, что вставленный текст не сломает RegExpconst regExp = new RegExp(
`(?<!“)${RegExp.escape(text)}(?!”)`,
'gu'
);
Флаги теперь можно применять не ко всему RegExp, а к отдельным группам
/^x(?i:HELLO)x$/.test('xHELLOx') // true
Можно использовать одинаковые имена для групп
const RE = /(?<chars>a+)|(?<chars>b+)/v;
Promise.try
Promise.try немного упрощает создание промиса с синхронными функциями return Promise.try(() => {
const value = syncFuncMightThrow();
return asyncFunc(value);
});
Если функция
syncFuncMightThrow бросит исключение, то Promise.try вернет реджектнутый промис.Работа с 16-битными числами
По дефолту числа в JS представлены 64-битными числами с плавающей точкой. Но есть кейсы, когда необходимо вести все вычисления в 16 или 32-битных числах. В JS добавили разные хелперы для работы с такими числами, например
Math.f16round делает округление в пространстве 16-битных чиселconsole.log(Math.f16round(2**16)) // Infinity
console.log(2**16) // 65536
https://2ality.com/2025/06/ecmascript-2025.html
#development #javascript #ecmascript #releaseNotes
2Ality
Ecma International approves ECMAScript 2025: What’s new?
On 25 June 2025, the 129th Ecma General Assembly approved the ECMAScript 2025 language specification (press release, GitHub release), which means that it’s officially a standard now. This blog post explains what’s new.
🔥33❤4 2👍1