【问题标题】:How to import a module inside the Deno REPL?如何在 Deno REPL 中导入模块?
【发布时间】:2020-12-03 17:53:14
【问题描述】:

尝试在 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 中使用外部代码吗?

【问题讨论】:

标签: deno


【解决方案1】:

v1.4.3开头,可以使用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"

【讨论】:

    【解决方案2】:

    如果你也尝试在 Node REPL 中使用import a from "a",它也会抛出同样的错误。 Node REPL中只能直接使用require导入模块。

    对于 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" }
    

    【讨论】:

      猜你喜欢
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 2021-09-25
      • 1970-01-01
      • 2020-09-01
      • 2020-11-01
      • 2021-05-16
      相关资源
      最近更新 更多