gulp v3で使用していたgulpfile.jsをv4に変更する機会があったので、その際の変更点をメモ。
設定内容
変更前のgulpfile.jsは以下のようになっています。
var gulp = require('gulp'), browserSync = require('browser-sync'), plumber = require('gulp-plumber'), watch = require('gulp-watch'), pug = require('gulp-pug'), sass = require('gulp-sass'), postcss = require('gulp-postcss'), autoprefixer = require('autoprefixer'), sourcemaps = require('gulp-sourcemaps'), sassGlob = require("gulp-sass-glob"); /* Pug */ gulp.task('pug', function() { return gulp.src(['_src/pug/**/*.pug', '!_src/pug/**/_*.pug']) .pipe(plumber()) .pipe(pug({ pretty: true, basedir: './_src/pug' })) .pipe(gulp.dest('./')) .pipe(browserSync.reload({stream:true})); }); /* Sass */ gulp.task('sass', function () { var plugins = [ autoprefixer(), ]; return gulp.src(['./_src/sass/**/*.scss', '!./_src/sass/**/_*.scss']) .pipe(sassGlob()) .pipe(sourcemaps.init()) .pipe(plumber()) .pipe(sass({ outputStyle : 'compact' })) .pipe(postcss(plugins)) .pipe(sourcemaps.write('./')) .pipe(gulp.dest('assets/css/')) .pipe(browserSync.reload({stream:true})); }); /* Browser-sync */ gulp.task('server', function() { browserSync({ server: { baseDir: './', }, }); }); /* Watch */ gulp.task('watch', function() { watch('_src/pug/**/*.pug', function(e) { gulp.start('pug'); }); watch('./_src/sass/**/*.scss', function(e) { gulp.start('sass'); }); }); /* Default */ gulp.task('default', ['watch', 'server']);
この状態でv4にアップデートして、defaultのタスクを実行してみます。
npx gulp
以下のようなエラーが表示されました。
AssertionError [ERR_ASSERTION]: Task function must be specified
gulp.taskの引数の指定方法が変わっているようで、今回の場合defaultのタスクを以下のように変更しました。
gulp.task('default', ['watch', 'server']); ↓ gulp.task('default', gulp.parallel('watch', 'server'));
gulp.parallelは処理の実行を指定する(並列処理)もので、他にもgulp.series(直列処理)が使用できます。
これで先程のエラーは出なくなり、Browser-syncで起動までは実行できました。
ただ、PugファイルやSassファイルを変更した際に以下のようなエラーが表示されました。
UnhandledPromiseRejectionWarning: TypeError: gulp.start is not a function
gulp.startがv4で非推奨になったようで、代わりにgulp.seriesまたはgulp.parallelを使用する必要があるようです。
また、watch()もv4から変更が入っているようで、gulp-watchプラグインは使わなくてよさそうなので、使用しない形に変更してみます。
gulp.task('watch', function() { watch('_src/pug/**/*.pug', function(e) { gulp.start('pug'); }); watch('./_src/sass/**/*.scss', function(e) { gulp.start('sass'); }); }); ↓ gulp.task('watch', function() { gulp.watch('_src/pug/**/*.pug', gulp.task('pug')); gulp.watch('./_src/sass/**/*.scss', gulp.task('sass')); });
これでwatchのタスクでもエラーが出なくなりました。
最終的に、gulpfile.jsの中身は以下のようになりました。
var gulp = require('gulp'), browserSync = require('browser-sync'), plumber = require('gulp-plumber'), pug = require('gulp-pug'), sass = require('gulp-sass'), postcss = require('gulp-postcss'), autoprefixer = require('autoprefixer'), sourcemaps = require('gulp-sourcemaps'), sassGlob = require("gulp-sass-glob"); /* Pug */ gulp.task('pug', function() { return gulp.src(['_src/pug/**/*.pug', '!_src/pug/**/_*.pug']) .pipe(plumber()) .pipe(pug({ pretty: true, basedir: './_src/pug' })) .pipe(gulp.dest('./')) .pipe(browserSync.reload({stream:true})); }); /* Sass */ gulp.task('sass', function () { var plugins = [ autoprefixer(), ]; return gulp.src(['./_src/sass/**/*.scss', '!./_src/sass/**/_*.scss']) .pipe(sassGlob()) .pipe(sourcemaps.init()) .pipe(plumber()) .pipe(sass({ outputStyle : 'compact' })) .pipe(postcss(plugins)) .pipe(sourcemaps.write('./')) .pipe(gulp.dest('assets/css/')) .pipe(browserSync.reload({stream:true})); }); /* Browser-sync */ gulp.task('server', function() { browserSync({ server: { baseDir: './', }, }); }); /* Watch */ gulp.task('watch', function() { gulp.watch('_src/pug/**/*.pug', gulp.task('pug')); gulp.watch('./_src/sass/**/*.scss', gulp.task('sass')); }); /* Default */ gulp.task('default', gulp.parallel('watch', 'server'));
コメントが承認されるまで時間がかかります。