d.ts ファイルを単一ファイルにするモチベーション
TypeScript の issue には、d.ts ファイルを single にする propsal が上がっているが、5 年たった今でも機能実現に至っておらず、これを実現しようとするツールが独自に発展している。
- rollup-plugin-dts
- api-extractorの*.d.ts rollup 機能
なんで単一ファイルにまとめたいんだっけ?ってなったので、メモとして残しておく。
検証 repo はこちら
tyankatsu0105/sandbox-rollup-dts
メリット
ts ファイルのフラットな形に倣うことができる
ts ファイルを単一のファイルに変換するツールに倣って、d.ts ファイルも単一にして、統一性をもたらすことができる。
例えばこう。
.
└── dist
├── index.d.ts
├── index.es.js #ejs
└── index.js # commonjs
ファイルサイズの削減
d.ts ファイルを一つにまとめるのと、ディレクトリ構造を保ったまま出力するのとではファイルサイズが変わってくるので、配信する際のスピード向上につながる。
.
├── api-extractor
│ └── dist
│ ├── api-extractor.d.ts # 5,667 バイト
│ ├── index.es.js
│ ├── index.js
│ └── tsdoc-metadata.json
├── rollup
│ └── dist
│ ├── index.es.js
│ ├── index.js
│ └── src # 7,882 バイト
│ ├── index.d.ts
│ ├── libs
│ │ ├── fn1.d.ts
│ │ ├── fn10.d.ts
│ │ ├── fn100.d.ts
│ │ ├── fn11.d.ts
│ │ ├── fn12.d.ts
│ │ ├── fn13.d.ts
│ │ ├── fn14.d.ts
│ │ ├── fn15.d.ts
│ │ ├── fn16.d.ts
│ │ ├── fn17.d.ts
│ │ ├── fn18.d.ts
│ │ ├── fn19.d.ts
│ │ ├── fn2.d.ts
│ │ ├── fn20.d.ts
│ │ ├── fn21.d.ts
│ │ ├── fn22.d.ts
│ │ ├── fn23.d.ts
│ │ ├── fn24.d.ts
│ │ ├── fn25.d.ts
│ │ ├── fn26.d.ts
│ │ ├── fn27.d.ts
│ │ ├── fn28.d.ts
│ │ ├── fn29.d.ts
│ │ ├── fn3.d.ts
│ │ ├── fn30.d.ts
│ │ ├── fn31.d.ts
│ │ ├── fn32.d.ts
│ │ ├── fn33.d.ts
│ │ ├── fn34.d.ts
│ │ ├── fn35.d.ts
│ │ ├── fn36.d.ts
│ │ ├── fn37.d.ts
│ │ ├── fn38.d.ts
│ │ ├── fn39.d.ts
│ │ ├── fn4.d.ts
│ │ ├── fn40.d.ts
│ │ ├── fn41.d.ts
│ │ ├── fn42.d.ts
│ │ ├── fn43.d.ts
│ │ ├── fn44.d.ts
│ │ ├── fn45.d.ts
│ │ ├── fn46.d.ts
│ │ ├── fn47.d.ts
│ │ ├── fn48.d.ts
│ │ ├── fn49.d.ts
│ │ ├── fn5.d.ts
│ │ ├── fn50.d.ts
│ │ ├── fn51.d.ts
│ │ ├── fn52.d.ts
│ │ ├── fn53.d.ts
│ │ ├── fn54.d.ts
│ │ ├── fn55.d.ts
│ │ ├── fn56.d.ts
│ │ ├── fn57.d.ts
│ │ ├── fn58.d.ts
│ │ ├── fn59.d.ts
│ │ ├── fn6.d.ts
│ │ ├── fn60.d.ts
│ │ ├── fn61.d.ts
│ │ ├── fn62.d.ts
│ │ ├── fn63.d.ts
│ │ ├── fn64.d.ts
│ │ ├── fn65.d.ts
│ │ ├── fn66.d.ts
│ │ ├── fn67.d.ts
│ │ ├── fn68.d.ts
│ │ ├── fn69.d.ts
│ │ ├── fn7.d.ts
│ │ ├── fn70.d.ts
│ │ ├── fn71.d.ts
│ │ ├── fn72.d.ts
│ │ ├── fn73.d.ts
│ │ ├── fn74.d.ts
│ │ ├── fn75.d.ts
│ │ ├── fn76.d.ts
│ │ ├── fn77.d.ts
│ │ ├── fn78.d.ts
│ │ ├── fn79.d.ts
│ │ ├── fn8.d.ts
│ │ ├── fn80.d.ts
│ │ ├── fn81.d.ts
│ │ ├── fn82.d.ts
│ │ ├── fn83.d.ts
│ │ ├── fn84.d.ts
│ │ ├── fn85.d.ts
│ │ ├── fn86.d.ts
│ │ ├── fn87.d.ts
│ │ ├── fn88.d.ts
│ │ ├── fn89.d.ts
│ │ ├── fn9.d.ts
│ │ ├── fn90.d.ts
│ │ ├── fn91.d.ts
│ │ ├── fn92.d.ts
│ │ ├── fn93.d.ts
│ │ ├── fn94.d.ts
│ │ ├── fn95.d.ts
│ │ ├── fn96.d.ts
│ │ ├── fn97.d.ts
│ │ ├── fn98.d.ts
│ │ ├── fn99.d.ts
│ │ ├── index.d.ts
│ │ └── user.d.ts
│ └── shared
│ ├── const.d.ts
│ ├── helpers
│ │ ├── const.d.ts
│ │ └── index.d.ts
│ └── index.d.ts
└── rollup-plugin-dts
└── dist
├── index.d.ts # 5,326 バイト
├── index.es.js
└── index.js
デメリット
元ファイルのディレクトリ構造が不明になる
実装ファイルが圧縮されていたり、トランスパイルされたあとで元の実装の確認が困難な場合、型定義ファイルのディレクトリを参考にしながら、GitHub の repo などを確認することが困難になる。
型定義ファイルを読み物とする場合、単一ファイルにすることはそぐわない。
一つのファイルサイズが膨れる
すべての型定義をひとつにまとめるので、一つのファイルサイズが膨れる。そうすると型定義ファイルのプレビューに時間がかかる。
結論
ライブラリ配信者としてはファイルサイズ削減するのはいいことだし、コンパイル後はすべてのファイルがフラットになることできれいな dist 構造を保つことができる。
しかし一つのファイルにすることは型定義を読みづらくするとは思う。
ただ、これは慣れの問題かなと思うので、api-extractor まずは入れるでもいいかもしれない。