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")) } )