发布于 2026-01-06 3 阅读
0

使用 Deno 创建您的第一个模块

使用 Deno 创建您的第一个模块

本文将探讨如何使用 Deno 开始创建你的第一个模块。我们将重点介绍 Deno 社区目前为止总结出的通用结构和模式。

没时间阅读文章?直接前往代码库

Deno是一个安全的 JavaScript 和 TypeScript 运行时环境,旨在为现代程序员提供高效安全的脚本编写环境。它基于 V8、Rust 和 TypeScript 构建。如果您想了解 Deno,我推荐您观看 Ryan Dahl 和 Kitson Kelly 的最新 Deno 演讲,或者访问其官方网站

本文旨在达成以下预期目标:

搭建开发环境

首先,我们来安装 Deno。您可以在https://deno.land上找到安装说明。

请在终端中运行以下命令来检查您的安装情况。

deno -v
Enter fullscreen mode Exit fullscreen mode

安装完成后,我建议为 VSCode 安装justjavac.vscode-deno扩展。此时,您很可能需要某种插件,因为 Deno 的导入语句与 Node.js 略有不同。

使用 Deno 时出现 TypeScript 导入错误

vscode-deno 扩展通过将类型定义缓存到特殊目录中来修复这类远程导入问题。

文件结构入门

为了方便你快速上手,我已经为你准备好了一个代码仓库。不过别担心,我会详细讲解其中的文件和目录。

git clone https://github.com/BrunnerLivio/deno-lib-starter.git hello-deno
cd hello-deno
Enter fullscreen mode Exit fullscreen mode

在你的肌肉记忆发挥作用,你输入npm installyarn——之前,让我们事先检查一下我们的文件夹里有什么。

├── deps.ts
├── .github
│   └── workflows
│       └── deno.yml
├── .gitignore
├── mod_test.ts
├── mod.ts
├── README.md
├── test_deps.ts
├── test.ts
└── tsconfig.json

Enter fullscreen mode Exit fullscreen mode

mod.ts

mod.ts文件通常是模块的入口点。在 Node.js 中,它对应的是 `.js` 文件index.js。在这里,我们公开了所有公共 API。根据项目的大小,为了保持mod.ts文件简洁,建议只使用`--include`importexport`--except` 语句,而不是定义实际的功能。

在这个入门模块中,我决定不将其拆分,因为在我看来没有必要。

// mod.ts
import { bold } from "./deps.ts";

/** Returns `Hello World` in bold */
export function getHelloWorld(): string {
  return bold("Hello World");
}

Enter fullscreen mode Exit fullscreen mode

deps.ts

等等——我的 package.json 文件在哪里?

package.json别担心,使用 Deno 时不需要这样做。大多数 Deno 模块都使用deps.ts文件来集中管理它们的依赖项。

我们来看看这个文件的结构。

// deps.ts
// Add your dependencies in here
export { bold } from "https://deno.land/std@v0.32.0/fmt/colors.ts";

Enter fullscreen mode Exit fullscreen mode

与Node.js相比,它有两个主要区别:

  • 导入语句可以使用 URL。
  • 导入语句必须有文件扩展名

我们正在从Deno 标准库导入一个模块,并导出该bold函数供内部使用。导入时,deno.land我们可以这样说:

“随便吧,给我最新最好的就行……”

https://deno.land/std/<PATH_TO_MODULE>.ts
Enter fullscreen mode Exit fullscreen mode

或者“我不喜欢蹦极,请给我一个具体的版本”。

https://deno.land/std@{VERSION}/<PATH_TO_MODULE>.ts
Enter fullscreen mode Exit fullscreen mode

一般来说,你应该始终使用配置deps.ts文件导入外部模块。这样可以更轻松地概览所有依赖项,而无需查看每个单独的文件。

mod_test.ts、test.ts 和 test_deps.ts

Deno 自带一个测试框架。它虽然简单,但非常实用,目前为止完全满足我的需求。要导入测试函数,我们使用一个test_deps.ts文件。

// test_deps.ts
// Add your test dependencies in here
export { test, runTests } from "https://deno.land/std@v0.32.0/testing/mod.ts";
export { assertEquals } from "https://deno.land/std@v0.32.0/testing/asserts.ts";
Enter fullscreen mode Exit fullscreen mode

那么,让我们来测试mod.ts一下。与 Node.js 类似,大多数项目都使用<NAME>.spec.ts文件进行单元测试,我们也使用<NAME>_test.ts.

让我们检查一下文件getHelloWorld()中的函数是否在名为 . 的文件中mod.ts返回粗体Hello Worldmod_test.ts

// mod_test.ts
import { test, assertEquals, runTests } from "./test_deps.ts";
import { getHelloWorld } from "./mod.ts";

test(function test_get_hello_world() {
  assertEquals(getHelloWorld(), "\x1b[1mHello World\x1b[22m");
});

runTests();
Enter fullscreen mode Exit fullscreen mode

如果我们deno ./mod_test.ts在 shell 中执行,应该会看到测试通过了!

running 1 tests
OK     test_get_hello_world (0.00ms)

test result: OK 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out (2.00ms)
Enter fullscreen mode Exit fullscreen mode

不过,通常情况下,你的代码仓库里不会有任何测试文件(但愿如此!)。因此,最佳实践是test.ts在代码仓库中创建一个文件,专门用于导入并运行所有测试。既然如此,我们就把这个runTests()函数移到这个test.ts文件中吧。

// test.ts
import { runTests } from "./test_deps.ts";

import "./mod_test.ts";

runTests();

Enter fullscreen mode Exit fullscreen mode

这样deno test.ts应该能得到和之前一样的结果。文件结构就介绍到这里了。如果你对文件结构/命名有任何疑问,可以查看Deno 的官方风格指南!

工具

我喜欢 Deno 的一点是它提供的开箱即用的功能。而且,它的工具功能还不止于此。Deno 可以直接通过命令行界面 (CLI)使用Prettier进行格式化。

只需运行deno fmt **/*.ts即可格式化代码。无需费心研究当前流行的格式化规则。无需再苦苦寻找社区最热门、最新最棒的格式化工具。一切尽在掌握……几乎完美……不过,
在代码检查方面,目前还没有如此便捷的解决方案。Deno 也计划支持代码检查。请查看此GitHub issue以获取最新信息!

持续集成

由于我们的工具已经随 Deno 一起安装好了,所以我们的 CI 配置非常简单。在本文中,我们将使用GitHub Actions。此外,为了简化操作,我们使用denolib/setup-deno action 来安装 Deno。

在我们的.github/workflows/deno.yml文件中,我们可以找到以下配置。

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        deno: [0.32.0, 0.31.0, 0.30.0]
    name: Test with Deno ${{ matrix.deno }} 

    steps:
      - uses: actions/checkout@master

      - name: Setup Deno
        uses: denolib/setup-deno@master
        with:
          deno-version: ${{ matrix.deno }}

      - name: Setup Node
        uses: actions/setup-node@master
        with:
          node-version: 12

      - name: Print deno version
        run: deno --version

      - name: Check format
        run: deno fmt --check **/*.ts

      - name: Run tests
        run: deno test.ts
Enter fullscreen mode Exit fullscreen mode

所以,我们基本上是使用一系列最新的 Deno 版本(从 0.30.0 到 0.32.0),检查格式并运行测试。很简单,对吧?

出版

在 Deno 中,不存在将模块发布到公司拥有的注册中心这种做法。正如我们之前所了解的,我们可以直接使用 URL 导入模块。因此,任何网站(包括 GitHub)都可以作为我们的注册中心!为了提高模块的可见性, deno.land/x
/ 上还有一个 Web 界面,这里汇集了第三方 Deno 库。要将你的库提交到那里,只需访问该网站的仓库并编辑相关文件即可。database.json

在 Deno 网站仓库中编辑 database.json 文件

然后复制以下 JSON 对象并粘贴到文件中。请确保按字母顺序粘贴,并且-模块名称不要使用连字符,_空格请使用下划线代替。

"my_library_name": {
  "type": "github",
  "owner": "<MY_GITHUB_USERNAME>",
  "repo": "<MY_REPOSITORY_NAME",
  "desc": "<REPOSITORY_DESCRIPTION>"
},
Enter fullscreen mode Exit fullscreen mode

滚动到页面底部,添加有意义的提交信息,然后按下绿色Propose file change按钮。

在 GitHub 上提出文件更改建议

现在我们只需要创建一个拉取请求,然后等待维护者之一的批准即可合并。

在 GitHub 上创建拉取请求

您的代码仍将托管在 GitHub 上,您无需将任何代码更新重新提交到 deno.land。因此,持续交付对于 Deno 而言已是“理所当然”的。

结论

如果非要我选出Deno最吸引我的一点,那就是它的工具链。由于Deno使用了TypeScript编译器,我们无需自行编译代码。而且,它还集成了代码格式化工具(不久还将推出代码检查工具),我们甚至无需操心下载和配置这些工具。

我认为Deno前途无量。虽然它还有很多不足之处,我目前也不会在生产环境中使用它,但就我目前所见,Deno在很多方面都做得非常出色!

文章来源:https://dev.to/brunnerlivio/create-your-first-module-with-deno-575k