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 devやvite 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.exe の mklink よりこちらのほうが扱いやすいです。
$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作成は一度きりではなく、dev や build の前に毎回確認するのが安全です。
{
"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 で再確認することです。