如何在Deno REPL中导入模块

  • 本文关键字:导入 模块 REPL Deno deno
  • 更新时间 :
  • 英文 :


试图在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)

我几乎每天都使用NodeREPL来快速测试代码。在不编写脚本或处理临时文件的情况下导入外部代码的能力是一个巨大的便利。

为什么Deno不能在模块之外使用导入语句?是否可以在Deno REPL中使用外部代码?

从v1.4.3开始,您可以在REPL中使用顶级await来动态import模块:

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

如果您也尝试在Node REPL中使用import a from "a",它也会抛出相同的错误。只有require可以直接用于导入Node REPL中的模块。

对于Deno,没有内置的CommonJS加载程序。因此,它甚至不提供require供您同步加载东西。

在REPL中不能使用静态导入的技术原因是,REPL实际上是一个脚本评估工具:它们不是将您编写的内容编译到ES模块中,而是被视为普通脚本并直接输入到引擎中,其方式类似于浏览器中的<script>,而无需打开type="module"。(具有静态导入的ES模块具有异步加载依赖项的语义,并在不实际运行模块的情况下确定模块的"形状"。(

要在Deno REPL中导入模块,可以使用动态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" }

最新更新