在ScalaJs sbt构build中,使用webjars而不是npm或者bower与'Provided'有什么优势?

当我几个月前第一次发现webjars时,我非常怀疑,考虑到这些构build/构build系统的巨大复杂性,考虑到发布js文件的频率,这将成为处理客户端依赖的一种可行方式。 第二个问题当然是没有根据的,但是我花了将近36小时徒劳地试图获得大约10个scss/css/lesstypes的webjars和8个JS webjars,在一个jsDependencies屋顶下生活。

当你到达JS依赖关系3,4或者5时,我发现,你开始进入一个荒谬的时间循环:

1.“哦,没有!fastOptJS失败,因为有一些随机文件也被命名为相同的在webjar!

 [trace] Stack trace suppressed: run last client/compile:resolvedJSDependencies for the full output. [error] (client/compile:resolvedJSDependencies) org.scalajs.core.tools.jsdep.JSLibResolveException: Some references to JS libraries could not be resolved: [error] - Ambiguous reference to a JS library: bootstrap.min.js [error] Possible paths found on the classpath: [error] - META-INF/resources/webjars/bootstrap/3.3.6/js/bootstrap.min.js [error] - META-INF/resources/webjars/bootstrap3-dialog/1.34.4/examples/assets/bootstrap/js/bootstrap.min.js [error] originating from: client:compile, client:compile, client:compile, client:compile [error] - Ambiguous reference to a JS library: bootstrap.js [error] Possible paths found on the classpath: [error] - META-INF/resources/webjars/bootstrap3-dialog/1.34.4/examples/assets/bootstrap/js/bootstrap.js [error] - META-INF/resources/webjars/bootstrap/3.3.6/js/bootstrap.js [error] originating from: client:compile, client:compile, client:compile, client:compile 

我知道该怎么做! 我将添加一个版本给定义的JS!

 lazy val webjarbs = "org.webjars" % "bootstrap" % version.bootstrap / s"${version.bootstrap}/bootstrap.js" minified s"${version.bootstrap}/bootstrap.min.js" dependsOn "jquery.js" commonJSName "bootstrap" 

“哦,不!快!失败!

 [trace] Stack trace suppressed: run last client/compile:resolvedJSDependencies for the full output. [error] (client/compile:resolvedJSDependencies) org.scalajs.core.tools.jsdep.JSLibResolveException: Some references to JS libraries could not be resolved: [error] - Missing JS library: 3.3.6/bootstrap.js [error] originating from: client:compile, client:compile, client:compile, client:compile [error] - Missing JS library: 3.3.6/bootstrap.min.js [error] originating from: client:compile, client:compile, client:compile, client:compile 

GG男孩。

这一遍又一遍,然后我必须开始做

 lazy val bs_sidebar = ( "org.webjars" % "bootstrap-sidebar" % version.bs_sidebar intransitive()) / "js/sidebar.js" dependsOn(s"bootstrap.js", s"bootstrap.min.js") 

现在我甚至没有真的使用webjar,但它有一个名为X的js依赖项,我不能改变…

嗯? 如果我只是做了我曾经做过的事情,但是将没有应用程序的依赖关系构build成一个庞大的文件或者一组文件,然后将其馈入到构build中呢? 我有一个在线的概念certificate,我得到了它的工作(我认为这是https://github.com/wav/material-ui-scalajs-react/blob/master/src/main/scala/wav/web/ muiwrapper / package.scala )几乎工作,给了我这个想法。

我知道npm工作比sbt,好很多sbt,我仍然可以把它放到我的包里。缺点是什么我错过了什么

我赞同你。 一旦应用程序开始对JavaScript库有不平凡的依赖关系, jsDependencies就不会扩展。 这主要是因为WebJars缺less关键特性(就像传递依赖),但也是因为jsDependencies不是一个devise用于扩展的机制。

随着时间的推移,用户已经要求jsDependencies越来越多的function,因为他们想要使用它作为他们的真正的应用程序规模(不pipe这意味着什么)依赖机制。 因此,我们已经在jsDependencies之上修补了越来越多的function/黑客。 结果不是世界上最漂亮的东西,它肯定有缺点。

我实际上鼓励使用npm来解决你的依赖关系,特别是如果你熟悉它并知道如何将它集成到你的工作stream程中。

在我看来,使用networking瓶子的主要优点是不必使用npm。 另外,他们经历了通常的mavenparsing/下载过程,所以虽然不完美,但它只是一个破解pipe道,而不是两个。

无论如何,他们可以是痛苦的。 我在我的scala.js应用程序中有大约30个依赖关系,而且大部分都是用networkingpipe理器来pipe理的。 我发现,一般来说,使用npm webjars和bower webjars可以获得更好的结果,而试图依赖web jar传递依赖关系是愚蠢的。

我的jsDependencies往往是这样的:

 ("org.webjars" % "morrisjs" % "0.5.1" intransitive ()) / "morris.js" minified "morris.min.js" dependsOn "2.1.2/raphael.js", ("org.webjars" % "raphaeljs" % "2.1.2-1" intransitive ()) / "2.1.2/raphael.js" minified "2.1.2/raphael-min.js" 

首先要注意的是,基本上所有依靠的都是版本号。 如果使用得太多,我会将版本提取到一个variables中。 第二件事是intransitive()注解。 虽然我有时可以逃脱,但我发现,明确保持工作和头发的地方。

我倾向于坚持前端友好的软件包,如反应和angular度。 一些新的反应库有几十个传递依赖,试图使用它们将是痛苦的。 我避免那些= p