【问题标题】:gulp-file-include and jade nesting problemsgulp-file-include 和玉嵌套问题
【发布时间】:2015-01-19 06:16:34
【问题描述】:

我正在自学 Gulp,但在使用 gulp-file-includeJade 时遇到了问题——这依赖于正确的标记缩进。

gulp-file-include 成功包含了部分(用于页脚和导航等),但是当包含这些部分时会弄乱翡翠的缩进。显然,缩进错误的 Jade 文件会生成错误嵌套的 HTML。

app/index.jade

body
   ul.navbar
      h1.logo
        | Logo

    .container
      | Lorem Ipsum...

    .footer
      @@include('./_footer.jade')

app/_footer.jade

.footer-content
  | hello
  a(href) my link

app/gulpfile.js

var gulp = require('gulp');
var fileinclude = require('gulp-file-include');


return gulp.src('./index.jade')
    .pipe(fileinclude({
      prefix: '@@',
      basepath: '@file'
    }))
    .pipe(gulp.dest('dist/'));
});

输出

body
  ul.navbar
    h1.logo
      | Logo

  .container
     | Lorem Ipsum...

  .footer
    .footer-content
  | hello
  a(href) my link

@@include('./_footer.jade') 在代码中明显嵌套.footer,但_footer.jade 的内容在外部呈现。

如果有人有使用此 gulp-file-include 插件和模板语言的经验,我很想听听您是如何解决它的!

【问题讨论】:

  • gulp-file-include 旨在解析 HTML,使模板缩进难以使用(不可能?)。在gulp-file-include 在第二个任务中编译部分内容之前,我采用了将模板编译为 HTML 的方法。见答案。

标签: javascript gulp


【解决方案1】:

我在使用gulp-slimgulp-file-include 时遇到了类似的[但不同的] 问题。但是,我首先使用 gulp 编译 HTML 模板,并使用 slim 的输出文件夹作为 gulp-file-include 的 src HTML。这意味着 gulp-file-include 会插入真实的 HTML 而不是苗条的模板。

您可以猜到,缩进不再是这种方法的问题,但我确实遇到了其他必须解决的问题。

如果我的代码如下所示:

.div-wrapper
  | @@include('./dist/templates/_header.html')
  | @@include('./dist/templates/_nav.html')

它将文本节点编译为一行,例如:

@@include('./dist/templates/_header.html')@@include('./dist/templates/_nav.html')

gulp-file-include 不喜欢同一行的指令(我相信)并引发错误。我通过在它们之间放置一个一次性 div 来解决这个问题。

.div-wrapper
  | @@include('./dist/templates/_header.html')
  .delete
  | @@include('./dist/templates/_nav.html')

现在输出将文本节点呈现为多行,并且 gulp-file-include 正确地插入部分内容,缩进不是问题。

但是,为了让它正常工作,我必须正确使用 gulps 依赖链。这意味着所有任务不能同时触发,你需要明确地让模板语言先做它的事情,然后让 gulp-file-include 做它的事情。

我正在打开一个问题,看看 gulp-file-include 是否可以通过在同一行包含多个包含来放松...因为那样生活会容易得多。

我的 gulpfile 的相关部分是:

var gulp         = require('gulp');

var fileInclude  = require('gulp-file-include');
var livereload   = require("gulp-livereload");
var prettify     = require('gulp-prettify');
var slim         = require("gulp-slim");
var watch        = require('gulp-watch');

var slimFiles = "./_pre-assets/slim/*.slim";
var slimOutput = "./dist/templates";

gulp.task('slim', function(){
  return gulp.src(slimFiles)
    .pipe(slim({
      pretty: true
    }))
    .pipe(gulp.dest(slimOutput));
});

var htmlDist = "./dist/html";
var htmlTemplates = [
  './dist/templates/home.html',
  './dist/templates/standard.html',
]

gulp.task('fileInclude', ['slim'], function(){
  return gulp.src(htmlTemplates)
    .pipe(fileInclude({
      basepath: '@root'
    }))
    .pipe(gulp.dest(htmlDist));
});

var htmlDistFiles = "./dist/html/*.html"

gulp.task('prettify', ['fileInclude'], function(){
  return gulp.src(htmlDistFiles)
    .pipe(prettify())
    .pipe(gulp.dest('./dist/html/clean'));
});

gulp.task('watch', function(){
  livereload.listen();
  gulp.watch(slimFiles, ['slim', 'fileInclude', 'prettify']);

  var watchDirs = [
    './dist/css/**',
    './dist/javascript/**',
    './dist/html/**',
  ]

  gulp.watch(watchDirs).on('change', livereload.changed);
});

gulp.task('default', ['watch']);

它可能会更干净一些,但你明白了......我也在从sassbabel 编译并使用express 运行本地服务器,如果有任何兴趣的话。抱歉,此代码未经测试。

【讨论】:

  • 请注意,与使用为此应用程序结构设计的工具(如 Ruby Middleman Gem)相比,这很费力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多