2015-10-18 3 views
2

Я строю относительно простой проект в обучении React w/Flux. Я использую (или пытаюсь использовать) Gulp для создания автоматизированной сборки с помощью Browserify, Reactify, Streamify и Uglify, установленных через npm. Весь поток работал, я сделал несколько изменений файла, перестроил, и теперь он выдает ошибку при запуске сборки. Даже после возврата изменений и возврата к исходному, ранее работающему состоянию. Я подозреваю, что, возможно, изменение прав произошло где-то, но я этого не сделал сам, поэтому я не уверен, как диагностировать это дальше (и не уверен, что проблема там).странный gulp-uglify minifier 'file.isNull()' ошибка на gulp build

Я должен добавить, что сначала я подозревал, что проблема с потоком винила была проблемой, но я добавил .pipe(buffer()) и vinyl-buffer в поток сборки, однако это не изменило ошибку.

Вот глотком:

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']); 

Здесь ошибка:

[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) 

Добро пожаловать любые идеи - спасибо.

ответ

3

Notice the removal of the extra parentheses -(). This returns these to the references they should be, not the functions the js is trying to call. How the extra() got written into isNull and isStream between when my code was running and when it stopped running is anyone's guess (and a little concerning) - I did not make those changes.

Это ссылки, да, но ссылки на функции, экспортируемые в модули. require('./lib/isNull') возвращает экспорт этого модуля; экспорт является функцией, поэтому функция isNull. Удалив круглые скобки, вы теперь проверяете только то, что было бы всегда правильным: file.isNull.

Но вы все равно смотрите на неправильные вещи. Это не где file. file передается как параметр функции minify. Таким образом, file - объект, который должен иметь методы isNull и isStream.

Функция minify вызывается с through2, поэтому, если ваш файл gulp терпит неудачу, это, вероятно, означает, что вы сделали что-то неправильно, возможно, с заказом. К сожалению, сообщения об ошибках в большинстве случаев не очень полезны.

При взгляде на ваш gulpfile, я замечаю, что у вас есть два вызова uglify:

.pipe(uglify().on('error', gutil.log)) 
… 
.pipe(streamify(uglify(path.MINIFIED_OUT))) 

Первый выглядит хорошо и то, что gulp-uglify обычно выглядит. Но второе похоже больше похоже на то, что вы пытались использовать необработанные uglify (а не gulp-uglify). Это не похоже на хорошую идею, и поскольку uglify ссылается на gulp-uglify, все равно это не сработает. Так что лучше удалите эту строку.

Я также предлагаю вам взглянуть на official recommendation о том, как использовать browserify с уродовать и закрепить порядок вашего uglify() вызова: Вы должны назвать его послеbuffer().

browserify(…) 
    .bundle() 
    .pipe(source(path.MINIFIED_OUT)) 
    .pipe(buffer()) 
    .pipe(uglify()) 
    .on('error', gutil.log) 
    .pipe(gulp.dest(path.DEST_BUILD)); 
0

Итак, это было странно - я отправлю кому-либо комментарий и/или обновление.

Следуя пути ошибки, я открыл файл minifier.js под номером gulp-uglify. Строка 67 (. Иая ошибка выше) показала следующее:

if (file.isNull()) { 
     return callback(null, file); 
    } 

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

Проблема заключается в том, что IsNull и isStream не являются функциями - они ссылка. Таким образом, код должен быть изменен на:

if (file.isNull) { 
     return callback(null, file); 
    } 

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

Обратите внимание на удаление дополнительных скобок - (). Это возвращает их к ссылкам, которые они должны быть, а не к функциям, которые js пытается вызвать. Как дополнительный () был записан в isNull и isStream между тем, когда мой код работал и когда он прекратил работать, - это чья-то догадка (и немного о) - я не делал этих изменений.

Для всех, кого интересует, приведено полное объяснение пути.


Ссылки на IsNull и isStream сделаны в index.js здесь:

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), которая выглядит следующим образом:

module.exports = function(v) { 
    return v === null; 
}; 

Так что - удалить вызывающую функцию скобки () в minifier.js делают правильную ссылку, а сборка gulp работает без ошибок.

Похож на вопрос gulp-uglify в конце дня (я предполагаю).

+0

Я просто поражен тем, что существует дискретный модуль для проверки равенства с 'null' –

Смежные вопросы