我有一个相当具体的问题:我正在尝试使用 Sails.js 和 machinepack-sailsgulpify 构建一个复杂的堆栈。
为了将资产注入我的模板,我使用gulp-inject
插件,正如机器包所建议的那样。问题是除此之外的任何东西html
,ejs
注射器都不起作用。它根本不会改变任何东西。没有错误,什么都没有。
我的任务如下所示:
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
取决于模板语言。
添加自定义转换功能不起作用。如果我使用ejs
orhtml
或真的任何类似于 html 语法的东西,它就可以正常工作。
现在,关于 Sails:我不能在注入之前添加一个 gulp 任务来编译模板,因为 Sails 在开发中根据请求呈现模板,它实际上并没有将它们预编译到任何目录中。老实说:我为什么要这样做?注入只是在我的 .jade/.pug 文件中添加行views
,这些文件已经存在,所以我不明白为什么那里有问题。有人可以建议吗?
更新:
相当令人沮丧的代码检查显示,运行inject
函数时的“匹配”属性长度为 0,并且content
在节点检查器中检查流时,我没有看到注释,它们被剥离了,尽管事实上它们清楚地存在于文件中。
更新#2: 看来我对 ejs 的看法是错误的。仅处理 HTML 文件。当它没有检测到注入评论时,它也可以正常工作。但是,如果它执行了 end 事件,则根本不会为该文件发出任何内容,并且不会注入任何内容。这适用于所有模板引擎,只有静态 HTML 文件的注入工作正常。
更新#3:
经过另外 5 个小时的调试后,我发现了问题,但是我对流的理解还不足以让我更接近解决方案。问题是,在inject
插件的功能中,有一个循环没有正确退出,虽然它完美地将所需的标签注入到流中,然后它在同一个流上再次运行该循环(使用注入的标签),并抛出一个错误。
为什么该错误从未出现在我不知道的任何控制台中,但你去了。有人可以帮忙吗?我完全迷失了……这是插件中的错误吗?