首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包插件(它使用through2)输出的字符串

包插件(它使用through2)输出的字符串
EN

Stack Overflow用户
提问于 2016-12-25 21:40:57
回答 2查看 871关注 0票数 1

我想知道如何准确地操作我的Gulp插件的输出,因此,例如,不管有多少文件被传递给插件,它都会用一个字符串包装输出。目前,我无法知道最后一个文件是什么时候完成的。

下面这个超级简化的示例将迭代3个文件,并创建一个名为output.js的新文件,其中字符串xxx (xxxxxxxxx)将是字符串的三倍。

我希望插件本身包装内容,以便输出为:+xxxxxxxxx+

我该怎么做?谢谢!

格尔普文件

代码语言:javascript
复制
var gulp        = require('gulp');
var concat      = require('gulp-concat');
var foo         = require('./index');

gulp.task('default', function() {
    gulp.src([a.html, b.html, c.html])
        .pipe(foo())
        .pipe(concat('output.js'))
        .pipe(gulp.dest('./test/output'))
});

最基本的gulp插件(index.js):

代码语言:javascript
复制
var through2 = require('through2'),
    gutil    = require('gulp-util');

var PLUGIN_NAME = 'foo';

module.exports = function( options ){
    // through2.obj(fn) is a convenience wrapper around
    // through2({ objectMode: true }, fn)
    return through2.obj(function( file, enc, callback ){
        file.contents = new Buffer( 'xxx' );

        this.push(file);
        callback();
    });
}

我知道当前文件只是简单地被修改了,但是我不理解的是如何附加文本并返回我想要的连接结果,同时让它与Gulp工作标准保持一致。

“真正的”插件实际上应该用以下方式包装文件结果:

代码语言:javascript
复制
var foo = { FILES_CONTENT }

其中,FILES_CONTENT实际上是所有文件的级联字符串:

代码语言:javascript
复制
"file_name" : "file_content",
"file_name" : "file_content",
...
EN

回答 2

Stack Overflow用户

发布于 2016-12-28 17:27:34

我将对您的gulpfile.js做以下更改

代码语言:javascript
复制
var gulp        = require('gulp');
var foo         = require('./index.js');

gulp.task('default', function() {
   return gulp.src(['a.html', 'b.html', 'c.html'])
     .pipe(foo({fileName:'output.js', varName:'bar'}))
     .pipe(gulp.dest('./test/output'))
});

由于您的foo()插件本身将连接所有文件,因此根本不需要使用gulp-concat。相反,您的插件应该接受一个选项fileName,它提供生成文件的名称。我还添加了另一个选项varName,它将在输出文件中提供var的名称。

我假设a.htmlb.htmlc.html是简单的HTML文件,如下所示:

代码语言:javascript
复制
<h1 class="header">a</h1>

正如您已经意识到的,您需要连接插件本身中的所有文件。但是,这并不困难,也不需要大量代码。下面是一个index.js,它正是这样做的:

代码语言:javascript
复制
var through2 = require('through2'),
    gutil    = require('gulp-util'),
    path     = require('path'),
    File     = require('vinyl');

var PLUGIN_NAME = 'foo';

module.exports = function(options) {
  var files = { };
  var outputFile = null;
  return through2.obj(function(file, enc, callback){
    outputFile = outputFile || file;
    var filePath = path.relative(file.base, file.path);
    files[filePath] = file.contents.toString();
    callback();
  }, function(callback) {
    outputFile = outputFile ? outputFile.clone() : new File();
    outputFile.path = path.resolve(outputFile.base, options.fileName);
    outputFile.contents = new Buffer(
      'var ' + options.varName + ' = ' +
      JSON.stringify(files, null, 2) + ';'
    );
    this.push(outputFile);
    callback();
  });
}

由于您希望输出从文件名到文件内容的键/值映射,所以我们的transformFunction只将这两个东西存储在一个常规的JavaScript对象files中。没有发出任何输入文件。他们的名字和内容只是储存,直到我们所有的。

唯一棘手的部分是确保我们尊重每个文件的.base属性,这是吞咽插件的习惯。这允许用户使用选项中的gulp.src()提供自定义基本文件夹。

处理完所有文件后,through2调用flushFunction。在这里,我们使用提供的fileName创建输出文件(再次确保尊重.base属性)。

然后,创建输出文件内容只需使用files序列化我们的JSON.stringify()对象(这将自动处理必须执行的任何转义操作)。

生成的./test/output/output.js将如下所示:

代码语言:javascript
复制
var bar = {
  "a.html": "<h1 class=\"header\">a</h1>\n",
  "b.html": "<h1 class=\"header\">b</h1>\n",
  "c.html": "<h1 class=\"header\">c</h1>\n"
};
票数 3
EN

Stack Overflow用户

发布于 2016-12-26 06:08:28

你应该使用吞咽管道技术(标准)。这意味着您可以使用吞口插入包来添加字符串xxx。

代码语言:javascript
复制
var insert = require('gulp-insert');

.pipe(insert.append('xxx')); // Appends 'xxx' to the contents of every file

您还可以使用此包进行预置、附加和包装,当然,它支持gulp标准。

因此,完整的例子将是:

代码语言:javascript
复制
var gulp        = require('gulp');
var concat      = require('gulp-concat');
var foo         = require('./index');
var insert      = require('gulp-insert');
gulp.task('default', function() {
    gulp.src([a.html, b.html, c.html])
        .pipe(foo()
        .pipe(insert.append('xxx'))
        .pipe(concat('output.js'))
        .pipe(gulp.dest('./test/output'))
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41324710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档