動かざることバグの如し

近づきたいよ 君の理想に

TypeScriptなライブラリをnpm公開する方法

環境

  • Nodejs v24
  • TypeScript v5

TypeScriptで書いたライブラリをnpmに公開する手順をまとめる。

自作のライブラリをnpmで公開したい場合、TypeScriptをそのまま公開することはできない。Node.jsはネイティブでTypeScriptに対応していないからだ。そのためJavaScriptに変換してから公開する必要がある。ここではtsupを使ったビルドからnpmへの公開までの一連の手順を説明する。

初期設定

まずはnpmプロジェクトを初期化する。

npm init -y

package.jsonが生成されるので、名前や説明などを適当に編集しておく。

次にTypeScriptと型定義、ビルドツールのtsupを入れる。

npm install -D typescript @types/node tsup

最後にtsconfig.jsonを生成。

npx tsc --init

tsconfig.jsonは後で必要に応じていじる。まずはデフォルトでいい。

ビルド

tsupを使ってビルドする。tsupはTypeScriptをJavaScriptに変換し、CommonJSとESMの両方の形式で出力してくれる。esbuildベースなので速い。

package.jsonにビルドスクリプトを追加する。

"scripts": {
  "build": "npx tsup ./src"
},

./srcはソースコードの場所。エントリポイントがsrc/index.tsならこれでOK。

ビルド実行。

npm run build

distフォルダが生成される。中身はJavaScriptと型定義ファイル。

公開

package.jsonに公開用の設定を追記する。

  "files": [
    "dist",
    "package.json"
  ],
  "exports": {
    ".": {
      "require": "./dist/index.js",
      "import": "./dist/index.mjs",
      "types": "./dist/index.d.ts"
    }
  },
  "types": "./dist/index.d.ts",

各フィールドの意味は以下の通り。

  • files - npmに含めるファイル。distとpackage.jsonだけ公開する。ソースコードは含めない
  • exports - エントリポイント。CommonJSなら.js、ESMなら.mjsを返す。型定義は.d.ts
  • types - 型定義ファイルの場所

mainフィールドも設定しておいた方がいい場合がある。古いNode.jsやツールとの互換性のためだ。

"main": "./dist/index.js",

npmにログインする。

npm login

ユーザー名、パスワード、メールアドレスを入力する。OTPを設定しているならコードも入力。

いざ公開

npm publish

これでnpmに公開される。npm view <パッケージ名>で確認できる。

scoped packageの場合

@username/package-nameのようなscoped packageを公開する場合、デフォルトではprivate扱いになる。公開するなら--access publicが必要。

npm publish --access public

初回だけ必要で、2回目以降は省略できる。ただしpackage.jsonに"private": falseを書いておけば毎回指定しなくて済む。

バージョンアップの方法

ライブラリを更新したらバージョン番号を上げて再公開する。

npm version patch # v1.0.0 → v1.0.1
npm version minor # v1.0.1 → v1.1.0
npm version major # v1.1.0 → v2.0.0

これでpackage.jsonのversionが更新され、gitタグも作成される。その後公開。

npm publish

バージョンアップのたびにgit tagをpushするのを忘れないように。

git push --tags

prepublishOnlyフック

ビルド忘れを防ぐために、prepublishOnlyスクリプトを設定しておくと安心だ。

"scripts": {
  "build": "npx tsup ./src",
  "prepublishOnly": "npm run build"
}

こうしておくと、npm publishする前に自動でビルドが走る。

参考リンク