本页内容

Deno 中的 ECMAScript 模块

概念 跳转到标题

  • import 允许您包含和使用保存在其他地方的模块,无论是本地文件系统还是远程。
  • 导入是 URL 或文件系统路径。
  • export 允许您指定模块的哪些部分可供导入您的模块的用户访问。

概述 跳转到标题

Deno 默认情况下使用 ECMAScript 6 import/export 标准来标准化 JavaScript 和 TypeScript 中模块的导入方式。

它采用类似浏览器的模块解析方式,这意味着必须完整指定文件名。您不能省略文件扩展名,并且没有对 index.js 的特殊处理。

import { add, multiply } from "./arithmetic.ts";

依赖项也是直接导入的,没有包管理开销。本地模块的导入方式与远程模块完全相同。正如以下示例所示,可以使用相同的方式,通过本地或远程模块来实现相同的功能。

本地导入 跳转到标题

在此示例中,addmultiply 函数从本地 arithmetic.ts 模块导入。

命令: deno run local.ts

/**
 * local.ts
 */
import { add, multiply } from "./arithmetic.ts";

function totalCost(outbound: number, inbound: number, tax: number): number {
  return multiply(add(outbound, inbound), tax);
}

console.log(totalCost(19, 31, 1.2));
console.log(totalCost(45, 27, 1.15));

/**
 * Output
 *
 * 60
 * 82.8
 */

远程导入 跳转到标题

在上面的本地导入示例中,addmultiply 方法从本地存储的算术模块导入。也可以通过从远程模块导入 addmultiply 方法来创建相同的功能。

在本例中,引用了 Ramda 模块,包括版本号。还要注意,JavaScript 模块直接导入到 TypeScript 模块中,Deno 可以轻松处理这种情况。

命令: deno run ./remote.ts

/**
 * remote.ts
 */
import {
  add,
  multiply,
} from "https://x.nest.land/[email protected]/source/index.js";

function totalCost(outbound: number, inbound: number, tax: number): number {
  return multiply(add(outbound, inbound), tax);
}

console.log(totalCost(19, 31, 1.2));
console.log(totalCost(45, 27, 1.15));

/**
 * Output
 *
 * 60
 * 82.8
 */

导出 跳转到标题

在上面的本地导入示例中,addmultiply 函数从本地存储的算术模块导入。为了实现这一点,存储在算术模块中的函数必须导出。

为此,只需在函数签名开头添加关键字 export,如下所示。

/**
 * arithmetic.ts
 */
export function add(a: number, b: number): number {
  return a + b;
}

export function multiply(a: number, b: number): number {
  return a * b;
}

所有需要在外部模块中访问的函数、类、常量和变量都必须导出。可以通过在它们前面加上 export 关键字,或者将它们包含在文件末尾的导出语句中来实现。

常见问题解答 跳转到标题

如何导入特定版本的模块? 跳转到标题

在 URL 中指定版本。例如,此 URL 完全指定了正在运行的代码:https://unpkg.com/[email protected]/dist/liltest.js

在所有地方导入 URL 似乎很麻烦。 跳转到标题

如果其中一个 URL 链接到库的略微不同版本怎么办?

在一个大型项目中维护所有地方的 URL 不是容易出错吗?

解决方案是在一个中央 deps.ts 文件中导入和重新导出外部库(它与 Node 的 package.json 文件的作用相同)。例如,假设你在一个大型项目中使用上述断言库。与其在所有地方导入 "https://deno.land/std/assert/mod.ts",你可以创建一个 deps.ts 文件来导出第三方代码

deps.ts

export {
  assert,
  assertEquals,
  assertStringIncludes,
} from "https://deno.land/[email protected]/assert/mod.ts";

在同一个项目中,你可以从 deps.ts 中导入,避免对同一个 URL 有很多引用

import { assertEquals, runTests, test } from "./deps.ts";

这种设计绕过了包管理软件、集中式代码库和多余文件格式带来的大量复杂性。

如何才能信任可能更改的 URL? 跳转到标题

通过使用锁定文件(使用 --lock 命令行标志),你可以确保从 URL 拉取的代码与初始开发时相同。你可以了解更多关于这方面的知识 这里.

但是如果 URL 的主机宕机了怎么办?源代码将不可用。 跳转到标题

这与上面一样,是任何远程依赖系统都会遇到的问题。依赖外部服务器在开发中很方便,但在生产中很脆弱。生产软件应该始终将依赖项打包。在 Node 中,这是通过将 node_modules 检查到源代码控制中来完成的。在 Deno 中,这是通过使用 deno vendor 子命令来完成的。