メインコンテンツまでスキップ

Scala.jsの出力ファイルを変更する

· 約3分

投稿の内容

本投稿では、Scala.jssbtのタスクfastLinkJSで出力されたJSファイルを任意の場所にコピーするするようにfastLinkJSを修正します。

fastLinkJSタスクとは

fastLinkJSタスクは、sbtScala.jsのビルドタスクです。

以下のように使います。

sbt> fastLinkJS

このタスクを実行すると以下のディレクトリにmain.jsを出力します。

target/scala-{scalaVersion}/{projectName}-fastopt/main.js

main.jsHTMLで使う

このmain.jsHTMLファイルで以下のように使用します。

<script type="text/javascript" src="./target/scala-{scalaVersion}/{projectName}-fastopt/main.js"></script>

main.jsの出力先を修正する

main.jsのデフォルトの出力先だと、HTMLファイルがある場所からは使い辛いですよね?例えば、デプロイしたいディレクトリがdistディレクトリだとするとHTMLファイルもdist/index.htmlにあるわけで、main.jsdist/main.jsに出力したいところです。

そこでfastLinkJSタスクを修正して、例えばdist/main.jsに出力させるように修正したいと思います。

fastLinkJSを上書きする

まずbuild.sbtfastLinkJSを修正するにはsettingsの中でfastLinkJSを上書きします。

lazy val myProject = (project in file("./my-project"))
.enablePlugins(ScalaJSPlugin)
.settings(
...
fastLinkJS := {
// ここに修正を書く
}
...
)

デフォルトの出力先を取得する

// デフォルトの出力先ディレクトリを取得
val oldOutputDir = (ThisProject / Compile / fastLinkJSOutput).value

// デフォルトのfastLinkJSの結果を取得する
val report = (ThisProject / Compile / fastLinkJS).value

// 出力ファイル名を取得する(main.js)
val jsFileName = report.data.publicModules.head.jsFileName

// デフォルトの出力先パス
val oldOutputPath = java.nio.file.Path.of(oldOutputDir.toString, jsFileName).toFile

新しい出力先を設定する

// 新しい出力先ディレクトリ
val newOutputDir = s"./dist"

// 新しい出力先パス
val newOutputPath = java.nio.file.Path.of(newOutputDir, jsFileName).toFile

// 新しい出力先にコピーする
IO.copyFile(oldOutputPath, newOutputPath)

ソースマップも出力する

// ソースマップファイル名の取得(Option[String])
val sourceMapName = report.data.publicModules.head.sourceMapName

sourceMapName.foreach { fname =>
// デフォルトのソースマップファイルの出力先
val oldSourceMapPath = java.nio.file.Path.of(oldOutputDir.toString, fname).toFile

// 新しいソースマップファイルの出力先
val newSourceMapPath = java.nio.file.Path.of(newOutputDir, fname).toFile

// 新しい出力先にソースマップをコピーする
IO.copyFile(oldSourceMapPath, newSourceMapPath)
}

まとめ

lazy val myProject = (project in file("./my-project"))
.enablePlugins(ScalaJSPlugin)
.settings(
...
fastLinkJS := {
val oldOutputDir = (ThisProject / Compile / fastLinkJSOutput).value
val report = (ThisProject / Compile / fastLinkJS).value
val jsFileName = report.data.publicModules.head.jsFileName
val oldOutputPath = java.nio.file.Path.of(oldOutputDir.toString, jsFileName).toFile
val newOutputDir = s"./dist"
val newOutputPath = java.nio.file.Path.of(newOutputDir, jsFileName).toFile
IO.copyFile(oldOutputPath, newOutputPath)

val sourceMapName = report.data.publicModules.head.sourceMapName
sourceMapName.foreach { fname =>
val oldSourceMapPath = java.nio.file.Path.of(oldOutputDir.toString, fname).toFile
val newSourceMapPath = java.nio.file.Path.of(newOutputDir, fname).toFile
IO.copyFile(oldSourceMapPath, newSourceMapPath)
}

report
}
...
)