本页内容

入门

欢迎来到 Deno!如果您刚开始使用,这里介绍了运行时的一些关键功能。如果您还没有,请确保安装 Deno 运行时

创建和运行 TypeScript 程序 跳转到标题

虽然您可以使用 JavaScript,但 Deno 也内置支持TypeScript。在您的终端中,创建一个名为 hello.ts 的新文件,并包含以下代码。

hello.ts
interface Person {
  firstName: string;
  lastName: string;
}

function sayHello(p: Person): string {
  return `Hello, ${p.firstName}!`;
}

const ada: Person = {
  firstName: "Ada",
  lastName: "Lovelace",
};

console.log(sayHello(ada));

此程序声明了一个接口 用于表示一个人,并定义了一个使用此数据类型将消息打印到控制台的函数。您可以使用 deno run 命令执行此示例中的代码。

deno run hello.ts

您可以在这里了解有关在 Deno 中使用 TypeScript 的更多信息

内置 Web API 和 Deno 命名空间 跳转到标题

Deno 旨在提供类似浏览器的编程环境,实现存在于前端 JavaScript 中的 Web 标准 API。例如,fetch API 在全局范围内可用,就像在浏览器中一样。要查看它的实际应用,请将 hello.ts 的内容替换为以下代码。

const site = await fetch("https://deno.org.cn");

console.log(await site.text());

由于此示例是从互联网上获取数据,因此您需要允许网络权限。您可以使用 --allow-net 标志或使用 -A 允许所有权限来授予网络权限。我们将在后面更深入地了解权限和安全性。使用以下命令运行示例

deno run -A hello.ts

对于不存在于 Web 标准中的 API(例如访问系统环境中的变量或操作文件系统),这些 API 在Deno 命名空间中公开。将 hello.ts 的内容替换为以下代码,它将在localhost:8000上启动HTTP 服务器

Deno.serve((_request: Request) => {
  return new Response("Hello, world!");
});

保存您的更改并运行脚本。

deno run -A hello.ts

了解有关 Deno 中内置的Web 标准 APIDeno 命名空间 API 的更多信息。

运行时安全性 跳转到标题

Deno 的一个主要功能是默认情况下运行时安全性,这意味着您必须明确允许您的代码访问可能敏感的 API,例如文件系统访问、网络连接和环境变量访问。

到目前为止,我们一直在使用 -A 标志运行所有脚本,该标志授予我们的脚本所有运行时功能访问权限。这是运行 Deno 程序最宽松的模式,但通常您希望只授予您的代码运行所需的权限。

要查看它的实际应用,让我们将 hello.ts 的内容替换为前面提到的 fetch 示例。

const site = await fetch("https://deno.org.cn");

console.log(await site.text());

运行此程序**不使用** -A 标志 - 然后会发生什么?

deno run hello.ts

在没有传递任何权限标志的情况下,您将看到类似于以下内容的安全提示

$ deno run index.ts
✅ Granted net access to "www.deno.com".
┌ ⚠️  Deno requests net access to "deno.com".
├ Requested by `fetch()` API.
├ Run again with --allow-net to bypass this prompt.
└ Allow? [y/n/A] (y = yes, allow; n = no, deny; A = allow all net permissions) >

在提示中,您可能已经注意到它提到了您需要使用哪个 CLI 标志才能运行您的代码并获得访问网络的权限 - --allow-net 标志。如果您使用此标志再次运行脚本,则不会提示您交互式地授予脚本访问网络的权限

deno run --allow-net hello.ts

为了简便起见,我们有时会展示使用 `deno run -A ...` 的示例,但只要有可能(以及在您的生产或 CI 环境中),我们鼓励您利用 Deno 的完整套件 可配置的运行时安全选项

导入 JavaScript 模块 跳转到标题

大多数情况下,您需要将程序分解成多个文件。同样,为了优先考虑 Web 标准和类似浏览器的编程模型,Deno 通过 ECMAScript 模块 支持这一点。考虑我们之前向您展示的 TypeScript 示例

hello.ts
interface Person {
  firstName: string;
  lastName: string;
}

function sayHello(p: Person): string {
  return `Hello, ${p.firstName}!`;
}

const ada: Person = {
  firstName: "Ada",
  lastName: "Lovelace",
};

console.log(sayHello(ada));

您可能希望将此程序分解,以便 `Person` 接口和 `sayHello` 函数位于单独的模块中。为此,在同一目录中创建一个名为 `person.ts` 的新文件,并包含以下代码

person.ts
export default interface Person {
  firstName: string;
  lastName: string;
}

export function sayHello(p: Person): string {
  return `Hello, ${p.firstName}!`;
}

此模块为 `sayHello` 函数创建了一个 命名导出,并为 `Person` 接口创建了一个 默认导出

回到 `hello.ts` 中,您可以使用 `import` 关键字使用此模块。

hello.ts
import Person, { sayHello } from "./person.ts";

const ada: Person = {
  lastName: "Lovelace",
  firstName: "Ada",
};

console.log(sayHello(ada));

导入中需要文件扩展名

请注意,导入模块时需要文件扩展名 - Deno 中的导入逻辑与浏览器中的工作方式相同,您需要包含导入的完整文件名。

您可以在此处了解有关 Deno 中模块系统的更多信息.

远程模块和 Deno 标准库 跳转到标题

Deno 支持从 URL 加载和执行代码,就像您在浏览器中使用 `<script>` 标签一样。在 Deno 1.x 中,标准库 和大多数 第三方模块 都通过 HTTPS URL 分发。

为了实际演示,让我们为上面创建的 `person.ts` 模块创建一个测试。Deno 提供了一个 内置测试运行器,它使用通过 HTTPS URL 分发的断言模块。

person_test.ts
import { assertEquals } from "https://deno.land/[email protected]/assert/mod.ts";
import Person, { sayHello } from "./person.ts";

Deno.test("sayHello function", () => {
  const grace: Person = {
    lastName: "Hopper",
    firstName: "Grace",
  };

  assertEquals("Hello, Grace!", sayHello(grace));
});

使用以下命令运行此测试

deno test person_test.ts

输出应该类似于以下内容

$ deno test person_test.ts
Check file:///Users/kevin/dev/denoland/scratchpad/person_test.ts
running 1 test from ./person_test.ts
sayHello function ... ok (4ms)

ok | 1 passed | 0 failed (66ms)

使用 标准库第三方模块 可以探索更多内容 - 一定要查看它们!

使用 deno.json 配置您的项目 跳转到标题

Deno 项目默认情况下不需要配置文件,但有时将设置、管理员脚本和依赖项配置存储在众所周知的位置很方便。在 Deno 中,该文件是 deno.jsondeno.jsonc。此文件的作用类似于 Node.js 中的 `package.json` 文件。

您可以使用 `deno.json` 来配置 导入映射,这将允许您为常用模块设置别名。

为了演示,让我们将项目中要使用的标准库版本固定为版本 `0.224.0`。

创建一个包含以下内容的 `deno.jsonc` 文件。

deno.jsonc
{
  "imports": {
    // The dollar sign in front of "std" isn't special - it's an optional
    // convention to show that $std is an alias set up in an import map
    "$std/": "https://deno.land/[email protected]/"
  }
}

现在,打开之前测试文件,并将其更改为使用此导入别名。

person_test.ts
import { assertEquals } from "$std/assert/mod.ts";
import Person, { sayHello } from "./person.ts";

Deno.test("sayHello function", () => {
  const grace: Person = {
    lastName: "Hopper",
    firstName: "Grace",
  };

  assertEquals("Hello, Grace!", sayHello(grace));
});

使用 `deno test person_test.ts` 运行测试应该和以前一样有效,但您可能会注意到 Deno 下载了一些额外的文件并生成了一个 `deno.lock` 文件,该文件指定了您的代码所依赖的一组文件。deno.jsoncdeno.lock 都可以签入到源代码控制中。

了解有关 此处配置项目的更多信息

Node.js API 和 npm 包 跳转到标题

Deno 提供了一个兼容性层,使您的代码能够使用 Node.js 内置模块和来自 npm 的第三方模块。在代码中使用 Node 和 npm 模块看起来很像使用标准 Deno 模块,只是在导入 Node 内置模块或 npm 模块时,您将分别使用 `node:` 或 `npm:` 规范。

要了解它的工作原理,请创建一个名为 server.js 的文件,并包含以下内容 - 使用流行的 Express 框架的简单 HTTP 服务器。

import express from "npm:express@4";

const app = express();

app.get("/", (request, response) => {
  response.send("Hello from Express!");
});

app.listen(3000);

使用 node:npm: 说明符,您可以将 Node.js 生态系统的精华带到 Deno。 了解有关 Node 和 npm 支持的更多信息.

配置您的 IDE 跳转到标题

Deno 开发在许多 主要 IDE 中得到支持。一个流行的选择是 Visual Studio Code,它有一个由 Deno 团队维护的 官方扩展安装扩展 并在您的 VS Code 工作区中启用它,方法是在 命令面板 中选择 Deno: 初始化工作区配置 选项。

command palette setup

不是 VS Code 用户?在这里找到您最喜欢的编辑器的集成 这里.

Web 应用程序框架 跳转到标题

Deno 的一个常见用例是构建数据驱动的 Web 应用程序。这样做通常需要使用更高级别的 Web 框架,Deno 生态系统中存在许多选择。以下是一些最受欢迎的选择。

Deno 原生框架 跳转到标题

  • Deno Fresh - Fresh 是一个为 Deno 设计的 Web 框架。页面默认情况下是服务器端渲染的,可以选择包含在客户端运行 JavaScript 的交互式岛屿。如果您是 Deno 的新手,并且正在寻找一个起点,我们建议您先尝试 Fresh!
  • Hono - Hono 是一个轻量级的 Web 框架,遵循 Express 的传统。非常适合 API 服务器和简单的 Web 应用程序。

与 Deno 兼容的框架 跳转到标题

  • SvelteKit - SvelteKit 是另一个更与运行时无关的 Web 框架,可以与 Deno 一起使用。我们建议从 此模板 开始。
  • Nuxt (Vue) - Nuxt 是一个混合 SSR 和客户端框架,可以与 Deno 一起使用。我们建议从 此模板 开始。
  • Astro - Astro 是一个现代 Web 框架,最初是为 Node.js 设计的,但在 Deno 上运行得很好。我们建议从 此模板 开始。

这里列出的框架只是支持 Deno 的众多框架中的一部分,但我们建议将它们作为起点。

部署到生产环境 跳转到标题

当您准备好进入生产环境时,最简单的选择将是 Deno Deploy。Deno Deploy 使得使用 Deno 创建快速、全球分布式的无服务器应用程序变得容易。

您也可以在几乎任何云环境中托管 Deno 这里.

下一步 跳转到标题

我们只是触及了 Deno 的可能性。以下是一些您接下来可以查看的资源。