エラーが発生する理由
npm startを実行してコードを書き始めようとした際、ターミナルにEPERM: operation not permitted, watchという赤いエラーメッセージが表示されることがあります。これは通常、macOSのセキュリティレイヤーがNode.jsによるプロジェクトファイルの監視をブロックしているために発生します。特に、ファイルの変更を追跡するためにfseventsを使用するReact、Vue、Angularのプロジェクトでよく見られます。
新しいM3 Macに移行したばかりでも、macOS Sonomaにアップデートした後でも、根本的な原因は通常、権限のボトルネックかバイナリリンクの破損です。このハードルを乗り越えてコーディングに戻るための方法を以下に示します。
ステップ1:フルディスクアクセスを許可する
Appleのプライバシー設定は年々厳しくなっています。ターミナルやVS Codeがフォルダ内のファイルを監視することを明示的に許可されていない場合、システムはデータを保護するためにプロセスを強制終了します。
- システム設定を開きます。
- プライバシーとセキュリティ > フルディスクアクセスに移動します。
- + アイコンをクリックします。
- ターミナル(Terminal、iTerm2、Warpなど)とエディタ(VS Code)を追加します。
- それぞれのスイッチをオンにします。
- 重要: 設定を反映させるために、ターミナルを完全に終了(Cmd+Q)してから再起動してください。
ステップ2:Watchmanをインストールする
Node.jsのデフォルトのファイルウォッチャーは、macOS上では不安定になることがあります。Metaは、大規模なファイルツリーをより効率的に処理するためにwatchmanというツールを開発しました。これは、ファイルシステムイベントに対してより堅牢なインターフェースを提供することで、EPERMエラーを解決することがよくあります。
Homebrewを使用している場合は、次のコマンド1つでインストールできます。
brew install watchman
React Nativeを含む多くのフレームワークでは、現在、WatchmanがmacOS開発における標準的な要件と見なされています。
ステップ3:アーキテクチャに合わせてfseventsを再ビルドする
Intel MacからApple Silicon(M1/M2/M3)に移行しましたか?その場合、node_modulesに新しいチップでは正しく動作しないIntelベースのバイナリが含まれている可能性があります。この不一致がfseventsの失敗を頻繁に引き起こします。
以下のコマンドで一旦すべてをリセットしましょう。
# 不要なファイルを削除
rm -rf node_modules package-lock.json yarn.lock
# 古いバイナリを避けるためにnpmキャッシュをクリア
npm cache clean --force
# 最初から再インストール
npm install
これにより、npmは現在のハードウェアに適合するバージョンのfseventsを強制的にダウンロードしてコンパイルします。
ステップ4:フォルダの所有権を修正する
誤ってsudo npm installを実行してしまった場合、プロジェクト内の一部のファイルが「root」ユーザーの所有になってしまいます。標準アカウントにはそれらのファイルを「監視(watch)」する権限がないため、即座にEPERMクラッシュが発生します。
プロジェクトの所有権を取り戻すために、次のコマンドを実行してください。
sudo chown -R $(whoami) .
これにより、現在のディレクトリ内のすべてのファイルがあなた自身の所有に変更されます。これで権限の競合は解消されます。
検証:修正のテスト
npm startを実行して開発サーバーを再起動します。起動したら、適当なコンポーネントを開いて簡単なconsole.log('test')を追加してみてください。ターミナルにクラッシュすることなくCompiling...やReloading...と表示されれば、問題は無事に解決しています。
スムーズなワークフローのためのプロのヒント
- sudoの使用をやめる: npmで
sudoを使用する必要があるケースはほとんどありません。もし必要だと感じる場合は、Node.jsのインストール設定が間違っている可能性があります。 - NVMに切り替える: Node Version Manager(NVM)を使用してNode.jsをインストールしてください。これにより、システム保護されたディレクトリではなく、ユーザーフォルダ(
/Users/name/.nvm)内にすべてが保持されます。 - ファイル制限を管理する: プロジェクトに10,000以上のファイルがある場合、OSの「同時オープンファイル数」の制限に達する可能性があります。
.gitignoreにdistやbuildなどの重いフォルダが含まれていることを確認し、ウォッチャーの負荷を軽く保ちましょう。

