Gulp-autoprefixer выбрасывает ReferenceError: Promise не определен

81

Я пытаюсь заставить gulp скомпилировать мой sass, gulp-autoprefixerа затем autoprefixit, но получаю сообщение об ошибке.

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

Я пытаюсь запустить это Gulpfile.jsи использую:

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

и версия NPM 1.3.10

Когда я бегу, gulp testя получаю следующее:

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

Я действительно не знаю, что делаю не так. Не работает, когда я использую sass или простой CSS. Думаю что то с моими файлами.

Матей
источник
1
Не уверен, какое отношение это имеет к Sass (или CSS, если на то пошло), когда Autoprefixer выдает ошибку.
cimmanon
2
Не уверен, что это решение или нет ... но ваша версия NPM устарела. Попробуйте обновить npm и все свои пакеты, я сталкивался с подобными странными причудами раньше при запуске старых сборок.
Бенджамин Солум

Ответы:

78

Была такая же проблема. Для меня обновление узла не сработало, но добавление этого в самом начале моего gulpfile помогло:

require('es6-promise').polyfill();
Крис Сирлз
источник
Это хорошее «исправление», лучшее решение - обновить node.js (см. Ответ @Matei)
Марк,
1
@MonkeyKing, как я уже сказал в своем ответе, обновление узла не решило проблему
Крис Сирлз
4
какой пакет? Я получаюcannot find module es6-promise
Виктор
3
@Victor попробуйте запустить npm install es6-promiseв своем терминале
Майкл
66

Я обновил node.js до последней версии, используя:

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

для моей машины Ubuntu, как показано здесь .

После этого я обновил NPM, используя:

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

Как показано здесь .

Теперь gulp-autoprefixerначало работать, но я получил ошибку от gulp-sass. Обновил по этой инструкции:

  1. Удалите папку node_modules
  2. Удалите gulp-sass из файла package.json
  3. Удалите node-sass из файла package.json (если он у вас там есть)
  4. Запустите npm install gulp-sass --save-dev
  5. При необходимости обновите задачу Gulp

Нашел здесь. Теперь у меня есть, "gulp-sass": "^2.0.4"и это устранило все мои проблемы.

Спасибо за совет и помощь.

Матей
источник
11
Вы можете приступить к node-sassработе npm rebuild node-sassпосле обновления узла.
Хью Григг
просто отлично сработало. Благодарю. также в консольном сообщении предлагается запустить эту команду при возникновении ошибки при выполнении задачи
Pushpak Patel
1
Это действительно проблема NodeJS версия, см github.com/sindresorhus/gulp-autoprefixer/issues/45
tricasse
Хорошие инструкции. Инструкции, не зависящие от
toad
Эти шаги мне не понадобились: я sudo npm cache clean -f sudo npm install -g n sudo n stableиспользовал их npm rebuild node-sassдля решения проблемы с node-sass. :)
Edu Ruiz
29

Установите es6-prom в месте проекта ur, где существует package.json

npm install es6-promise

Затем сделайте первую строку вашего gulpfile.js следующим кодом:

var Promise = require('es6-promise').Promise;
Хари Гиллала
источник
2

Это не дает прямого ответа на вопрос, но может быть полезно для людей, которые получают эту ошибку при попытке запустить учебник ionic 2.

Как указано в других ответах, проблема в том, что es6-promiseотсутствует.

У меня такая же ошибка при попытке запустить учебник ionic 2 ( https://github.com/driftyco/ionic2-starter-tutorial ): (моя версия ionic 2 - 2.0.0-beta.25, а последняя фиксация руководства - ed9ef2fcce887e4d1c08c375c849b06b8394bad7 )

Это трассировка стека, которую я получил при попытке запустить приложение с помощью 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) 

Опять же, как указано в других ответах, вот как это решить:

  1. отредактируйте gulpfile.js и добавьте в строку 6: require('es6-promise').polyfill();

  2. установите недостающую зависимость с помощью: npm install es6-promise --save

После этих изменений проблема была устранена, и я смог запустить локальный сервер.

Ститакис
источник
Это устранило проблему для меня, все, что мне нужно было сделать, это использовать npm install es6-prom с --save и использовать это require с .pollyfill, используя .Promise (), поскольку в awnser выше у меня не сработало.
killstreet