本页内容
Deno 中的 ECMAScript 模块
概念 跳转到标题
概述 跳转到标题
Deno 默认情况下使用 ECMAScript 6 import/export
标准来标准化 JavaScript 和 TypeScript 中模块的导入方式。
它采用类似浏览器的模块解析方式,这意味着必须完整指定文件名。您不能省略文件扩展名,并且没有对 index.js
的特殊处理。
import { add, multiply } from "./arithmetic.ts";
依赖项也是直接导入的,没有包管理开销。本地模块的导入方式与远程模块完全相同。正如以下示例所示,可以使用相同的方式,通过本地或远程模块来实现相同的功能。
本地导入 跳转到标题
在此示例中,add
和 multiply
函数从本地 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
*/
远程导入 跳转到标题
在上面的本地导入示例中,add
和 multiply
方法从本地存储的算术模块导入。也可以通过从远程模块导入 add
和 multiply
方法来创建相同的功能。
在本例中,引用了 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
*/
导出 跳转到标题
在上面的本地导入示例中,add
和 multiply
函数从本地存储的算术模块导入。为了实现这一点,存储在算术模块中的函数必须导出。
为此,只需在函数签名开头添加关键字 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
子命令来完成的。