使用 Deno 创建您的第一个模块
本文将探讨如何使用 Deno 开始创建你的第一个模块。我们将重点介绍 Deno 社区目前为止总结出的通用结构和模式。
没时间阅读文章?直接前往代码库。
Deno是一个安全的 JavaScript 和 TypeScript 运行时环境,旨在为现代程序员提供高效安全的脚本编写环境。它基于 V8、Rust 和 TypeScript 构建。如果您想了解 Deno,我推荐您观看 Ryan Dahl 和 Kitson Kelly 的最新 Deno 演讲,或者访问其官方网站。
本文旨在达成以下预期目标:
搭建开发环境
首先,我们来安装 Deno。您可以在https://deno.land上找到安装说明。
请在终端中运行以下命令来检查您的安装情况。
deno -v
安装完成后,我建议为 VSCode 安装justjavac.vscode-deno扩展。此时,您很可能需要某种插件,因为 Deno 的导入语句与 Node.js 略有不同。
vscode-deno 扩展通过将类型定义缓存到特殊目录中来修复这类远程导入问题。
文件结构入门
为了方便你快速上手,我已经为你准备好了一个代码仓库。不过别担心,我会详细讲解其中的文件和目录。
git clone https://github.com/BrunnerLivio/deno-lib-starter.git hello-deno
cd hello-deno
在你的肌肉记忆发挥作用,你输入npm install或yarn——之前,让我们事先检查一下我们的文件夹里有什么。
├── deps.ts
├── .github
│ └── workflows
│ └── deno.yml
├── .gitignore
├── mod_test.ts
├── mod.ts
├── README.md
├── test_deps.ts
├── test.ts
└── tsconfig.json
mod.ts
该mod.ts文件通常是模块的入口点。在 Node.js 中,它对应的是 `.js` 文件index.js。在这里,我们公开了所有公共 API。根据项目的大小,为了保持mod.ts文件简洁,建议只使用`--include`import和export`--except` 语句,而不是定义实际的功能。
在这个入门模块中,我决定不将其拆分,因为在我看来没有必要。
// mod.ts
import { bold } from "./deps.ts";
/** Returns `Hello World` in bold */
export function getHelloWorld(): string {
return bold("Hello World");
}
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";
与Node.js相比,它有两个主要区别:
- 导入语句可以使用 URL。
- 导入语句必须有文件扩展名
我们正在从Deno 标准库导入一个模块,并导出该bold函数供内部使用。导入时,deno.land我们可以这样说:
“随便吧,给我最新最好的就行……”
https://deno.land/std/<PATH_TO_MODULE>.ts
或者“我不喜欢蹦极,请给我一个具体的版本”。
https://deno.land/std@{VERSION}/<PATH_TO_MODULE>.ts
一般来说,你应该始终使用配置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";
那么,让我们来测试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();
如果我们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)
不过,通常情况下,你的代码仓库里不会有任何测试文件(但愿如此!)。因此,最佳实践是test.ts在代码仓库中创建一个文件,专门用于导入并运行所有测试。既然如此,我们就把这个runTests()函数移到这个test.ts文件中吧。
// test.ts
import { runTests } from "./test_deps.ts";
import "./mod_test.ts";
runTests();
这样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
所以,我们基本上是使用一系列最新的 Deno 版本(从 0.30.0 到 0.32.0),检查格式并运行测试。很简单,对吧?
出版
在 Deno 中,不存在将模块发布到公司拥有的注册中心这种做法。正如我们之前所了解的,我们可以直接使用 URL 导入模块。因此,任何网站(包括 GitHub)都可以作为我们的注册中心!为了提高模块的可见性, deno.land/x
/ 上还有一个 Web 界面,这里汇集了第三方 Deno 库。要将你的库提交到那里,只需访问该网站的仓库并编辑相关文件即可。database.json
然后复制以下 JSON 对象并粘贴到文件中。请确保按字母顺序粘贴,并且-模块名称不要使用连字符,_空格请使用下划线代替。
"my_library_name": {
"type": "github",
"owner": "<MY_GITHUB_USERNAME>",
"repo": "<MY_REPOSITORY_NAME",
"desc": "<REPOSITORY_DESCRIPTION>"
},
滚动到页面底部,添加有意义的提交信息,然后按下绿色Propose file change按钮。
现在我们只需要创建一个拉取请求,然后等待维护者之一的批准即可合并。
您的代码仍将托管在 GitHub 上,您无需将任何代码更新重新提交到 deno.land。因此,持续交付对于 Deno 而言已是“理所当然”的。
结论
如果非要我选出Deno最吸引我的一点,那就是它的工具链。由于Deno使用了TypeScript编译器,我们无需自行编译代码。而且,它还集成了代码格式化工具(不久还将推出代码检查工具),我们甚至无需操心下载和配置这些工具。
我认为Deno前途无量。虽然它还有很多不足之处,我目前也不会在生产环境中使用它,但就我目前所见,Deno在很多方面都做得非常出色!
文章来源:https://dev.to/brunnerlivio/create-your-first-module-with-deno-575k



