Gulp-autoprefixer zgłasza ReferenceError: Promise nie jest zdefiniowana

81

Próbuję jednym haustem skompilować mój sass, a następnie autoprefixit za pomocą, gulp-autoprefixerale pojawia się błąd.

var gulp = require('gulp'),
    sass = require('gulp-sass'),
    autoprefixer = require('gulp-autoprefixer');

gulp.task('test', function(){
    gulp.src('_sass/main.sass')
        .pipe(sass())
        .pipe(autoprefixer()) 
        .pipe(gulp.dest('./assets/css')); 
});

Próbuję to uruchomić Gulpfile.jsi używam:

"gulp": "~3.9.0",
"gulp-sass": "~2.0.4",
"gulp-autoprefixer": "~3.0.1",

i wersja NPM 1.3.10

Kiedy biegnę, gulp testdostaję to:

/home/matei/Tests/test-4/node_modules/gulp-autoprefixer/node_modules/postcss/lib/lazy-result.js:152
        this.processing = new Promise(function (resolve, reject) {
                              ^
ReferenceError: Promise is not defined
    at LazyResult.async (/home/matei/Tests/test-4/node_modules/gulp-autoprefixer/node_modules/postcss/lib/lazy-result.js:152:31)
    at LazyResult.then (/home/matei/Tests/test-4/node_modules/gulp-autoprefixer/node_modules/postcss/lib/lazy-result.js:75:21)
    at DestroyableTransform._transform (/home/matei/Tests/test-4/node_modules/gulp-autoprefixer/index.js:28:13)
    at DestroyableTransform.Transform._read (/home/matei/Tests/test-4/node_modules/gulp-autoprefixer/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js:172:10)
    at DestroyableTransform.Transform._write (/home/matei/Tests/test-4/node_modules/gulp-autoprefixer/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js:160:12)
    at doWrite (/home/matei/Tests/test-4/node_modules/gulp-autoprefixer/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js:326:12)
    at writeOrBuffer (/home/matei/Tests/test-4/node_modules/gulp-autoprefixer/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js:312:5)
    at DestroyableTransform.Writable.write (/home/matei/Tests/test-4/node_modules/gulp-autoprefixer/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js:239:11)
    at write (/home/matei/Tests/test-4/node_modules/gulp-sass/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js:623:24)
    at flow (/home/matei/Tests/test-4/node_modules/gulp-sass/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js:632:7)

Naprawdę nie wiem, co robię źle. Nie działa, gdy używam sass lub zwykłego CSS. Myślę, że jest coś z moimi plikami.

Matei
źródło
1
Nie jestem pewien, co to ma wspólnego z Sassem (lub CSS), gdy błąd jest generowany przez Autoprefixer.
cimmanon
2
Nie jestem pewien, czy to rozwiązanie, czy nie ... ale Twoja wersja NPM jest nieaktualna. Spróbuj zaktualizować npm i wszystkie swoje pakiety, wcześniej napotkałem takie dziwne dziwactwa podczas uruchamiania starszych wersji.
Benjamin Solum

Odpowiedzi:

78

Miałem ten sam problem. Dla mnie aktualizacja węzła nie działała, ale dodanie tego na samym początku mojego pliku gulpfile:

require('es6-promise').polyfill();
Chris Searles
źródło
To dobra "poprawka", lepszym rozwiązaniem jest aktualizacja node.js (zobacz odpowiedź @Matei)
Mark
1
@MonkeyKing, jak powiedziałem w mojej odpowiedzi, aktualizacja węzła nie rozwiązała problemu
Chris Searles
4
jaki pakiet? Dostajęcannot find module es6-promise
Victor
3
@Victor spróbuj uruchomić npm install es6-promisew swoim terminalu
Michael
66

Zaktualizowałem node.js do najnowszej wersji przy użyciu:

# Using Ubuntu
curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
sudo apt-get install -y nodejs

dla mojego komputera Ubuntu, jak pokazano tutaj .

Następnie zaktualizowałem NPM za pomocą:

sudo npm cache clean -f
sudo npm install -g n
sudo n stable

Jak pokazano tutaj .

Teraz gulp-autoprefixerzacznij działać, ale dostałem błąd od gulp-sass. Zaktualizowałem go za pomocą tej instrukcji:

  1. Usuń folder node_modules
  2. Usuń gulp-sass z pliku package.json
  3. Usuń node-sass z pliku package.json (jeśli go tam masz)
  4. Uruchom npm install gulp-sass --save-dev
  5. Zaktualizuj zadanie Gulp zgodnie z wymaganiami

Znaleziono tutaj. Teraz mam "gulp-sass": "^2.0.4"i to rozwiązało wszystkie moje problemy.

Dzięki za radę i pomoc.

Matei
źródło
11
Możesz rozpocząć node-sasspracę npm rebuild node-sasspo uaktualnieniu węzła.
Hugh Grigg
po prostu działało świetnie. dzięki. również komunikat konsoli prosi o uruchomienie tego polecenia, gdy wystąpi błąd podczas wykonywania zadania
Pushpak Patel
1
To jest rzeczywiście problem z wersją NodeJS, patrz github.com/sindresorhus/gulp-autoprefixer/issues/45
tricasse
Dobre instrukcje. Instrukcje dotyczące agnostyka systemu operacyjnego można znaleźć pod adresem nodesource.com/services/upgrade-self-service
ropucha
Nie potrzebowałem tych kroków: sudo npm cache clean -f sudo npm install -g n sudo n stablei użyłem npm rebuild node-sassdo naprawienia problemu z node-sass. :)
Edu Ruiz
29

Zainstaluj es6-promise w lokalizacji Twojego projektu, w której istnieje plik package.json

npm install es6-promise

Następnie ustaw pierwszy wiersz pliku gulpfile.js na następujący kod:

var Promise = require('es6-promise').Promise;
Hari Gillala
źródło
2

Nie odpowiada to bezpośrednio na pytanie, ale może być przydatne dla osób, które otrzymają ten błąd podczas próby uruchomienia samouczka ionic 2.

Jak wskazują inne odpowiedzi, problem polega na tym, że es6-promisebrakuje.

Wystąpił ten sam błąd podczas próby uruchomienia samouczka ionic 2 ( https://github.com/driftyco/ionic2-starter-tutorial ): (moja wersja ionic 2 to 2.0.0-beta.25, a najnowsze zatwierdzenie samouczka to ed9ef2fcce887e4d1c08c375c849b06b8394bad7 )

Oto ślad stosu, który otrzymałem podczas próby uruchomienia aplikacji z ionic serve:

Running 'serve:before' gulp task before serve
[18:37:00] Starting 'clean'...
[18:37:01] Finished 'clean' after 1.02 s
[18:37:01] Starting 'watch'...
[18:37:01] Starting 'sass'...
[18:37:01] Starting 'html'...
[18:37:01] Starting 'fonts'...
[18:37:01] Starting 'scripts'...
[18:37:01] Finished 'scripts' after 62 ms
[18:37:01] Finished 'html' after 72 ms
[18:37:01] Finished 'fonts' after 77 ms
Caught exception:
 ReferenceError: Promise is not defined
    at LazyResult.async (/home/stitakis/dev/playground/ionic2/myTutorial/node_modules/ionic-gulp-sass-build/node_modules/gulp-autoprefixer/node_modules/postcss/lib/lazy-result.js:157:31)
    at LazyResult.then (/home/stitakis/dev/playground/ionic2/myTutorial/node_modules/ionic-gulp-sass-build/node_modules/gulp-autoprefixer/node_modules/postcss/lib/lazy-result.js:79:21)
    at DestroyableTransform._transform (/home/stitakis/dev/playground/ionic2/myTutorial/node_modules/ionic-gulp-sass-build/node_modules/gulp-autoprefixer/index.js:24:6)
    at DestroyableTransform.Transform._read (/home/stitakis/dev/playground/ionic2/myTutorial/node_modules/ionic-gulp-sass-build/node_modules/gulp-autoprefixer/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js:159:10)
    at DestroyableTransform.Transform._write (/home/stitakis/dev/playground/ionic2/myTutorial/node_modules/ionic-gulp-sass-build/node_modules/gulp-autoprefixer/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js:147:83)
    at doWrite (/home/stitakis/dev/playground/ionic2/myTutorial/node_modules/ionic-gulp-sass-build/node_modules/gulp-autoprefixer/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js:313:64)
    at writeOrBuffer (/home/stitakis/dev/playground/ionic2/myTutorial/node_modules/ionic-gulp-sass-build/node_modules/gulp-autoprefixer/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js:302:5)
    at DestroyableTransform.Writable.write (/home/stitakis/dev/playground/ionic2/myTutorial/node_modules/ionic-gulp-sass-build/node_modules/gulp-autoprefixer/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js:241:11)
    at DestroyableTransform.ondata (/home/stitakis/dev/playground/ionic2/myTutorial/node_modules/ionic-gulp-sass-build/node_modules/gulp-sass/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js:531:20)
    at DestroyableTransform.EventEmitter.emit (events.js:95:17) 

Ponownie, jak wskazują inne odpowiedzi, oto jak rozwiązać ten problem:

  1. edytuj plik gulpfile.js i dodaj w linii 6: require('es6-promise').polyfill();

  2. zainstaluj brakującą zależność za pomocą: npm install es6-promise --save

Po tych zmianach problem został rozwiązany i mogłem uruchomić lokalny serwer.

stitakis
źródło
To rozwiązało problem dla mnie, wszystko, co musiałem zrobić, to użyć obietnicy npm install es6 z --save i użyć tego wymagania z .pollyfill, używając .Promise (), ponieważ w powyższym awnser nie działa dla mnie.
killstreet