Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to import a module inside the Deno REPL?

Tags:

deno

Attempting to import a module in the Deno REPL results in the following error:

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)

I use the Node REPL to quickly test out code, almost on a daily basis. The ability to import external code without writing a script or dealing with temporary files is a huge convenience.

Why can't Deno use import statements outside of a module? Is it even possible to use external code in the Deno REPL?

like image 448
darksinge Avatar asked Aug 13 '20 20:08

darksinge


2 Answers

Starting with v1.4.3, you can use top-level await in the REPL to dynamically import modules:

> const path = await import("https://deno.land/[email protected]/path/mod.ts")
> path.basename("/my/path/name")
"name"
like image 162
bela53 Avatar answered Nov 19 '22 06:11

bela53


If you also try to use import a from "a" in Node REPL, it will also throw the same error. Only require can be directly used to import modules in Node REPL.

For Deno, there is no built-in CommonJS loader. Therefore it does not even provide require for you to load stuff synchronously.

The technical reason of why static import cannot be used in REPL is that REPL is actually a script evaluation tool: instead of compiling what you write into an ES Module, they are treated as plain scripts and directly fed into the engine, in the way similar to <script> in the browser without turning on the type="module". (ES modules with static imports have the semantics of asynchronously loading dependencies and determining the "shape" of a module without even actually running it.)

To import modules in Deno REPL, you can use dynamic import(). Personally I sometimes do the following (loading is usually fast enough such that you will pretty much have mod value set before you continue using the mod in REPL):

$ 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" }
like image 38
Kevin Qian Avatar answered Nov 19 '22 05:11

Kevin Qian