grunt-usemin块path不相对于html文件?

在grunt-usemin的configuration和使用的各个点上,如何处理path有许多麻烦。

我有下面的回购布局,其中回购根也将是Web应用程序的根:

/dashboard/index.html /Gruntfile.js /vendor/...some 3rd party CSS and JS... 

所以index.html文件 – > somedomain.com/dashboard/index.html。

index.html文件包含来自/ vendor文件夹的一些CSS和JS资源。 我有咕噜configuration将生成输出到生成文件夹中:

 /build/dashboard/index.html 

在index.html文件中,我使用了包含所有CSS链接和JS脚本标签的usemin块:

 <!-- build:css(.) app.min.css --> <!-- build:js(.) app.min.js --> 

我必须用“(。)”指定一个“替代searchpath”,这样“/vendor/backbone.js”的脚本标签才能在正确的位置find它。 直到我这样做,它正在寻找/dashboard/vendor/backbone.js。

我希望处理CSS / JS资源的输出被输出到build / dashboard / app.min.css和build / dashboard / app.min.js,并且被index.html使用一个简单的相对“app.min”来包含。 css / js“path。

问题是,grunt-usemin似乎在使用我为两个上下文指定的“app.min。*”path,这使得它们无法一起工作:

1)为了创build文件而将path视为相对于构build目录; 该文件最终在build / app.min.css和build / app.min.js。

2)为了生成新的链接/脚本标签,将path视为相对于index.html文件; 浏览器加载build / dashboard / index.html,然后尝试加载映射到build / dashboard / app.min.css的“app.min.css”。

有解决scheme吗?

我真的很晚参加了派对,但是我对这个问题也感到非常沮丧,没有find任何令人满意的解决方法或解决办法。 所以我制定了一些非常肮脏的技巧,希望能更好地解决这个问题。 所以我想和你分享一下。

首先,让我们快速回顾一下为什么会发生这个问题。 当usemin生成输出JS / CSS文件时,它会在你的dest目录和在你的usemin块中指定的输出目录之间执行一个简单的path连接。 所以如果destbuild和usemin块是

 <!-- build:css(.) app.min.css --> 

然后它joinbuildapp.min.css吐出build/app.min.css输出文件

但是usemin任务只是简单地replace块中的path

 <link rel="stylesheet" href="app.min.css"/> 

由于您的HTML文件位于build/dashboard/index.html之下,因此现在链接了错误的目录

所以我的工作围绕这个想法:如果dest目录是相对于HTML文件的位置? 这不是解决这个问题吗? 所以给了上面的例子,如果destbuild/dashboard呢? 你可以看到它会吐出输出文件的位置并正确地链接它。 请记住,您应该创build一个复制任务来复制HTML文件,因此请确保您的HTML文件像以前一样复制到build/dashboard/index.html

当然,下一个问题是如果我有HTML文件在多个目录? 如果为HTML文件可能驻留的每个目录创build一个useminPrepare目标,那么这会不会是非常痛苦和不直观的? 这就是为什么我创build一个非常特别的咕task任务,只是为了解决这个问题,而我正在创build自己的咕噜脚手架。 我把它称为useminPreparePrepare是的,它被故意地命名为愚蠢的,因为我希望有一天,当usemin人为这个问题做出实际的修复时,完全删除这个事情。

顾名思义,这是一个准备useminPrepareconfigs的任务。 它正是我上面所描述的。 它的所有configuration镜像useminPrepareconfiguration(事实上,其中大部分只是复制到useminPrepare),但有一个例外:您需要指定一个src目录来标识所有源的根目录,以便它可以生成相对path到HTML文件。 所以在你的例子src: "." 会没事的。 要使用useminPreparePrepare,首先将它导入到你的版本(你可能想复制粘贴我的代码,我不介意),将你的useminPrepare任务重命名为usePrePrePrepare并添加刚才提到的src属性。 确保你运行useminPreparePrepare任何你喜欢的目标,然后立即运行useminPrepare而不指定目标,以便它的所有目标都运行。 这是因为useminPreparePrepare将为每个目录生成一个相对于HTML文件所在的目标,并将其复制到您运行的useminPreparePrepare目标的configuration中。 这样,你的configuration可以简单地查找所有的HTML文件。

 "useminPreparePrepare": { // Search for HTML files under dashboard even though src is . // because we want to avoid including files generated under build directory. html: "dashboard/**/*.html", options: { src: ".", dest: "build", ... "usemin": { html: ["build/**/*.html"], ... "copy": { html: { files: [{ expand: true, src: ["dashboard/**/*.html"], dest: "build" } ] }, ... 

希望这可以帮助! 祝你有美好的一天。

编辑:我意识到,鉴于上面的例子,如果你实际上包括当前目录中的所有HTML文件,你也将包括生成的HTML文件,如果他们没有提前清理。 所以要么在他们之前清理它们,要么在dashboard目录下查看。 我build议分离srcdest目录,以便configuration可以看起来更直观。

我不喜欢它,但是我发现到目前为止工作的唯一方法是指定一个完整的path:

 <!-- build:css(.) /dashboard/app.min.css --> <!-- build:js(.) /dashboard/app.min.js --> 

在index.html(这是我想要的地方)和/ index.html中的app / *文件的引导结果是index / index.html,而index.html则以下面的标签结尾:

 <link rel="stylesheet" href="/dashboard/app.min.css"> <script src="/dashboard/app.min.js"></script> 

这意味着仪表板应用程序现在已经清楚地意识到它在整体中的位置,所以您不能只更名或重新定位它在树中的位置而不更新这些path。