Scala.jsでSyntaxError: Cannot use import statement outside a module
が出ることがある。
環境
val scala3Version = "3.5.2"
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.17.0")
tl;dr
.withOutputPatterns(OutputPatterns.fromJSFile("%s.mjs")
しよう
説明
- Scala.jsのコードをsbtなどから
run
するときに起こるrun
したいということはscalaJSUseMainModuleInitializer
もtrue
になっているときに起こる
- Node.jsは
.js
ファイルをデフォルトではESModuleではなくCommonJSとして扱う - Scala.jsでESModuleを出力させているが、拡張子が
.js
のままのときに、Scala.jsはESMを吐くのにNodeはCommonJSのつもりで読んでビックリする - 拡張子を
.mjs
にしてやると安心する
コード例
// build.sbt import org.scalajs.linker.interface.OutputPatterns lazy val root = project .in(file(".")) .enablePlugins(ScalaJSPlugin) .settings( // ... scalaJSUseMainModuleInitializer := true, scalaJSLinkerConfig ~= { _.withModuleKind(ModuleKind.ESModule) .withOutputPatterns(OutputPatterns.fromJSFile("%s.mjs")) } )