Этот вопрос больше связан с архитектурой, чем с кодом.
Контекст
В настоящее время я работаю над довольно большой веб-библиотекой, которую я пишу с использованием TypeScript для моего удобства во время разработки. Теперь, когда я близок к завершению релиза, мне интересно, каков идеальный способ структурировать библиотеку, чтобы она лучше всего позволяла потребителю. Я начну с текущей структуры, а позже рассмотрю текущую методологию.
Библиотека разделена на составные части, системы, коммунальные услуги а также контейнеры.
- Компоненты — это пользовательские типы, такие как векторы, фигуры и т. Д.
- Системы — это экспортируемые функции, которые в основном работают с ранее упомянутыми компонентами.
- Утилиты — это различные функции, обычно используемые в библиотеке.
- Поведение — это специфичные для библиотеки типы поведения, используемые для внутренних функций.
Цель состоит в том, чтобы выполнить большую часть внутренней обработки, но предоставить пользователю все типы и утилиты, чтобы обеспечить максимальную настраиваемость.
Текущий метод
В настоящее время я использую шаблон, похожий на индекс (если он вообще так называется?). Это означает, что для большинства папок я использую экспорт с подстановочными знаками всех других файлов в index.ts
файл, например components/index.ts
:
export * from "./componentA";
export * from "./componentB";
// ...
Затем внутри верхнего уровня index.ts
Я импортирую все части библиотеки и создаю один большой объект для экспорта.
import * as components from "./components/";
import * as math from "./systems/math";
export default {
...components,
math,
// others to follow
}
Это сделано для того, чтобы пользователи могли импортировать библиотеку в средах, подобных узлам, с …
import library from "the-library";
// use methods
new library.ComponentA();
library.math.myMathMethod();
… но также экспортировать их в глобальную среду с помощью UMD …
// "library" is global
new library.ComponentA();
library.math.myMathMethod();
Стратегия выпуска
Библиотеку можно использовать во всех браузерных средах, поэтому я использую tsc
экспортировать для Node.js и webpack
чтобы связать его как UMD.
Вопросов
Мне любопытны следующие моменты:
- Логично ли разделение библиотеки, упомянутое в начале?
- Здесь хорош «индекс-шаблон»? Было бы пространства имен будь лучше?
- Есть ли лучший способ экспортировать API библиотеки, более удобный для использования?
- Имеет ли смысл разделять определения типов (не
class
es цельinterface
песокtype
s) в свой каталог без вложенности?
Я, наверное, слишком много думаю об этом, но я еще не нашел хорошего руководства по разработке библиотеки TypeScript для Интернета и хотел бы все правильно организовать. Я благодарен за любой вклад!