首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇怪的gulp --在gulp构建上错误地使用了小型机'file.isNull()‘

奇怪的gulp --在gulp构建上错误地使用了小型机'file.isNull()‘
EN

Stack Overflow用户
提问于 2015-10-18 17:35:49
回答 2查看 3.7K关注 0票数 2

我正在构建一个相对简单的学习relatively /Flux项目。我正在使用(或试图使用) Gulp创建一个具有Browserify、Reactify、Streamify和Uglify的自动构建,所有这些都是通过npm安装的。整个流程都正常工作,我做了一些文件更改,重新构建,现在当我运行构建时,它开始出现错误。即使在恢复更改并返回到原来的工作状态之后。我怀疑可能在某个地方发生了权限更改,但我自己还没有这样做,所以我不知道如何进一步诊断(也不确定是否存在问题)。

我应该补充一点,起初我怀疑乙烯基流错误是问题所在,但是我在构建流中添加了.pipe(buffer())vinyl-buffer,但是它没有改变错误。

这是一大口:

代码语言:javascript
复制
var gulp = require('gulp');
var uglify = require('gulp-uglify');
var htmlreplace = require('gulp-html-replace');
var source = require('vinyl-source-stream');
var buffer = require('vinyl-buffer');
var browserify = require('browserify');
var watchify = require('watchify');
var reactify = require('reactify');
var streamify = require('gulp-streamify');
var gutil = require('gulp-util');

var path = {
    HTML: 'app/index.html',
    MINIFIED_OUT: 'build.min.js',
    OUT: 'build.js',
    DEST: 'dist',
    DEST_BUILD: 'dist/build',
    DEST_SRC: 'dist/src',
    ENTRY_POINT: './app/App.js'
};

gulp.task('build', function(){
    browserify({
        entries: [path.ENTRY_POINT],
        transform: [reactify]
    })
        .bundle()
        .pipe(uglify().on('error', gutil.log))
        .pipe(source(path.MINIFIED_OUT))
        .pipe(buffer())
        .pipe(streamify(uglify(path.MINIFIED_OUT)))
        .pipe(gulp.dest(path.DEST_BUILD));
});

gulp.task('replaceHTML', function(){
    gulp.src(path.HTML)
        .pipe(htmlreplace({
            'js': 'build/' + path.MINIFIED_OUT
        }))
        .pipe(gulp.dest(path.DEST));
});

gulp.task('production', ['replaceHTML', 'build']);

以下是错误:

代码语言:javascript
复制
[09:54:33] Using gulpfile /Library/WebServer/Documents/lldb/gulpfile.js
[09:54:33] Starting 'replaceHTML'...
[09:54:33] Finished 'replaceHTML' after 8.3 ms
[09:54:33] Starting 'build'...
[09:54:33] Finished 'build' after 27 ms
[09:54:33] Starting 'production'...
[09:54:33] Finished 'production' after 7.07 μs
/Library/WebServer/Documents/lldb/node_modules/gulp-uglify/minifier.js:67
    if (file.isNull()) {
             ^

TypeError: file.isNull is not a function
    at DestroyableTransform.minify [as _transform] (/Library/WebServer    /Documents/lldb/node_modules/gulp-uglify/minifier.js:67:14)
    at DestroyableTransform.Transform._read (/Library/WebServer/Documents/lldb/node_modules/gulp-uglify/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js:172:10)
    at DestroyableTransform.Transform._write (/Library/WebServer/Documents/lldb/node_modules/gulp-uglify/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js:160:12)
    at doWrite (/Library/WebServer/Documents/lldb/node_modules/gulp-uglify/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js:326:12)
    at writeOrBuffer (/Library/WebServer/Documents/lldb/node_modules/gulp-uglify/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js:312:5)
    at DestroyableTransform.Writable.write (/Library/WebServer/Documents/lldb/node_modules/gulp-uglify/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js:239:11)
    at Readable.ondata (/Library/WebServer/Documents/lldb/node_modules/browserify/node_modules/read-only-stream/node_modules/readable-stream/lib/_stream_readable.js:572:20)
    at emitOne (events.js:77:13)
    at Readable.emit (events.js:169:7)
    at readableAddChunk (/Library/WebServer/Documents/lldb/node_modules/browserify/node_modules/read-only-stream/node_modules/readable-stream/lib/_stream_readable.js:195:16)

欢迎任何想法-谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-19 06:57:25

注意删除了额外的括号- ()。这会返回它们应该是的引用,而不是js试图调用的函数。在我的代码运行和停止运行之间,额外的()是如何写入isNull和isStream的,这是任何人的猜测(也有点担心)--我没有做这些更改。

它们是引用,是的,但是引用了模块中导出的函数。require('./lib/isNull')返回该模块的导出;导出是一个函数,所以isNull是一个函数。通过删除括号,您现在只检查file.isNull是否为始终为真的内容。

但是,无论如何,你看错了东西。这不是file的来历。file作为参数传递给minify函数。因此,file是一个应该具有isNullisStream方法的对象。

minify函数是用through2调用的,所以如果gulp文件失败了,这可能意味着您做错了什么,可能是顺序错误。不幸的是,错误消息在大多数情况下并没有真正的帮助。

当查看您的吞咽文件时,我注意到您有两个对uglify的调用

代码语言:javascript
复制
.pipe(uglify().on('error', gutil.log))
…
.pipe(streamify(uglify(path.MINIFIED_OUT)))

第一个看起来很好,这是gulp-uglify通常的样子。但第二个问题似乎更像是试图在那里使用原始uglify (而不是gulp-uglify)。这似乎不是一个好主意,而且由于uglify引用的是gulp-uglify,它无论如何都不会起作用。所以最好去掉那条线。

我还建议您看看正式建议如何使用带uglify的浏览器化,并修复uglify()调用的顺序:您应该在buffer()之后调用它。

代码语言:javascript
复制
browserify(…)
    .bundle()
    .pipe(source(path.MINIFIED_OUT))
    .pipe(buffer())
    .pipe(uglify())
    .on('error', gutil.log)
    .pipe(gulp.dest(path.DEST_BUILD));
票数 3
EN

Stack Overflow用户

发布于 2015-10-18 18:51:26

好吧,所以这很奇怪--我会发帖子给任何人评论和/或更新。

按照错误路径,我在gulp-uglify下打开了gulp-uglify文件。第67行(参考文献)错误)显示如下:

代码语言:javascript
复制
if (file.isNull()) {
      return callback(null, file);
    }

    if (file.isStream()) {
      return callback(createError(file, 'Streaming not supported'));
    }

问题是isNull和isStream不是函数-它们是引用。因此,需要将代码更改为:

代码语言:javascript
复制
if (file.isNull) {
      return callback(null, file);
    }

    if (file.isStream) {
      return callback(createError(file, 'Streaming not supported'));
    }

注意删除了额外的括号- ()。这会返回它们应该是的引用,而不是js试图调用的函数。在我的代码运行和停止运行之间,额外的()是如何写入isNull和isStream的,这是任何人的猜测(也有点担心)--我没有做这些更改。

对于任何感兴趣的人,完整的路径解释如下。

isNull和isStream的参考文献在index.js中作了如下介绍:

代码语言:javascript
复制
module.exports = {
  ...
  isStream: require('./lib/isStream'),
  isBuffer: require('./lib/isBuffer'),
  isNull: require('./lib/isNull'),
  ...
};

它引用了gulp-uglify -> node_modules -> gulp-util -> lib -> isNull.js (& isStream.js)下的这个函数,如下所示:

代码语言:javascript
复制
module.exports = function(v) {
  return v === null;
};

因此,删除调用括号的函数,()在minifier.js中进行正确的引用,而gulp运行时没有出现错误。

看起来像一个gulp-uglify的问题在一天结束(我猜)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33201066

复制
相关文章

相似问题

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