投稿の内容
本投稿では、Scala.jsのsbtのタスクfastLinkJSで出力されたJSファイルを任意の場所にコピーするするようにfastLinkJSを修正します。
fastLinkJSタスクとは
fastLinkJSタスクは、sbtのScala.jsのビルドタスクです。
以下のように使います。
sbt> fastLinkJS
このタスクを実行すると以下のディレクトリにmain.jsを出力します。
target/scala-{scalaVersion}/{projectName}-fastopt/main.js
main.jsをHTMLで使う
このmain.jsをHTMLファイルで以下のように使用します。
<script type="text/javascript" src="./target/scala-{scalaVersion}/{projectName}-fastopt/main.js"></script>
main.jsの出力先を修正する
main.jsのデフォルトの出力先だと、HTMLファイルがある場所からは使い辛いですよね?例えば、デプロイしたいディレクトリがdistディレクトリだとするとHTMLファイルもdist/index.htmlにあるわけで、main.jsもdist/main.jsに出力したいところです。
そこでfastLinkJSタスクを修正して、例えばdist/main.jsに出力させるように修正したいと思います。
fastLinkJSを上書きする
まずbuild.sbtでfastLinkJSを修正するには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
}
...
)