如何在 Deno REPL 中导入模块?

How to import a module inside the Deno REPL?

尝试在 Deno REPL 中导入模块会导致以下错误:

Uncaught SyntaxError: Cannot use import statement outside a module
    at evaluate (rt/40_repl.js:60:36)
    at replLoop (rt/40_repl.js:160:15)

我几乎每天都使用 Node REPL 来快速测试代码。无需编写脚本或处理临时文件即可导入外部代码的能力非常方便。

为什么 Deno 不能在模块外使用 import 语句?甚至可以在 Deno REPL 中使用外部代码吗?

如果你也尝试在 Node REPL 中使用 import a from "a",它也会抛出同样的错误。只有require可以直接用于在Node REPL中导入mod规则

对于 Deno,没有 built-in CommonJS 加载器。因此,它甚至不提供 require 供您同步加载内容。

REPL中不能使用static import的技术原因是REPL实际上是一个脚本评估工具:不是将你写的东西编译到ES Module中,而是将它们视为普通脚本并直接输入到引擎中, 类似于浏览器中的 <script> 不开启 type="module" 的方式。 (带有静态导入的 ES mod 规则具有异步加载依赖项和确定 mod 规则的“形状”的语义,甚至实际上 运行 它。)

要在 Deno REPL 中导入 mod 规则,您可以使用动态 import()。就个人而言,我有时会执行以下操作(加载通常足够快,以至于在继续使用 REPL 中的 mod 之前,您几乎已经设置了 mod 值):

$ deno
> let mod; import("./mod.ts").then(m => mod = m)
Promise { <pending> }
Check file:///[blah]/mod.ts
> mod
Module { a: 1, Symbol(Symbol.toStringTag): "Module" }

v1.4.3, you can use top-level await in the REPL 开始到动态 import 模块:

> const path = await import("https://deno.land/std@0.73.0/path/mod.ts")
> path.basename("/my/path/name")
"name"