# 依赖、JSR 与 npm

## 添加依赖

```bash
deno install jsr:@std/assert
deno install npm:express
```

Deno 2.8 起，CLI 中不带前缀的包名默认按 npm 处理，所以 `deno install express` 等价于 `deno install npm:express`；代码里的 import 仍需 `npm:`，除非由 `imports` 或 `package.json` 映射。JSR 包在 CLI 仍写明 `jsr:`。

命令会更新 `deno.json` 的 `imports`，代码可使用映射后的名称：

```ts
import { assertEquals } from "@std/assert";
import express from "express";
import { readFile } from "node:fs/promises";
```

## 项目中的四个状态来源

| 位置 | 职责 |
| --- | --- |
| `deno.json(c)` | 导入映射、tasks、workspace 和工具设置 |
| `package.json` | npm 脚本/依赖与 Node 生态元数据，可与 Deno 共存 |
| `deno.lock` | 锁定解析与完整性，应提交 |
| Deno cache / `node_modules` | 本地物化结果，不作为评审事实源 |

CI 使用项目已提交的锁文件，并让锁文件不一致直接失败。不要通过删除 lockfile 掩盖解析冲突。

```bash
deno ci          # Deno 2.8+：要求 lockfile、清理 node_modules、frozen install
deno ci --prod   # 跳过 package.json devDependencies
```

## 选择来源

- 优先使用项目已有来源与导入约定。
- TypeScript 原生库与标准库通常优先查 JSR。
- 依赖 Node 生态或只有 npm 发布时使用 npm；内置模块写明 `node:`。
- URL 导入适合明确版本的 Web 模块，但团队项目通常用 `imports` 集中管理。
- Deno 2.9 的 `deno list` 查看项目声明依赖；`deno link` / `unlink` 管理本地包链接。

排错时先运行 `deno info` 查看解析图与缓存位置，再检查代理、私有 registry 和证书配置。

官方参考：[Modules and dependencies](https://docs.deno.com/runtime/fundamentals/modules/)、[Packages](https://docs.deno.com/runtime/packages/)。
