[JSConf EU 2018] Райан Даль: ошибки проектирования Node.js

Node.js внешний интерфейс JavaScript deno V8

На JS Conf Berlin ранее Райан Даль, известный как отец Nodejs, выступил с речью «10 вещей, о которых я сожалею о Node.js» и выпустил новый проект Deno.Стоит отметить, что это второй публичный доклад Райа, и первый — это выпуск Node.js, эта статья расскажет вам об основных моментах выступления Рая.

Резюме, нарисованное от руки пользователя твиттера @malweene

Обсуждение, часть 1: Успех Nodejs

В этой части рассказывается о процессе разработки Node. Рай считает, что Node проделал хорошую работу в I/0, управляемом событиями http-сервере, и упоминает поддержку Node некоторых протоколов, кроссплатформенность, экосистему npm и т. д. для продвижения Node. Фактор успеха, и благодаря некоторым людям, которые внесли свой вклад в Node. Рай всегда считал, что JavaScript — лучший динамический язык, а динамический язык подходит для научных вычислений (это может быть связано с тем, что Рай присоединился к команде Google Brain после ухода из Node, занимаясь исследованиями в области глубокого обучения).

Выступление, часть 2: Tucao на Nodejs

Эта часть, можно сказать, стала кульминацией всего выступления, она жаловалась на 7 (не должно быть 10???) дизайнов на Node, о которых сожалел RY.

1. Не выполнять обещания

Promise — необходимая абстракция для async/await. Отсутствие настойчивости в Promise привело к серьезному устареванию многих асинхронных API в Node.

2. Недостаточная безопасность

V8 сама по себе является очень хорошей средой-песочницей, но Node не воспользовался этим врожденным преимуществом в своей ранней разработке, в результате чего программы могут легко получить доступ к системе и сети.

3. Неправильно придерживаться GYP

Поскольку Chrome отказался от GYP, Node является единственным пользователем GYP, а Рай считает, что существует слишком много сложных и ненужных абстракций.Вместо того, чтобы позволить пользователям писать расширения C++ для привязки V8, лучше предоставить основной внешний интерфейс функций, более надежный. . Рай считает ошибки проектирования в системе сборки самым большим сожалением Node.

4. package.json

Из-за поддержки require, package.json позже стал стандартом модуля де-факто, но, к сожалению, поскольку существование package.json признано, но требование ('модуль') неоднозначно, что приводит к локальным зависимостям, когда дело доходит до библиотеки или частные зависимости, это становится очень запутанным. А package.json содержит слишком много избыточных описаний, лицензий, репозиториев, описаний и т. д., а «модуль», предлагаемый package.json в качестве каталога файлов, не является необходимой абстракцией.

5. node_module

Это увеличивает сложность синтаксического анализа модуля и отклоняется от семантики браузера, но устранить его сейчас нельзя.

6. require('module') без расширения ".js"

Это избыточно, и загрузчик модуля должен угадать, является ли это «.js» или «.json», что также несовместимо с семантикой браузера.

7. index.js

На самом деле не обязательно загружать index.js по умолчанию, потому что может быть index.html….

Упомянутые выше сожаления в основном связаны с управлением кодом, а не с созданием высокопроизводительных серверов, на которых Рай сосредоточился ранее. На самом деле, когда Ry высказал эти сожаления, это было равносильно тому, что он предложил прототип нового поколения среды выполнения js/ts v8 -> Deno, и его основной целью было решение вышеуказанных проблем.

Лекция, часть 3: Введение и ожидания от Deno

1. Безопасность

Deno воспользуется тем фактом, что JS — это песочница безопасности, позволяющая безопасно запускать ненадежные программы.

  • По умолчанию программам запрещен прямой доступ к сети или файловой системе.
  • Доступен с помощью --allow-net --allow-write Не позволяет напрямую привязывать функции расширения к V8, что упрощает процесс и упрощает аудит.
  • Все системные вызовы выполняются через передачу сообщений (сериализация protobuf).
  • Две нативные функции: send и recv

2. Упростите модульную систему

  • Не буду пробовать и модульная система совместима с существующим Node.
  • Импортируйте только относительный / абсолютный URL-адрес, и вы должны предоставить путь к расширению импорта
  • Удаленный URL-адрес будет кэшироваться навсегда после первой загрузки, укажите только --reload для повторного получения ресурса, что можно обойти, указав каталог кэширования не по умолчанию.

3. Встройте компилятор TypeScript в исполняемый файл

4. Один исполняемый файл

5. Воспользуйтесь преимуществами технологий 2018 года

Используйте Parcel для компиляции и упаковки модулей Node для обеспечения начальной загрузки во время выполнения.

Обеспечивает надежную инфраструктуру в собственном коде

  • Существуют и другие механизмы, ответственные за реализацию HTTP, которые раньше были невозможны в Node.
  • В настоящее время не-JS части Deno написаны на ходу, но прототипирование еще не полностью завершено, на самом деле Rust и C++ также хороши в некоторых аспектах.

6. Другое

  • Завершить программу при возникновении неперехваченной ошибки Promise
  • Поддержка ожидания верхнего уровня
  • Совместимые браузеры (когда функции перекрываются)

Речь Рая примерно такая: хотя Deno до сих пор недоступен и не выпустил бинарную версию, проект всего за несколько дней набрал десятки тысяч звезд.

Послесловие:

В настоящее время проектирование крупномасштабной внешней разработки, SSR и другие возможности в основном предоставляются Node, плюс некоторые внутренние службы, созданные с использованием преимуществ Node, все имеют определенное время разработки.Поэтому для разработчиков JS У Node еще много времени на будущее, но это все еще проект, который стоит продолжать изучать.

Конечно, если вы одобряете какие-то разработки Deno, лучший способ сейчас — это начать инвестировать в обучение.Начните с изучения языка Go, а после изучения Go перейдите к исходникам Deno, а также при чтении можно упомянуть PR. После прочтения исходного кода Deno API почти закончился, вы можете использовать TypeScript для написания демо, и, наконец, даже если никто не использует Deno в музее, вы все равно изучили Go и Typescript и предоставили исходный код для крупных проектов с открытым исходным кодом. ..

Использованная литература: