Странная ошибка в gulp-uglify 'file.isNull()' при сборке gulp
Я строю относительно простой проект в изучении React с Flux. Я использую (или пытаюсь использовать) Gulp для создания автоматической сборки с помощью Browserify, Reactify, Streamify и Uglify, все они установлены через npm. Весь поток работал, я сделал несколько изменений в файле, перестроил, и теперь он выдает ошибку при запуске сборки. Даже после возврата изменений и возврата к исходному, ранее рабочему состоянию. Я подозреваю, что, возможно, где-то произошло изменение разрешения, но я сам этого не сделал, так что я не уверен, как диагностировать это дальше (и не уверен, есть ли проблема).
Я должен добавить, что сначала я подозревал, что проблема с потоковой передачей винила, но я добавил .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)
Приветствую любые идеи - спасибо.
2 ответа
Обратите внимание на удаление лишних скобок - (). Это возвращает их к ссылкам, которыми они должны быть, а не к функциям, которые пытается вызвать js. Каким образом extra () был записан в isNull и isStream между тем, когда мой код работал, и когда он прекратил работать - это чье-то предположение (и немного касающееся) - я не вносил эти изменения.
Да, это ссылки на функции, экспортируемые в модули. require('./lib/isNull')
возвращает экспорт этого модуля; экспорт является функцией, поэтому isNull
это функция. Удаляя скобки, вы теперь только проверяете, file.isNull
это все, что было бы всегда правдой.
Но вы все равно смотрите на неправильные вещи. Это не где file
происходит от. file
передается в качестве параметра minify
функция. Так file
это объект, который должен иметь isNull
а также isStream
методы.
minify
функция вызывается с through2
, так что если ваш файл gulp не работает, то это, вероятно, означает, что вы сделали что-то не так, возможно, с заказом. К сожалению, сообщения об ошибках в большинстве случаев не очень полезны.
Глядя на ваш гулфайл, я замечаю, что у вас есть два звонка uglify
:
.pipe(uglify().on('error', gutil.log))
…
.pipe(streamify(uglify(path.MINIFIED_OUT)))
Первый выглядит хорошо и что gulp-uglify
обычно выглядит так. Но второе похоже на то, что вы пытались использовать сырье uglify
(не gulp-uglify
) там. Это не кажется хорошей идеей и с тех пор uglify
ссылается gulp-uglify
это не сработает в любом случае. Так что лучше удали эту строку.
Я также предлагаю вам взглянуть на официальную рекомендацию о том, как использовать browserify с uglify и исправить порядок ваших uglify()
позвоните: вы должны позвонить после buffer()
,
browserify(…)
.bundle()
.pipe(source(path.MINIFIED_OUT))
.pipe(buffer())
.pipe(uglify())
.on('error', gutil.log)
.pipe(gulp.dest(path.DEST_BUILD));
Хорошо, так что это было странно - я опубликую для любого, чтобы прокомментировать и / или обновить.
Следуя пути ошибки, я открыл 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
вопрос в конце дня (наверное).