2016-11-29 60 views
2

我需要在运行时从sjsir文件构建一个js文件来实现一个插件系统,以便在编译时不能在编译时进行编译。我曾经用0.6.3实现了以下代码中的同一个进程,但似乎不推荐使用。你推荐使用什么算法来实现0.6.13的相同动作? 谢谢从SJSIR`手动构建JS`

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 
) 
} 

回答

2

实际上,Tools 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)) 

如果您打算在同一进程中的同一类路径上多次调用此方法,建议跨缓存并重复使用实例irCachelinker,因为这会大大加快进程速度。

另请参阅the Scaladoc of the Tools API

+0

完美!谢谢。 – Mathieu

0

有没有一种方法可以防止在批量sjsir(它会在链接时生成消息:XXX already seen)中的类重复错误?我想是的,因为这个错误不会发生在build.sbt编译时完成的构建。