使用Gulp + Browserify时出现“Object #<Readable> has no method 'write'”错误

7

当按照 Gulp.js 代码库中的 示例 进行操作时,出现错误:

[12:27:31] Using gulpfile C:\GH\riot-tag-build\Gulpfile.js
[12:27:31] Starting 'browserify'...

_stream_readable.js:602
    var written = dest.write(chunk);
                       ^
TypeError: Object #<Readable> has no method 'write'
    at write (_stream_readable.js:602:24)
    at flow (_stream_readable.js:611:7)
    at _stream_readable.js:579:7
    at process._tickCallback (node.js:442:13)

我尝试修改源代码以满足我的需求,这是我正在努力运行的Gulpfile文件,但并没有成功。

var gulp = require('gulp');
var browserify = require('browserify');
var riotify = require('riotify');
var transform = require('vinyl-transform');
var buffer = require('gulp-buffer');

gulp.task('browserify', function () {
  // set up the browserify instance on a task basis
  var b = browserify({debug: true});
  // transform regular node stream to gulp (buffered vinyl) stream
  var browserified = transform(function(filename) {
    b.add(filename);
    return b.bundle();
  });

  return gulp.src('./main.js')
    .pipe(browserified)
    .pipe(gulp.dest('./dist/'));
});

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

整个示例可以在这里找到。

有什么想法,为什么流可能是只读的?任何帮助都将不胜感激。


请再次检查食谱--在您发布这个问题后不久,它已经被更新。根据更新的食谱,@ddprrt的答案看起来是正确的。 - Jake Boone
我不确定我理解'./entry.js'和'.pipe(source('app.js'))'这部分的含义。在旧版本中,源文件只被指定一次:'./app.js'。但是在新版本中,引入了entry.js。那个文件是什么,为什么要涉及它? - Dtipson
2个回答

9
我遇到了同样的问题。后来我找到了解决方法。你只需要将 "browserify" 版本降级到最新的 9.0.4 版本,一切都会正常的。你可以参考提交历史记录。

https://github.com/substack/node-browserify/commits/master

====更新====

我解决了这个错误。我使用了“through2”,代码如下。

gulp.src('./src/index.js')
    .pipe(through2.obj(function (file, enc, next){
            browserify(file.path)
                .bundle(function(err, res){
                    // assumes file.contents is a Buffer
                    file.contents = res;
                    next(null, file);
                });
        }))
    .pipe(gulp.dest('./build/'))

这个解决方案来自于这个问题。

https://github.com/substack/node-browserify/issues/1044


感谢您发布这篇文章。使用 browserify 9.0.4 的提示非常好。但是必须要使用 9.0.4 版本,例如 9.0.8 版本同样无法正常工作。您可以在 package.json 文件中设置 "browserify": "9.0.4" 来实现此目的,或者通过终端安装时输入命令:npm install browserify@9.0.4 - damir

4

我不确定vinyl-transform是否适用,但我猜测使用browserify的正确方式是将其作为起点,然后将流转换为vinyl对象。至少这就是在配方中写的。

var gulp       = require('gulp'),
    source     = require('vinyl-source-stream'),
    browserify = require('browserify');

gulp.task('browserify', function () {
  return browserify({
    debug: true,
    entries: ['./main.js']
  }).bundle()
    .pipe(source('main.bundle.js'))
    .pipe(gulp.dest('./dist/'));
});

你的例子运行得很顺利,谢谢!我会等待其他答案,可能能够解释这个原始问题,但如果没有什么显示出来,那么我将接受这个答案。我想学习链接食谱中的内容。 - Tx3
如何在 browserify 对象中定义转换,例如:browserify({transform:[riotify]})。https://github.com/gulpjs/gulp/blob/master/docs/recipes/browserify-transforms.md ... 除了我自己也遇到同样的问题... - user3340677
@user3340677 我已经在我贴出的示例中尝试过了:var b = browserify({debug: true, transform: ['riotify'] }); 但是它没有起作用。下面的转换是 vinyl-transform,这是完全不同的东西。 - Tx3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接