【NPM】モノレポスコープ @xxx をどうするか問題

こんにちは、フリーランスエンジニアの太田雅昭です。

モノレポのスコープ問題

モノレポの場合、パッケージ毎にpackage.jsonを使用します。その際にnameを指定するのですが、下記が理想です。

  • @xxx/yyy のように、スコープを指定したい
  • スコープはNPMに存在しないものを指定したい
  • わざわざ新しくNPMで取得することはしたくない

大規模なプロジェクトならNPM上でスコープを取得してPrivate運営することもあるでしょうが、ほとんどはそこまではいきません。単純に、ローカルで使うだけのためのスコープが欲しいのです。とはいえ、NPMとは被りたくない。

スコープ名の制限

スコープは下記の制限があります。

  • package name length should be greater than zero
  • all the characters in the package name must be lowercase i.e., no uppercase or mixed case names are allowed
  • package name can consist of hyphens
  • package name must not contain any non-url-safe characters (since name ends up being part of a URL)
  • package name should not start with . or _
  • package name should not contain any spaces
  • package name should not contain any of the following characters: ~)('!*
  • package name cannot be the same as a node.js/io.js core module nor a reserved/blacklisted name. For example, the following names are invalid:
    • http
    • stream
    • node_modules
    • favicon.ico
  • package name length cannot exceed 214
https://github.com/npm/validate-npm-package-name#naming-rules

たとえば@abc/abcといった名前は使えますが、NPMとバッティングする可能性があります。かといって、@/などといったスコープは使用できません。

import validate from 'validate-npm-package-name';

console.log(validate('@abc/abc')) // OK
console.log(validate('@/abc')); // ERROR: name can only contain URL-friendly characters
console.log(validate('@_/abc')); // ERROR: name can only contain URL-friendly characters

安全に使えるスコープがある

NPM公式ではありませんが、@localrepo は安全に使えるとされています。

https://www.npmjs.com/package/@localrepo/pledge

これはBenjieさんによって作成されています。Benjieさんはスポンサーページを見ると、2025年6月30日時点で現在:77, 過去:172名がスポンサーとなっています。すごい。Graphql関連のライブラリがFeatureされています。実績があるため、相応の信頼性も担保されているかと思います。

なぜNPMは対応しないのか

モノレポ構成の場合、こうしたローカル限定のスコープの需要があるのは明確かと。にもかかわらずNPMが公式で対応しないのはなぜでしょう。勝手な考えですが、おそらくPrivateの課金アカウントへの誘導の意図があるものと推測できます。そう考えると、致し方ないのかなとは思います。