Правильное структурирование библиотеки TypeScript

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

Контекст

В настоящее время я работаю над довольно большой веб-библиотекой, которую я пишу с использованием 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 библиотеки, более удобный для использования?
  • Имеет ли смысл разделять определения типов (не classes цель interfaceпесок types) в свой каталог без вложенности?

Я, наверное, слишком много думаю об этом, но я еще не нашел хорошего руководства по разработке библиотеки TypeScript для Интернета и хотел бы все правильно организовать. Я благодарен за любой вклад!

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *