Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Scala.jsでSyntaxError: Cannot use import statement outside a module出たら見るページ

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したいということはscalaJSUseMainModuleInitializertrueになっているときに起こる
  • 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"))
    }
  )
★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?