Комментарии 26
лучше бы разработчики node.js сделали всё открытое, а кому уже нужно закрывать, те бы писали private перед переменными.
так уже было изначально в браузерах, когда функция, объявленная в одном тэге script была доступна в другом. Такой подход оказался очень неудобным, и разработчикам пришлось изощряться, чтобы создать себе приватную область видимости. Полностью эта история рассказана в этой статье.
Поэтому текущий модульный подход с необходимостью писать явный export оказывается лучше и удобнее для большинства разработчиков. Мы изначально высвечиваем из модуля его публичное API, а потом уже модифицируем его внутри как хотим, и нам не нужно писать private каждый раз, когда мы рефакторим и создаем внутри новые функции и переменные.
Именно поэтому, на опыте прошлых ошибок, JS-модули сделаны с явным экспортом, чтобы не было случайных утечек приватных функций
я должен писать список ещё и при экспортировании.
А я ещё и комментарий пишу с рекомендуемым способом импортирования этого модуля.
Потому что это удобнее, чем каждый раз вспоминать, что и под какими именами из него импортируется.
export
, если можно это сделать в конце файла?:export {
name1,
name2,
...
}
Меня очень бесит, что перед каждой переменной и функцией в модулях нужно писать слово export.
И правильно бесит, потому что не нужно так делать.
Экспериментально эта возможность была доступна с Node 8.0 с 0 фазы. Текущий релиз — это большой шаг в этом направлении
Неплохо было бы раскрыть, что именно произошло здесь. Попробую это сделать.
8 версия содержала в себе старую версию реализации. У этой реализации были недостатки, поэтому было решено переделать ее. Текущая версия является обладает новыми возможностями, например доступом к классическому require() из es-модуля.
Кроме этого, новая реализация позволяет использовать расширение .js
для es-модулей (вместо специального .mjs
), предлагая использовать поле "type": "module" в package.json, чтобы авторы npm-модулей могли сами определять, является ли их пакет es-модулями, или старыми commonjs
Ответ на этот вопрос есть в официальном FAQ. Ещё вот тут в комментариях на Хабре эту тему поднимали.
А если совсем коротко, то не так уж просто добавить полноценный private keyword в динамический язык с 20-летней историей
На данный момент, насколько я понимаю, не весь JS-код будет валидным для TS?
Что нового в Node 12