# npm、package.json 与 deno.json

Deno 2 可以同时读取 `package.json` 与 `deno.json`。迁移初期不必删掉 Node 配置；先让现有项目在 Deno 下通过安装、检查和测试。

| Node 工作流 | Deno 对应方式 |
| --- | --- |
| `npm install` | `deno install` |
| `npm install lodash` | `deno install lodash` |
| `npm run dev` | `deno task dev`（也能执行 package scripts） |
| `package-lock.json` | `deno.lock`；迁移期可并存 |
| 裸导入 `lodash` | package.json 项目可解析；Deno-first 也可用 `npm:lodash` |

## node_modules 三种模式

| 模式 | 适用场景 |
| --- | --- |
| `none` | 新 Deno 项目，默认使用全局缓存 |
| `auto` | bundler、Node-API 或工具要求本地目录 |
| `manual` | 既有 `package.json` 工作流，显式执行安装 |

```json
{
  "nodeModulesDir": "auto",
  "tasks": {
    "dev": "deno run --watch -N -E src/main.ts",
    "verify": "deno fmt --check && deno lint && deno check src/main.ts && deno test"
  }
}
```

生命周期脚本默认不会无条件执行。依赖确实需要 install script 时，运行 `deno approve-scripts` 交互式审查并批准（批准项持久化到 deno.json 的 `allowScripts`，Deno 2.6+ 首推）；也可以用 `deno install --allow-scripts=<package>` 一次性精确批准。无论哪种方式，lockfile 变化后都要重新审计。

<Callout type="warn" title="不要先删 lockfile">
删除 npm lockfile 和 node_modules 是迁移的收尾动作，不是第一步。先保留可工作的回滚路径，再决定是否转为 Deno-first 依赖布局。
</Callout>

官方参考：[Dependency management](https://docs.deno.com/runtime/packages/)、[Node and npm compatibility](https://docs.deno.com/runtime/fundamentals/node/)。
