JavaScript не имеет стандартной библиотеки?

JavaScript
JavaScript не имеет стандартной библиотеки?

Недавно я решил проблему в SegmentFault, и меня больше впечатлила проблема:Новичок пытается импортировать сетевой модуль Node.js в браузер. Результат - пустой объект после печати консоли.

Для тех, кто имеет некоторый опыт работы с Javascript, это вопрос «умственно отсталого» Как вы можете запускать программы Node на стороне браузера? Поскольку эти модули Node проходят черезОбработка веб-пакета, поэтому он становится пустым объектом, и лучший способ справиться с ним — создать исключение.

Подумайте хорошенько.Для этих разработчиков, которые только начали Javascript или перешли с других языков, они вообще не имеют понятия.Например, такие языки, как Python, Ruby и Java имеют мощные стандартные библиотеки, которые могут удовлетворить 80% разработки В какой среде и на какой платформе он работает, он в основном может использовать этот набор стандартных библиотек единообразно. Текущий статус Javascript: разные операционные среды, структура API фрагментирована..

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

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

Я думаю, что многие люди думают так же, как и яВеб-API, предоставляемый браузером === Стандартная библиотека Javascript, Напримерconsole.log,setTimeout(Эти функции не включены в спецификацию Javascript, как описано ниже.) Точно так же, как и те, кто использовал JQuery как «Javascript».

Только с появлением NodeJS Javascript освободился от ограничений браузера и распространился на серверное поле, перестав быть «песочницей». NodeJS определяет множество модулей для поддержки разработки на стороне сервера, таких как fs, os, Buffer и net. Но эти API не являются стандартом Javascript, то естьNodeJS !== Javascript.

Позже я не мог больше учиться.Первоначальный автор NodeJS жаловался на NodeJS и придумал другой.Deno, он также будет иметь собственную стандартную библиотеку и определять собственную файловую систему и сетевой API. Название подразумевает, что эти API несовместимы с NodeJS. Хорошо, теперь вернемся к вопросу в начале статьи,Если deno будет развиваться, возможно, когда-нибудь кто-нибудь попытается ссылаться на модули Deno в браузере.?



Существующая структура API Javascript

Как показано выше, Javascript на самом деле имеет относительно тонкий глобальный, общий,стандартный, основной уровень API, а именно标准内置对象, которые являются встроенными объектами в ядре языка, к которым можно получить глобальный доступ. Дело в том, что это стандартные и ониСпецификация ECMAScriptопределяется в .На этой основе различные среды выполнения расширяют свои собственные API.

Возьмем в качестве примера браузер:

Веб-API на стороне браузера представляет собой очень сложный набор API-интерфейсов. На приведенном выше рисунке он обобщен и включает в себя две вещи:

  • Core DOMDOM — это общая технология, не ограниченная только браузерами, эта спецификация определяет синтаксический анализ и манипулирование структурированными документами. Определены основные типы узлов и методы работы. Операции, не ограничивающиеся HTML
  • HTML DOMЕго можно рассматривать как расширение Core DOM, которое определяет различные типы объектов HTML-элементов, расширяет методы работы с элементами, а также включает интерфейсы, связанные с браузером, такие как XMLHttpRequest. Этот элемент также обычно называют спецификацией.

Базовый обзор WebAPI:

Если вы обратите внимание на канонические ссылки под документацией MDN, вы найдете некоторые канонические ссылки.W3C, некоторые цитировалиWHATWG, За кем последнее слово?

Если вы приподнимете крышку, это фарс. Если вы следили за новостями некоторое время назад, вы увидите эти заголовки.WHATWG побеждает W3C и получает контроль над HTML и DOM','W3C будет работать с WHATWG над разработкой новейших стандартов спецификаций HTML и DOM.". Вы, наверное, можете догадаться об отношениях между этими двумя организациями. В этой статье мы не будем говорить об этих "сплетнях", соответствующую предысторию можно найти в этой статье.WHATWG побеждает W3C и получает контроль над HTML и DOM

Условно говоря, языковой уровень определяется спецификацией ECMAScript, которая относительно независима и в последние годы добилась замечательных результатов.


Стандартный встроенный объектный слой в основном содержит эти вещи

  • особая ценность
    • Infinity
    • NaN
    • undefined
    • null
    • globalThis
  • функция
    • eval()
    • uneval()
    • isFinite()
    • isNaN()
    • parseFloat()
    • parseInt()
    • decodeURI()
    • decodeURIComponent()
    • encodeURI()
    • encodeURIComponent()
  • базовый объект
    • Object
    • Function
    • Boolean
    • Symbol
    • Error
    • EvalError
    • InternalError
    • RangeError
    • ReferenceError
    • SyntaxError
    • TypeError
    • URIError
  • ценность и время
    • Number
    • BigInt
    • Math
    • Date
  • обработка текста
    • String
    • RegExp
  • индексный контейнер
    • Array
    • 'TypedArray'
  • контейнер "ключ-значение"
    • Map
    • Set
    • WeakMap
    • WeakSet
  • структурированные данные
    • ArrayBuffer
    • SharedArrayBuffer
    • Atomics
    • DataView
    • JSON
  • Объекты абстракции управления
    • Promise
    • Generator
    • GeneratorFunction
    • AsyncFunction
  • отражение
    • Reflect
    • Proxy
  • глобализация
    • Intl
  • WebAssembly
  • разное
    • arguments

Существует небольшое количество этих глобальных базовых объектов, которыми должен овладеть каждый разработчик JavaScript.

Таймер и консоль, которые мы очень часто используем, здесь больше не указаны.

Эти объекты могут удовлетворить только самые основные потребности разработки и вообще не могут сравниваться со стандартными библиотеками на других языках.Конечно, это также имеет определенную связь с позиционированием языка.



Что такое стандартная библиотека?

Стандартная библиотека не имеет строгого определения.Согласно Wiki, стандартная библиотекаБиблиотеки, предоставляемые языком на примерах в разных реализациях, Например, официальная реализация cRuby в Ruby и JRuby на основе JVM реализуют стандартную библиотеку в соответствии с официальной спецификацией стандартной библиотеки.Как устроена стандартная библиотека и что нужно включить, зависит от философии и позиционирования языка.. Я думаю, что стандартная библиотека должна иметь следующие характеристики:

  • Стандартизированный – существуют спецификации, четко определяющие его содержание и поведение.
  • Контент был тщательно сформирован и отобран, чтобы охватить большинство сценариев использования или соответствовать языковому позиционированию.
  • Необязательный импорт по требованию.Стандартная библиотека не является глобальной и ее необходимо импортировать через модули, а не обязательно

Что касается того, что должна содержать стандартная библиотека, вы можете обратиться к реализации других языков. Например:


Грубо говоря, их стандартные библиотеки обычно имеют следующее содержимое:

  • Сетевой протокол
  • Файловая система
    • Файловая система
    • поток
    • стандартный ввод и вывод
    • бинарная обработка
  • алгоритм
    • криптографический алгоритм
    • кодирование
    • сжимать, архивировать
    • Сортировать
    • математика
    • строка, текст
  • Структуры данных, такие как деревья, кучи, очереди и т. д.
  • Сохранение данных и сериализация, например сериализация JSON, бинарная сериализация, операции с базой данных и т. д.
  • Отладка/помощь
  • модульный тест
  • обработка документов
  • Шаблоны проектирования Стандартная библиотека часто содержит (или помогает в разработке) лучшие практики языка и шаблоны проектирования, такие как context in go, singleton в Ruby.
  • глобализация
  • время, дата
  • операционная система
    • Командная строка
    • переменная среды
    • системный ресурс
  • параллелизм
    • обработать
    • нить
    • сопрограмма
  • Низкоуровневый интерфейс языка или среды выполнения

Ядро большинства языков очень маленькое (кроме C++).Когда мы изучаем язык, большая часть времени уходит на стандартную библиотеку и экологию языка, но вы обнаружите, что эти стандартные библиотеки в целом похожи, вот почему есть опытные разработчики, которые могут быстро освоить язык.

Очевидно, что большинство из вышеперечисленных функций были реализованы в NodeJS.Учитывая широкое использование NodeJS, NodeJS можно считать стандартом де-факто.


Нужна ли нам стандартная библиотека?

Очевидно, что его следует рассматривать диалектически в контексте текущей ситуации.

Каковы преимущества наличия стандартной библиотеки?

  • Стандартная библиотека предоставляет общие, четко определенные, оптимизированные функции и поведение, уменьшая зависимость от сторонних модулей, и сторонним библиотекам сложно обеспечить качество.
  • Избегайте фрагментации сообщества и сглаживайте различия между различными операционными средами.Теперь есть NodeJS, за которым следуют Deno и, возможно, Aeno и Beno.Хотя возможность замены NodeJS очень мала, существует стандартизированная стандартная библиотека, чтобы не изобретать велосипед. будет учить
  • безопасность.Недавний инцидент безопасности NPM часто, отравление, удаление библиотек (события левой панели) и коммерческие операции npm доставили много неприятностей сообществу. Стандартная библиотека встроена в среду выполнения, что позволяет избежать проблем с безопасностью, вызванных обращением к сторонним библиотекам.
  • Современные Javascript-приложения будут иметь много зависимостей (ад node_modules), упакованный объем очень велик, сетевая загрузка и анализ скриптов требуют определенного количества ресурсов, и эти ресурсы не могут кэшироваться между несколькими приложениями.Большая причина в том, что зависимости npm слишком фрагментированы (например, пакеты с несколькими строками кода) и повторяются (зависит от разных версий, мертвый код).Использование стандартной библиотеки может уменьшить эту часть зависимостей
  • Сложность выбора.Если нет стандартной библиотеки, можно выбрать стороннюю библиотеку на npm.Выбор надежной и качественной библиотеки на npm занимает определенное время.Иногда мы просто не утруждаем себя сравнением и выбрать
  • Элегантная стандартная библиотека - это модель для обучения. Многие учебные пособия в Интернете посвящены изучению алгоритма и реализации стандартной библиотеки. Для разработчиков языков стандартная библиотека - это сокровище.
  • стоимость обучения. Разработчики других языков могут начать быстрее

Что может быть не так со стандартной библиотекой?

  • Стандарт может отставать от развития сообщества. Javascript находится в стадии быстрой разработки, и определение многих спецификаций, таких как Promise, async/await, определяется сообществом. сообщество может быть, что никто не использует его
  • Подумайте о текущей ситуации с WebComponent
  • Стандартная библиотека не может быть всем по вкусу

Как спроектировать стандартную библиотеку?Какие препятствия может преодолеть стандартная библиотека?

  • NodeJS уже является стандартом де-факто, как он совместим с существующей экосистемой?

  • Что должна содержать стандартная библиотека и как ее следует синхронизировать с сообществом?

  • Как контролировать масштаб содержимого стандартной библиотеки?

    Минимальную стандартную библиотеку легко поддерживать и обновлять, но она может быть «бесполезной»;

    Расширенная стандартная библиотека, такая как стандартная библиотека Java, содержит почти все, разработчики могут быстро разработать что-то, но через несколько лет многие API устареют, в основном, чтобы поддерживать обратную совместимость, эти API будут застрять там, как шип. Другим очень типичным контрпримером является стандартная библиотека PHP, в которой можно увидеть различные разновидности API.

    Стандартная библиотека выпускается вместе с языком.Если вы используете устаревшие API в своем проекте и хотите обновить языковую версию, вам необходимо провести рефакторинг проекта. Хотя использование сторонней библиотеки может остаться прежним.

  • Основным полем битвы Javascript по-прежнему является браузер, если стандартная библиотека имеет «базовую версию» (для браузеров или какой-либо абстрактной операционной системы) и «конечную версию» (сервер) или предоставляет кросс-стандартную библиотеку только для все платформы?

  • Как бороться с проблемами совместимости, как полифилить старые браузеры?

  • Как отсоединиться от существующих глобальных объектов или пользовательских модулей?


Некоторые недавние попытки

  • proposal-javascript-standard-libraryЭто очень раннее языковое предложение, которое определяет, как ссылаться на стандартную библиотеку (встроенные модули), но не определяет, что такое стандартная библиотека.

  • KV Storage: the Web's First Built-in ModuleЭкспериментальная функция, представленная Chrome в начале года, попытка реализовать предложение Offer-javascript-standard-library. Она ссылается на модуль «стандартной библиотеки» следующим образом:

    import {storage, StorageArea} from 'std:kv-storage'; // std: 前缀,和普通模块区分开来
    

Суммировать

Эта статья начинается с вопроса о SegmentFault, сравнивает другие языки и выявляет дилемму, связанную с тем, что Javascript не имеет стандартной библиотеки, затем вводит существующую структуру Javascript API, представляет, что такое стандартная библиотека, диалектически рассматривает преимущества и недостатки стандартной библиотеке и реализует вышеперечисленное, могут возникнуть препятствия.


расширять