Deno
> Deno — 一个更现代、更安全的 JavaScript/TypeScript 运行时,用 Rust 重写并解决 Node 的历史包袱。
兄弟们,今天不聊框架,不聊 CSS,咱们来聊聊一个让我从“Node 真香”变成“Node 真香,但 Deno 更香”的工具——**Deno**。
如果你是个前端或者后端工程师,你大概率听过 Node.js。它统治了 JavaScript 服务端十几年,但它的“原罪”也伴随了十几年:回调地狱(现在有 Promise 了,但历史模块还是乱)、npm 依赖地狱、权限控制全靠自觉(一个 `npm install` 就能让你的服务器裸奔)、以及 TypeScript 支持得扭扭捏捏。这些痛点,Deno 全都想干掉。
**Deno 是干什么的?**
一句话:它是 Node.js 的“精神继承者”,但由 Rust 编写,底层用 V8 引擎(就是 Chrome 那个),内置 TypeScript 支持,默认安全(没有网络、文件访问权限,你得显式授权),并且把模块化从 `node_modules` 的“黑洞”变成了 URL 直接引用。它解决的核心问题就是:**让 JavaScript 服务端开发更安全、更简洁、更现代化,同时摆脱 npm 的臃肿和 Node 的历史包袱。**
**下载方式**
别去 npm 装(虽然也能装,但没必要),直接去官网下二进制文件,或者用包管理器。
[官网下载地址](https://deno.com/)
[GitHub Releases](https://github.com/denoland/deno/releases)
**安装方法**
我推荐两种最爽的方式:
**macOS / Linux(用 Homebrew)**
```bash
brew install deno
```
**Windows(用 winget 或者 choco)**
```bash
winget install DenoLand.Deno
# 或者
choco install deno
```
装完验证一下:
```bash
deno --version
```
看到版本号就 OK 了。
---
**基础使用教程(5分钟上手)**
**1. 直接跑一个 TS 文件**
Deno 原生支持 TypeScript,不需要 `tsc` 编译,不需要 `ts-node`。写个 `hello.ts`:
```typescript
// hello.ts
const greeting: string = "Hello, Deno!";
console.log(greeting);
```
然后运行:
```bash
deno run hello.ts
```
就是这么简单。没有 `package.json`,没有 `node_modules`。
**2. 权限控制(这是灵魂)**
Deno 默认是“沙箱”模式。如果你代码里要访问网络,直接 `run` 会报错。比如:
```typescript
// fetch.ts
const res = await fetch("https://api.github.com");
console.log(res.status);
```
运行 `deno run fetch.ts` 会提示你缺少网络权限。你需要显式授权:
```bash
deno run --allow-net fetch.ts
```
常用权限:
- `--allow-net`:网络访问
- `--allow-read`:读文件
- `--allow-write`:写文件
- `--allow-env`:环境变量
- `--allow-all`:全开(不推荐,除非你信任脚本)
这个设计太香了,你跑第三方脚本的时候再也不用担心它偷偷删你磁盘了。
**3. 引入模块(用 URL 而不是 npm)**
Deno 里没有 `require`,没有 `import from 'lodash'`。你直接写:
```typescript
import { serve } from "https://deno.land/std@0.224.0/http/server.ts";
serve((_req) => new Response("Hello, Deno!"));
```
运行:
```bash
deno run --allow-net server.ts
```
看到没?依赖是直接写 URL 的,第一次运行会下载并缓存到本地(默认缓存到 `~/.cache/deno`),之后离线也能用。没有 `node_modules` 的深渊,没有 `npm install` 的等待。版本号直接写在 URL 里,清晰明了。
**4. 内置工具链**
Deno 自带一堆实用命令,不用再装一堆第三方 CLI:
- `deno fmt`:自动格式化代码(类似 Prettier)
- `deno lint`:代码检查(类似 ESLint)
- `deno test`:测试跑起来
- `deno compile`:把你的 TS 文件编译成独立的可执行文件(跨平台,支持 macOS/Linux/Windows)
比如 `deno compile hello.ts` 会生成一个原生二进制文件,直接分发,不需要目标机器装 Deno。
---
**进阶技巧(老鸟必看)**
**1. 使用 `deno.json` 配置项目**
虽然 Deno 不需要 `package.json`,但你可以用 `deno.json` 管理依赖和配置:
```json
{
"imports": {
"std/": "https://deno.land/std@0.224.0/"
},
"tasks": {
"dev": "deno run --allow-net --watch main.ts"
}
}
```
然后 `deno task dev` 就能跑起来了。`--watch` 是热重载,改代码自动重启。
**2. 权限细化到文件级别**
`--allow-read` 可以指定具体目录:
```bash
deno run --allow-read=/etc,/var/log your_script.ts
```
只给最小必要权限,安全第一。
**3. 用 `deno install` 安装全局工具**
比如你想装一个 Deno 写的 CLI 工具:
```bash
deno install -g https://deno.land/x/deno_std/example.ts
```
类似 npm 的 `-g`,全局可用。
**4. 配合 Docker 使用**
Deno 官方有轻量镜像,比如 `denoland/deno:alpine`,镜像大小只有几十 MB,比 Node 的几百 MB 轻多了。部署的时候直接用 `deno compile` 生成二进制扔进 alpine 容器,爽飞。
**5. 注意:Deno 不是 Node 的替代品(至少现在不是)**
虽然 Deno 能兼容部分 npm 包(通过 `npm:` 前缀),但生态还远不如 Node。如果你要用 Express、Koa、NestJS 这些,还是老老实实用 Node。但如果你写新项目,尤其是工具脚本、API 服务、或者想体验现代 JS 开发流程,Deno 绝对值得一试。
---
**最后说点真心话**
Deno 不是“未来”,它已经是“现在”了。它解决了 Node 最烦人的几个点:权限、模块管理、TypeScript 支持、工具链整合。虽然它还不够完美(比如 npm 兼容性一般,有些库用不了),但作为技术博主,我强烈建议你花 30 分钟试试它。你会发现,原来 JavaScript 服务端开发可以这么干净。
别怕折腾,装一个,跑个 `hello world`,感受一下 `--allow-net` 的“被信任感”。相信我,你会回来给我点赞的。
---
**标签**:开发工具 / 运行时 / Node / 跨平台
**分类**:开发工具
(完)