如何将 gulp 模板代码与下划线模板代码分开?

How can I separate gulp-template code from underscore template code?

我正在使用 gulp 构建我的项目,我的部分项目使用了 Underscore 模板。我在构建过程中使用的插件之一是 gulp-template,它使用 Lodash 模板。

是否可以指示当我使用 gulp 时应呈现哪些代码,以及哪些代码应在模板中忽略?

例如,我有一个包含以下内容的文件:

<script src="<%= image_server_url %>/scripts/iep-alert/alert-content.js"></script>

在构建期间,我希望 image_server_url 被渲染。然而,在我项目的其他地方,我有这段代码,我想被 gulp-template 插件忽略:

<%
    if(alert.disability === "true") {
%>
    <li><span style="font-weight: bold;">Disability: </span><%= alert.disability %></li>
<%
    }
%>

现在,当我调用调用 gulp-模板的 gulp 任务时,我得到 ReferenceError: alert is not defined 因为 gulp-模板的上下文不包括alert -- 只有 image_server_url 是 gulp-模板上下文的一部分。

编辑:我编辑了我的代码以匹配 {{ image_server_url}},并将我对 gulp-template 的调用更改为如下所示:

template({
    image_server_url: config.dev.image_server_url
}, {
    interpolate: /{{([\s\S]+?)}}/g
})

通过这些更改,当我 运行 我的 build 任务时,我认为 gulp-template 仍在尝试 运行 在 <%%> 块,因为我得到这个错误:

window is not defined

它试图在第一个 <% JS block %>

中 运行 的代码
<%
    if (window.location.href.indexOf('admin') != -1) {
%>

如果有人能解决这个特定问题,那就太好了。我想现在我要研究一个替代解决方案。

我找不到合理的方法来执行此操作,因为您想解析 same 模板 twice,只有一些字符串必须在 gulp 中插入,其他在浏览器中插入。

一个建议是使用_.templateSettings,这样在gulp处理的时候,可以使用另一种模板格式。

例如 gulp,您可以设置:

_.templateSettings.interpolate = /{{([\s\S]+?)}}/g;

在您的模板中:

<script src="{{ image_server_url }}/scripts/iep-alert/alert-content.js">

因此,当模板打算由 gulp 处理时,使用 {{}} 插值语法,当它打算在浏览器端处理时,使用默认的 (erb) <%= %>语法。

我最终使用了 gulp-preprocess 插件。我的代码现在看起来像这样,到目前为止运行良好。

<script src="<!-- @echo IMAGE_SERVER_URL -->/scripts/iep-alert/alert.js"></script>