0

我有一个相当具体的问题:我正在尝试使用 Sails.js 和 machinepack-sailsgulpify 构建一个复杂的堆栈。

为了将资产注入我的模板,我使用gulp-inject插件,正如机器包所建议的那样。问题是除此之外的任何东西htmlejs注射器都不起作用。它根本不会改变任何东西。没有错误,什么都没有。

我的任务如下所示:

gulp.task('sails-linker-gulp:devViews', function() {
    return gulp.src('views/**/*.?(html|ejs|jade|pug|haml|slim|dust)') // Read templates
      .pipe(
        plugins.inject(
          gulp.src(require('../pipeline').jsFilesToInject, {read: false}), // Link the javaScript
          {
            starttag: generateScriptStartTag,
            endtag: generateScriptEndTag,
            ignorePath: '.tmp/public',
            transform: (filepath, file, i, length) => {
              return `script(src="${filepath}")`;
            }
          }
        )
      )
      .pipe(
        plugins.inject(
          gulp.src(require('../pipeline').cssFilesToInject, {read: false}), // Link the styles
          {
            starttag: generateStyleStartTag,
            endtag: generateStyleEndTag,
            ignorePath: '.tmp/public'
          }
        )
      )
      .pipe(
        plugins.inject(
          gulp.src( ['.tmp/public/jst.js'], {read: false}), // Link the JST Templates
          {
            starttag: generateTemplateStartTag,
            endtag: generateTemplateEndTag,
            ignorePath: '.tmp/public'
          }
        )
      )
      .pipe(gulp.dest('views/'))// Write modified files...

不用担心generateScriptStartTag这些功能,它们只是用来控制的,我 1000% 确信它们可以正常工作,经过大量测试。他们生成的标签是这样的:

//- SCRIPTS
//- SCRIPTS END

取决于模板语言。

添加自定义转换功能不起作用。如果我使用ejsorhtml或真的任何类似于 html 语法的东西,它就可以正常工作。

现在,关于 Sails:我不能在注入之前添加一个 gulp 任务来编译模板,因为 Sails 在开发中根据请求呈现模板,它实际上并没有将它们预编译到任何目录中。老实说:我为什么要这样做?注入只是在我的 .jade/.pug 文件中添加行views,这些文件已经存在,所以我不明白为什么那里有问题。有人可以建议吗?

更新: 相当令人沮丧的代码检查显示,运行inject函数时的“匹配”属性长度为 0,并且content在节点检查器中检查流时,我没有看到注释,它们被剥离了,尽管事实上它们清楚地存在于文件中。

更新#2: 看来我对 ejs 的看法是错误的。仅处理 HTML 文件。当它没有检测到注入评论时,它也可以正常工作。但是,如果它执行了 end 事件,则根本不会为该文件发出任何内容,并且不会注入任何内容。这适用于所有模板引擎,只有静态 HTML 文件的注入工作正常。

更新#3: 经过另外 5 个小时的调试后,我发现了问题,但是我对流的理解还不足以让我更接近解决方案。问题是,在inject插件的功能中,有一个循环没有正确退出,虽然它完美地将所需的标签注入到流中,然后它在同一个流上再次运行该循环(使用注入的标签),并抛出一个错误。 故障点调试器 为什么该错误从未出现在我不知道的任何控制台中,但你去了。有人可以帮忙吗?我完全迷失了……这是插件中的错误吗?

4

1 回答 1

1

我必须自己解决这个问题。这是gulp-inject. 该插件生成的用于测试注入标签的正则表达式与整行不匹配,它只是匹配第一次出现。这意味着如果我的标签设置如下:

//SCRIPTS
//SCRIPTS END

正则表达式将匹配starttag://SCRIPTS两次: 正则表达式结果

并且结束标签只会匹配一次。这导致第二个错误循环出现缺少结束标签的错误。

一种解决方法是避免重复开始标记。

//SCRIPTS
//END SCRIPTS

然而,这不是一个解决方案。一种解决方案是更改正则表达式,以便在使用基于缩进的模板语言时只允许空格和换行符以匹配标记。像这样的东西会起作用:/\/\/-\s*SCRIPTS(?=\s*\n|$)/ig 工作示例

不敢相信直到现在还没有人偶然发现这个问题,似乎这将是一个更常见的问题......

于 2016-05-26T17:19:15.753 回答