gulp-inject:使用哈巴狗

时间:2016-05-25 21:35:51

标签: node.js gulp sails.js pug gulp-inject

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

为了将资产注入我的模板,我使用gulp-inject插件,正如machinepack建议的那样。问题是除了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

取决于模板语言。

添加自定义转换功能不起作用。如果我使用ejshtml或任何类似于html语法的内容,则可以正常使用。

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

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

更新#2: 看来我对ejs错了。只处理HTML文件。当它没有检测到注射注释时,它也可以正常工作。但是,如果它发生了结束事件,则根本不会为该文件发出任何内容,也不会注入任对于所有模板引擎都是如此,只有静态HTML文件才能使注入工作正常。

更新#3: 经过另外5个小时的调试后我发现了问题,但是我对流的理解并不足以让我更接近解决方案。问题是在插件的inject函数中有一个没有正确退出的循环,虽然它完美地将所需的标签注入到流中,然后它再次运行该循环流(带注入标签),并抛出错误。 Debugger at the fault point 为什么这个错误永远不会出现在我不知道的任何控制台中,但是你去了。有人可以帮忙吗?我完全迷失了...这是插件中的错误吗?

1 个答案:

答案 0 :(得分:0)

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

//SCRIPTS
//SCRIPTS END

正则表达式将匹配starttag//SCRIPTS两次: regex result

结束标记只会匹配一次。这导致第二个错误循环,错误结束标记错误。

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

//SCRIPTS
//END SCRIPTS

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

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