ふと「最寄り」のように「最」と書いて「も」と読ませる語に異常性を感じたので, すべての「最」を集めたくなりました. 昨日のことです.

集めるとはいっても, 脳内を検索しているだけでは,

  • 最上 (もがみ)
  • 最中 (もなか)
  • 最早 (もはや)
  • 最寄り (もより)

くらいしか思い当たりません. 直感的に異常性を感じるくらいには珍しいので当然です.

ということで衝動買いした広辞苑がこちら. 一般的な語を探すのであればひとまずこれで十分でしょう.

新村出編『広辞苑』第七版
このためだけに購入

あとなぜかこれが二つついてきたので, 欲しい方がいたら片方差し上げます.

新村出編『広辞苑』第七版の帯「合計 1,200 万部の実績」
合計 2,400 万部の実績

そんな広辞苑によれば, 「最」とは次のような接頭語とのこと.

も【最】〔接頭〕「まこと」「正しい」「もっとも」の意を表す

「最」に対する理解が深まったところで, 早速この接頭辞が使われる, 我々のまだ見ぬ語を求めて広辞苑を引いてみましょう.

ということで出てきたのがこちらです.









もひめ【最姫】大嘗祭だいじょうさいの神事に奉仕する采女うねめの最上位。主に御親供ごしんく介錯かいしゃくにあたる。陪膳。









以上.

余った広辞苑の使い方募集してます.

ビルド用の tsconfig を用意するよりもバンドラに任せた方が楽かもしれない

TypeScript でライブラリ (npm パッケージ) を作るときに, ビルド用の tsconfig を用意することがあります.

例えば以下のような tsconfig.json を作成したとしましょう.

{
  "compilerOptions": {
    "rootDir": "src",
    "outDir": "lib",
    "target": "esnext",
    "module": "esnext",
    "moduleResolution": "bundler",
    "esModuleInterop": true,
    "strict": true,
    "sourceMap": true,
    "declaration": true
  },
  "include": [
    "src/**/*"
  ]
}

これを使って素朴に tsc -p tsconfig.json のようにビルドすると, src/index.ts のようなライブラリ本体のコードだけではなく, src/index.test.ts といったテストコードなどもコンパイルされ, 出力に含まれてしまいます. ライブラリのユーザーにとってはテストコードは普通は全く役に立たないので, 不要なファイルが含まれてしまっている状態です.

かといって以下のように tsconfig.jsonexclude を追加してテストコードを除いてしまうと, 今度は ESLint や IDE など他の tsconfig.json を参照する開発ツールがテストコードをうまく扱えなくなってしまいます.

{
  "compilerOptions": {
    // (省略)
  },
  "include": [
    "src/**/*"
  ],
  "exclude": [
    "src/**/*.test.*"
  ]
}

これらを両立させるためには, 以下のようなビルド用の tsconfig (tsconfig.build.json のような名前にすることが多そう) を用意します. これを使って tsc -p tsconfig.build.json のようにビルドすると, テストコードは出力に含まれませんし, 開発ツールは tsconfig.json を参照することでテストコードもうまく扱うことができます.

{
  "extends": "./tsconfig.json",
  "exclude": [
    "src/**/*.test.*"
  ]
}

ここまでが前提の話.

上記のようなビルドと開発ツールを両立させる方法にはもう一つ選択肢があって, それはバンドラを使うことです. エントリポイントから参照されないテストコードなどはバンドラが勝手に除外してくれるはずなので, ビルド用の tsconfig みたいなものを用意する必要がなくなります1.

一昔前はバンドラを使うとなると Webpack や Rollup を直接使って, デフォルトでは TypeScript に対応していないのでプラグインを入れて, それでもなぜかうまく動かなかったり, プラグインが複数あってどれを使えば良いのか悩んだり... といった感じだったかと思いますが, 近年では tsup のような TypeScript でのライブラリ作成というユースケースに特化したバンドラが登場しているので, これらに任せておけば悪いようにはならないでしょう.

tsup.egoist.dev

tsup の使い方は簡単で, 先ほどと同等の出力を得るのに必要なのは tsup のインストールと, せいぜい以下のような tsup.config.js を置くくらいでしょう.

import { defineConfig } from "tsup";

export default defineConfig({
  entry: ["src/index.ts"],
  outDir: "./lib",
  format: ["esm"],
  splitting: false,
  sourcemap: true,
  dts: true,
  clean: true,
});

他にもバンドラを使うと ESM と CommonJS の両方に比較的簡単に対応させられたり, コンパイル時定数を使ってデバッグ用のコードを除去できたりといった利点もあります. 見ての通りバンドラを設定するのとビルド用の tsconfig を用意するのとでは大して手間は変わらないので, 設定の複雑さを嫌ってビルドには tsc のみを使っていたといったケースでも, バンドラの導入は十分に選択肢に入ってくるかなと思います.


  1. エントリポイントから間違ってテストコードなどを参照してしまうと出力に含まれてしまうのでは? と思われたかもしれません. 安心してください. ビルド用の tsconfig で除外していた場合でも含まれてしまいます.