在 ScalaJs sbt 构建中,使用 webjars 代替 npm 或带 'Provided' 的 bower 有什么优势吗?

In a ScalaJs sbt build, is there any advantage to use webjars instead of npm or bower with 'Provided'?

当我几个月前第一次发现 webJars 时,我非常怀疑它是否是一种可行的处理客户端依赖关系的方法,因为其中一些 builds/buildsystems 非常复杂,并且考虑到js 文件的发布频率。第二个问题当然没有充分的根据,但在花了将近 36 个小时试图获得大约 10 个 scss/css/less 类型的 webJar 和 8 个 JS webJar 以生活在一个 jsDependencies屋顶。

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

1。 "Oh nos! fastOptJS failed because there was some random file that was also named the same as a dependency in the 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

2。我知道要做什么!我给定义好的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"

3。 "Oh no! fastOptJS failed!"

[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 依赖项,我无法更改它...

问题

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

我知道 npmsbt, 效果好很多,我仍然可以将它放入我的包中...有什么缺点,我是否遗漏了一些关于 sbt 的东西?

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

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

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

在我看来,使用 web jar 的主要优点是不必使用 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() 注释。虽然有时我可以在没有它的情况下逃脱,但我发现直截了当可以让事情顺利进行,而且我的头发也能保持原样。

我倾向于坚持前端友好的包,如 React 和 angular。一些新的 React 库有几十个传递依赖项,尝试使用它们会很痛苦。我避免那些 =p