【问题标题】:Gulp using gulp-jade with gulp-dataGulp 使用 gulp-jade 和 gulp-data
【发布时间】:2015-02-03 11:00:54
【问题描述】:

我正在尝试在我的工作流程中将 gulp-data 与 gulp-jade 一起使用,但我遇到了与 gulp-data 插件相关的错误。

这是我的 gulpfile.js

var gulp = require('gulp'),
  plumber = require('gulp-plumber'),
  browserSync = require('browser-sync'),
  jade = require('gulp-jade'),
  data = require('gulp-data'),
  path = require('path'),
  sass = require('gulp-ruby-sass'),
  prefix = require('gulp-autoprefixer'),
  concat = require('gulp-concat'),
  uglify = require('gulp-uglify'),
  process = require('child_process');

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

  // Watch task
  gulp.task('watch', function() {
    gulp.watch('*.jade', ['jade']);
    gulp.watch('public/css/**/*.scss', ['sass']);
    gulp.watch('public/js/*.js', ['js']);
  });

  var getJsonData = function(file, cb) {
    var jsonPath = './data/' + path.basename(file.path) + '.json';
    cb(require(jsonPath))
  };

  // Jade task
  gulp.task('jade', function() {
    return gulp.src('*.jade')
    .pipe(plumber())
    .pipe(data(getJsonData))
    .pipe(jade({
      pretty: true
    }))
    .pipe(gulp.dest('Build/'))
    .pipe(browserSync.reload({stream:true}));
  });

  ...

  // Browser-sync task
  gulp.task('browser-sync', ['jade', 'sass', 'js'], function() {
    return browserSync.init(null, {
    server: {
      baseDir: 'Build'
    }
  });
});

这是一个基本的 json 文件,名为 index.jade.json

{
  "title": "This is my website"
}

我得到的错误是:

Error in plugin 'gulp-data'
[object Object]

【问题讨论】:

    标签: json node.js pug gulp


    【解决方案1】:

    您收到错误是因为在getJsonData 中您将所需数据作为第一个参数传递给回调。这是为可能的错误保留的。

    在您的情况下,不需要回调。看看gulp-data usage example 这应该可以工作:

    .pipe(data(function(file) {
      return require('./data/' + path.basename(file.path) + '.json');
    }))
    

    完整示例:

    var gulp = require('gulp');
    var jade = require('gulp-jade');
    var data = require('gulp-data');
    var path = require('path');
    var fs   = require('fs');
    
    gulp.task('jade', function() {
      return gulp.src('*.jade')
        .pipe(data(function(file) {
          return require('./data/' + path.basename(file.path) + '.json');
        }))
        .pipe(jade({ pretty: true }))
        .pipe(gulp.dest('build/'));
    });
    

    如果您在 gulp.watch 上运行任务,请使用此选项:

    .pipe(data(function(file) {
      return JSON.parse(fs.readFileSync('./data/' + path.basename(file.path) + '.json'));
    }))
    

    【讨论】:

    • 我不再收到错误消息,但如果我在 index.jade 中键入 p= title,我在生成的 html 文件中只会得到一个空的 p 标记。我检查了 gulp-jade 文档,我使用 geJsonData 变量的原因是因为他们推荐 here
    • 这很奇怪。这个对我有用。 gulp-jade 中的示例已过时。
    • 刚刚发现它实际上正在工作,但只有当我在终端中运行 gulp 命令时。有没有办法在任务运行时获取对象内容并实时注入数据?
    • 我不明白这个问题。您还如何运行 gulp 任务?
    • 抱歉我的新手问题,感谢您帮助我。现在我输入gulp,我开始输入p Hello World,点击cmd+s,输出的html文件得到p标签及其内容。但是,如果我输入 p= title 以在生成的文件中获取它,我必须点击 ctrl+c 来停止 gulp,然后再次运行 gulp。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多