从 SJSIR “手动”构建 JS

2024-02-14

我需要在运行时从 sjsir 文件构建一个 js 文件来实现插件系统,这样就无法在编译时与我的其余编译一起完成。我曾经在 0.6.3 中使用以下代码实现相同的过程,但它似乎已被弃用。您建议使用什么算法来实现与 0.6.13 相同的操作? 谢谢

val scalajsLib = copyJar("scalajs-library_2.11-0.6.3")

val semantics = org.scalajs.core.tools.sem.Semantics.Defaults

val partialClasspath =
  PartialClasspathBuilder.build(collection.immutable.Seq(scalajsLib, src))

val completeClasspath = partialClasspath.resolve()

val optimizer = new ScalaJSOptimizer(semantics)

val logger = new ScalaConsoleLogger

val out = WritableFileVirtualJSFile(
    new java.io.File(target, JS_FILE))
if (optimized) {
  val sems = semantics.optimized

  new ScalaJSClosureOptimizer(sems).optimizeCP(
    new ScalaJSOptimizer(sems),
    completeClasspath,
    ScalaJSClosureOptimizer.Config(out),
    logger
  )
} else {
  optimizer.optimizeCP(
    completeClasspath,
    ScalaJSOptimizer.Config(out, checkIR = false, wantSourceMap = !optimized),
    logger
  )
}

事实上,工具 API 在 0.6.5 中发生了巨大的变化。它变得更加简单,并且能够在未来以不间断的方式发展。

您可以使用新的 API 编写上面的代码,如下所示:

import java.io.File

import org.scalajs.core.tools.io._
import org.scalajs.core.tools.sem._
import org.scalajs.core.tools.linker.backend.{OutputMode, ModuleKind}
import org.scalajs.core.tools.linker.Linker
import org.scalajs.core.tools.logging.ScalaConsoleLogger

def link(inputClasspath: Seq[File], outputJSFile: File): Unit = {
  // Obtain VirtualScalaJSIRFile's from the input classpath
  val irCache = new IRFileCache().newCache
  val irContainers = IRFileCache.IRContainer.fromClasspath(inputClasspath)
  val sjsirFiles = irCache.cached(irContainers)

  // A bunch of options. Here we use all the defaults
  val semantics = Semantics.Defaults
  val outputMode = OutputMode.Default
  val moduleKind = ModuleKind.NoModule
  val linkerConfig = Linker.Config()

  // Actual linking
  val linker = Linker(semantics, outputMode, moduleKind, linkerConfig)
  val logger = new ScalaConsoleLogger
  linker.link(sjsirFiles, WritableFileVirtualJSFile(outputJSFile), logger)
}

你可以称之为link具有以下参数的函数,以与上面的代码片段完全匹配:

link(Seq(scalajsLib, src), new java.io.File(target, JS_FILE))

如果您打算在同一进程内的同一类路径上多次调用此方法,建议缓存并重用实例irCache and linker跨运行,因为这将大大加快该过程。

也可以看看工具 API 的 Scaladoc https://www.scala-js.org/api/scalajs-tools/latest/#org.scalajs.core.tools.package.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 SJSIR “手动”构建 JS 的相关文章

随机推荐