问题 在ScalaJs sbt构建中,使用webjars而不是使用'提供'的npm或bower是否有任何优势?


几个月前,当我第一次发现webJars时,我非常怀疑,鉴于其中一些构建/构建系统的巨大复杂性,并考虑到频率,它将成为处理客户端依赖关系的可行方式。 js 文件已发布。第二个问题当然没有充分根据,但是我在第一次担心后,在花了近36个小时后现在试图徒劳地获得大约10 scss/css/less-type webJars和8个JS webJars住在一个 jsDependencies 屋顶。

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

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"

“哦,不!fastOptJS失败了!”

[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,但它有一个 JS名为X的依赖,我无法改变...

嗯?如果我只是做了我以前做的事情但是在没有应用程序的情况下将依赖关系构建到一些巨大的文件或文件集中,然后将其提供给构建中,该怎么办?我有一个在线概念证明,我得到了它的工作(我认为它是 https://github.com/wav/material-ui-scalajs-react/blob/master/src/main/scala/wav/web/muiwrapper/package.scala )几乎工作,并给了我这个想法。

我知道 npm 工作得比很好 sbt, 我仍然可以把它放进我的包里......有什么缺点,而且 我错过了一些关于sbt的事情


8728
2018-04-24 15:18


起源



答案:


我赞同你。一旦应用程序开始对JavaScript库具有非平凡的依赖性, jsDependencies 不规模。这主要是因为WebJars缺少关键功能(就像传递依赖性一样),但也因为 jsDependencies 不是一种旨在扩展的机制。

随着时间的推移,用户要求提供越来越多的功能 jsDependencies,因为他们希望将它用作真正的应用程序规模(无论这意味着什么)依赖机制。因此,我们一直在修补越来越多的功能/黑客 jsDependencies。结果不是世界上最漂亮的东西,它肯定有缺点。

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


11
2017-09-17 17:48



怎么样 最近宣布了scalajs-bundler 适合这个?继续前进,或者对于非平凡的应用程序,您应该从jsDependencies迁移到npmDependencies? - Grogs
预计大多数复杂的构建最终会转向更有原则的东西 jsDependencies。 npmDependencies 绝对是一种选择。 - sjrd


答案:


我赞同你。一旦应用程序开始对JavaScript库具有非平凡的依赖性, jsDependencies 不规模。这主要是因为WebJars缺少关键功能(就像传递依赖性一样),但也因为 jsDependencies 不是一种旨在扩展的机制。

随着时间的推移,用户要求提供越来越多的功能 jsDependencies,因为他们希望将它用作真正的应用程序规模(无论这意味着什么)依赖机制。因此,我们一直在修补越来越多的功能/黑客 jsDependencies。结果不是世界上最漂亮的东西,它肯定有缺点。

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


11
2017-09-17 17:48



怎么样 最近宣布了scalajs-bundler 适合这个?继续前进,或者对于非平凡的应用程序,您应该从jsDependencies迁移到npmDependencies? - Grogs
预计大多数复杂的构建最终会转向更有原则的东西 jsDependencies。 npmDependencies 绝对是一种选择。 - sjrd


在我看来,使用网络罐子的主要优点是不必使用npm。此外,他们会经历通常的maven解决方案/下载过程,因此虽然它并不完美,但它只是一个破损管道而不是两个。

无论如何,他们可能会痛苦。我的scala.js应用程序中有大约30个依赖项,并且它们主要通过Web jar进行管理。我发现,一般来说,使用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"

首先要注意的是版本号基本上都是依赖于所有依赖的东西。如果它被大量使用,我将版本提取到变量中。第二件事是 intransitive() 注解。虽然我有时可以在没有它的情况下离开,但我发现明确保持工作和头发到位。

我倾向于坚持前端友好的包装,如反应和角度。一些新的反应库有许多传递依赖,尝试使用它们会很痛苦。我避免那些= p


3
2017-09-17 22:09