В Civil прозрачность так же важна для разработчиков, которые заинтересованы в нашем коде, как и для журналистов, которые публикуются на нашей платформе. Когда мы начали работать со стеком Ethereum DApps, мы решили реализовать монорепозиторий для независимого развертывания частей нашей кодовой базы, стандартизируя линтинг, тесты и покрытие. Это повысило производительность всей команды разработчиков Civil.

Это привело к тому, что команда разработчиков Civil смогла повторно использовать шаблоны кода, такие как внутренние пакеты и общедоступные пакеты NPM, которые используются во многих других проектах. Однако мы поняли, что даже при структуре монорепозитория типизация TypeScript чрезвычайно громоздка, потому что каждый пакет требует ручного редактирования каждого файла tsconfig.json.

Многие пакеты в экосистеме Ethereum написаны на чистом JavaScript и вообще не имеют типизации, а некоторые из этих пакетов, такие как web3, имеют неверную типизацию. Для нас это означало, что нам пришлось создавать собственные типизации для нескольких внешних зависимостей, таких как web3, ethereumjs-abi и ethereumjs-util. Это было особенно проблематично, потому что мы находились на этапе, когда скорость и итерация имели первостепенное значение. DefinitelyTyped и работа напрямую с проектами с открытым исходным кодом для получения запросов на включение были бы отличными долгосрочными решениями, но они были слишком медленными, и мы не учитывали тех разработчиков, которые не были заинтересованы в поддержке TypeScript.

Наше первое решение состояло в том, чтобы иметь файл .d.ts с общими определениями, которые копировались в пакеты или загружались вручную в каждый файл tsconfig.json. Однако это означало, что мы получили много дублирующихся и сложных в обслуживании файлов конфигурации. После более чем 3 пакетов в нашем монорепозитории это решение также перестало быть жизнеспособным.

К счастью, у TypeScript есть возможность переопределить папку @types в своей конфигурации, что отлично работает с шаблоном монорепозитория.

У каждого из наших пакетов есть собственный tsconfig.json, который расширяет корневой каталог репозитория tsconfig.json. Самый верхний содержит все основные элементы, а также переопределенное расположение typesRoots. typeRoots берет массив папок и ищет в них имена пакетов в порядке очереди. Установив сначала наши собственные типизации, мы могли обрабатывать сломанные пакеты с устаревшими или незавершенными типизациями.

Пример структуры проекта:

.
├ tsconfig.json
│ (“typeRoots”: [“packages/typescript-typings/types”, “node_modules/@types”])
└ packages
  ├ typescript-typings
  │ └ types
  ├ web3
  │ ├ ethjs-util
  │ └ …
  ├ package_1
  │ └ tsconfig.json
  │   (“extends”: “../../tsconfig”)
  ├ package_2
  │ └ tsconfig.json
  │   (“extends”: “../../tsconfig”)
  └ …

Civil создает проект с открытым исходным кодом для поддержки устойчивой журналистики. Мы работаем над тем, чтобы сделать площадку лучше для разработчиков, которые хотят начать строить инфраструктуру Web3. Посетите Civil’s GitHub, чтобы узнать больше, и ознакомьтесь с открытыми проблемами, если вы хотите внести свой вклад.

Или, если вы хотите связаться со мной с дополнительной обратной связью, напишите мне здесь.