Global
Global — особый опциональный уровень для описания сущностей, которые будут доступны глобально на всём проекте, но без необходимости импорта.
Важность уровня
Данный уровень является утилитарным вспомогательным уровнем, который помогает расширить возможности фреймворка и библиотек. У него стоит уникальная задача — ответить на вопрос: «откуда это взялось?». Так как тут размещается то, что вы никак не импортируете в другом месте, но оно всё равно доступно в коде.
Вы хотите добавить глобальную переменную? Или расширить типы библиотеки? Или добавить полифилл для старых браузеров? Тогда этот уровень для вас.
Что может быть в Global?
Это могут быть:
- Shim-ы для библиотек — расширения типов и функциональности сторонних библиотек
- Глобальные типы — типы, доступные без импорта во всём проекте
- Полифиллы — дополнения для поддержки старых браузеров
- Манки-патчи — хаки в работе библиотеки или фреймворка
- Глобальные расширения — расширения встроенных типов (например, расширение Window или Array)
Важно
Данный уровень не предназначен для реализации глобальных сущностей, которые будут использоваться на всём проекте. Для этого нужно использовать Common.
Это не место для UI-библиотеки или чего-то подобного!
Пример использования
Единый пример показывает все ключевые глобальные сущности в одном дереве.
Выберите файл в дереве слева
Разница между Global и Common
Global
- Сущности доступны без импорта
- Используется для типов, полифиллов и расширений
- Файлы выполняются при загрузке приложения
- Не предназначен для переиспользуемой логики
Common
- Сущности требуют явного импорта
- Используется для компонентов, утилит и композаблов
- Файлы загружаются по требованию
- Предназначен для переиспользуемой логики
Когда использовать Global?
Используйте Global, когда:
- Нужно расширить типы сторонних библиотек
- Требуется добавить полифиллы для старых браузеров
- Необходимо расширить встроенные типы (Window, Array, и т. д.)
- Нужны глобальные типы, доступные без импорта
Не используйте Global для:
- Компонентов (используйте Common)
- Утилит (используйте Common)
- Композаблов (используйте Common)
- Бизнес-логики (используйте Modules)
Что если мне всё-таки нужно импортировать из Global?
Спорный пункт
Решение на данный вопрос на данный момент не является однозначным и требует обсуждения с сообществом.
Мы сейчас говорим о действительно исключительных случаях. Например, если вы должны вызвать манки-патчинг в особое время или вам нужно вызвать полифилл.
Для начала рассмотрите вариант выноса этого импорта за пределы проекта (например, в конфиг сборщика или index.html). Указание этого уровня допустимо в конфигах, как, например, TypeScript, но не допустимо в коде.
Импорт из изоляции. Если вам никак не избежать импорта, то можно определить alias, ведущий конкретно к данному импорту, и импортировать уже из него. Данное количество манипуляций выглядит избыточным и сложным, но оно подчёркивает, насколько это редкий случай. Если вам лень проворачивать это действие, то это уже хорошо, так как вам будет сложнее им злоупотреблять.
Лучшие практики
1. Минимизируйте использование Global
Global должен использоваться только для действительно необходимых случаев. Большинство сущностей должны быть в Common или Modules. Если вы решили использовать Global, то старайтесь минимизировать количество файлов в нём и максимально изолировать логику.
2. Документируйте расширения
Если вы расширяете типы библиотек, документируйте, почему это необходимо и какие поля добавлены. Если вы что-то патчите, то указывайте, зачем и почему вы это делаете. Это не всегда может быть очевидно спустя некоторое время, однако это поможет вам и другим разработчикам в будущем.
3. Расширение функционала сторонних библиотек должно быть обоснованным
Старайтесь переопределять только те типы, что изначально предложены в библиотеке. Не стоит расширять типы, хакать или манки-патчить всё подряд.
4. Избегайте глобальных переменных
Старайтесь не использовать глобальные переменные, если этого можно избежать. Используйте Common для переиспользуемых значений.