如何在 Deno 中编写自己的模块

阅读时长 5 分钟读完

前言

Deno 是一个新兴的 JavaScript 和 TypeScript 运行时,与 Node.js 不同,它的核心模块和代码加载方式都没有遗留的历史问题。值得一提的是,Deno 的模块加载方式是一种具有前瞻性的技术,这使得模块可以轻松地从任意 URL 加载,而不仅仅是从文件系统。本文将指导您如何在 Deno 中编写自己的模块,包括如何创建依赖注入、测试和发布模块等。

基本结构

在 Deno 中,一个模块可以是多个文件,并且可以具有任意的目录结构。一个比较好的约定是,在每个模块中都有一个名为 mod.ts 的主文件作为入口点。在这个文件中,我们可以导出所有我们想要公开的东西。

在上面的代码中,我们定义了一个 MyClass 类,并从 mod.ts 中导出了它。这意味着任何导入这个模块的代码都可以使用 MyClass

依赖注入

在实践中,我们经常需要在代码中使用一些其他的对象。依赖注入是一种将这些对象提取到参数中并传递给代码的方法,从而可以更轻松地测试和维护代码。在 Deno 中,我们可以使用 symboltypealias 类型注解来实现依赖注入。

-- -------------------- ---- -------
-- ---------
------ - -------------------- ---------------- - ---- -------------

------ ----- ------- -
  ------------
    ------- -------- ------------- ---------------- - ----- -- -------------------------------
  - --

  ------ -------- -
    ---------------------------
  -
-

在上面的代码中,我们定义了一个 MY_DEPENDENCY_TOKENMyDependencyType,并将 myDependency 依赖注入到了 MyClass 构造函数中。这允许我们将 myDependency 对象直接替换为测试模拟对象,并且这个代码的实现并不知道它们有没有被更改。

测试

测试是任何软件开发项目的重要组成部分。在 Deno 中,我们可以使用内置的测试框架 test 来测试我们的模块。通常,我们将测试文件放在与被测试的模块相同的目录中,并使用 test('should ...', () => { ... }) 函数来定义测试用例。

-- -------------------- ---- -------
-- --------------
------ - ------ - ---- -------------------------------------------
------ - ------- - ---- --------------

------------ ----- --------- -- -- -
  ----- ------ - -------------- -------
  --- -------------------
  -------------------------- --- ---
---

在上面的代码中,我们首先导入 assert 函数和 MyClass,然后定义了一个测试用例来检查 MyClass.method 是否输出了 "Hello World!"。我们使用 spyOn 函数来模拟控制台日志方法,并使用 assert 函数来验证测试是否通过。

可以通过运行 deno test 命令来运行测试。

发布模块

发布模块可以使您的代码被使用,并可以使您的代码更容易地与其他人合作。Deno 的模块发布方式基于 URL,您只需使用 deno.land/x 上的 URL 来标识您的模块即可。具体来说,您只需将您的 mod.ts 文件提交到一个 Git 存储库,并使用以下格式的 URL 进行访问:

其中的 {module-name} 即您的模块名。例如,在 github.com/my-user/my-module 存储库中,您可以使用以下 URL:

这将下载并执行 mod.ts 文件。当然,发布模块还需要一些其他的元数据,例如版本和描述等。您可以考虑使用 DenoLand 上的 dempublish 工具来管理这些信息和发布您的模块。

结论

本文演示了如何在 Deno 中编写模块,并引入了依赖注入、测试和发布模块等概念。Deno 的模块加载方式为为开发人员提供了更多的选择,而内置的测试框架使编写测试变得更加容易。希望本文能帮助您轻松地开发好的 Deno 模块。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67373f12317fbffedf09203c

纠错
反馈