← ./articles-ja

OneDrive上のNode.js開発はnode_modulesをjunctionで外へ逃がす

WindowsでDesktopやDocumentsをOneDrive同期していると、Node.jsプロジェクトが不安定になることがあります。

よくある助言は「OneDrive配下に node_modules を置かない」です。正しいのですが、プロジェクト全体を移動できないこともあります。その場合は、プロジェクトはそのままにして、node_modules だけをOneDrive外へ逃がすのが現実的です。

使うのはWindowsのdirectory junctionです。

症状

OneDriveが原因でも、エラー文にOneDriveとは出ません。よくある見え方は次の通りです。

  • npm install は成功したように見えるが、パッケージが足りない
  • next devvite dev が module not found で落ちる
  • esbuildやViteがinstall/build中に落ちる
  • build成果物が古い、欠ける、消える
  • 入れ直すと一度直るが、また壊れる

node_modules は小さいファイルが大量にあります。npmやbundlerが高頻度で読み書きする横でOneDriveが同期すると、依存関係やbuild成果物が壊れやすくなります。

junctionで逃がす構成

外部ストアをOneDrive外に作ります。

<external-store>\my-project\node_modules

プロジェクト側にはjunctionを置きます。

<project>\node_modules -> <external-store>\my-project\node_modules

Node.jsからは普通の node_modules に見えます。一方で、実体はOneDrive外にあるため、同期の影響を受けにくくなります。

PowerShellで作る

PowerShellの New-Item -ItemType Junction を使います。日本語パスを含む環境では、cmd.exemklink よりこちらのほうが扱いやすいです。

$ProjectRoot = "<project-root>"
$Store = "<external-store>\my-project\node_modules"
$Junction = Join-Path $ProjectRoot "node_modules"

New-Item -ItemType Directory -Path $Store -Force | Out-Null

if (Test-Path $Junction) {
  Remove-Item $Junction -Recurse -Force
}

New-Item -ItemType Junction -Path $Junction -Target $Store | Out-Null

これでプロジェクト直下に node_modules があるように見えます。

npm installでjunctionが壊れることがある

注意点があります。npmはinstall中に node_modules を削除して作り直すことがあります。その結果、junctionが普通の実フォルダに置き換わることがあります。

そのため、junction作成は一度きりではなく、devbuild の前に毎回確認するのが安全です。

{
  "scripts": {
    "predev": "powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts\\ensure-node-modules.ps1",
    "prebuild": "powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts\\ensure-node-modules.ps1",
    "dev": "next dev",
    "build": "next build"
  }
}

ensure-node-modules.ps1 では、次を確認します。

  • node_modules が存在する
  • junctionである
  • 期待した外部ストアを指している
  • 違っていれば作り直す

これだけで全ては解決しない

node_modules を逃がすと依存関係の壊れ方はかなり減ります。ただし、build成果物もOneDriveと相性が悪いことがあります。

  • Next.js: .next/
  • Vite: dist/
  • Rust/Cargo: target/

これらが壊れる場合は、別途clean buildや出力先の整理が必要です。特に複数の next build を同時に走らせると、OneDriveとは関係なく .next/ が壊れます。

まとめ

OneDrive配下でNode.js開発が不安定なら、まず node_modules を疑ってください。

プロジェクト全体を移動できない場合でも、node_modules の実体だけをOneDrive外へ置き、junctionで戻すことで、依存関係の同期トラブルを減らせます。

ポイントは、junctionを作るだけでなく、npmに壊されても復旧できるよう predev / prebuild で再確認することです。

参考