在scala.js中嵌入资源

时间:2017-11-18 16:20:24

标签: scala scala.js

我有一个我需要从scala.js访问的本地化资源文件。它必须是脚本执行环境的本地环境(即,不按照How to read a resource file in Scala.js?的建议从服务器异步加载)。

是否有任何机制可以将小资源文件的内容直接嵌入到从scala.js文件编译的生成的javascript中?基本上,我想要像:

object MyResource {
    @EmbeddedResource(URL("/my/package/localized.txt"))
    val resourceString: String = ???
}

这显然会使生成的.js文件膨胀一些,但这对我的应用程序来说是可接受的权衡。看起来这不是一个不寻常的需求,并且这个宏应该已经存在于某个地方,但是我最初的搜索没有任何改变。

1 个答案:

答案 0 :(得分:2)

如果您使用的是sbt,则可以使用源生成器来读取您的资源文件,并在val内的object中对其进行序列化:

sourceGenerators in Compile += Def.task {
  val baseDir = baseDirectory.value / "custom-resources" // or whatever
  val resourceFile = baseDir / "my/package/localized.txt"

  val sourceDir = (sourceManaged in Compile).value
  val sourceFile = sourceDir / "Localized.scala"

  if (!sourceFile.exists() ||
      sourceFile.lastModified() < resourceFile.lastModified()) {
    val content = IO.read(resourceFile).replaceAllLiterally("$", "$$")

    val scalaCode =
      s"""
      package my.package.localized

      object Localized {
        final val content = raw\"\"\"$content\"\"\"
      }
      """

    IO.write(sourceFile, scalaCode)
  }

  Seq(sourceFile)
}.taskValue

如果您正在使用其他构建工具,我相信您可以使用类似的源生成器概念。