Node.js & amp; Gulp: Реальная последовательность трубопроводов может отличаться от написанной цепочки .pipe ()?

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

Я наткнулся на ту же ошибку и не смог найти много помощи. Итак, я подумал, что вместо того, чтобы нацеливать CSS, я попытаюсь настроить таргетинг на xpath. Я не знаю, что такое лучшая практика.

Мои исходные функции отлично работали на Ubuntu 16, R 3.4.0. Однако они не справились с Debian 8 R 3.3.3 и R 3.4.0.

Когда я изменил свой код на целевые xpaths вместо css, они начали работать как ожидалось. Например, изменив это ...

contents <- link %>% 
    xml2::read_html() %>%
    rvest::html_nodes(css = "pre") %>%
    rvest::html_text()

на это ...

contents <- link %>%
    xml2::read_html() %>%
    rvest::html_nodes(xpath = "//pre") %>%
    rvest::html_text()

разрешил мою проблему.

0
задан Gurebu Bokofu 29 March 2019 в 01:46
поделиться

1 ответ

Gulp сам по себе не переупорядочивает то, что происходит при последующих вызовах .pipe. Я не уверен, что именно происходит в вашем случае, но ваш код излишне хрупок .

Рассмотрим этот шаблон:

gulp.src("...")
  .pipe(pluginA)
  .pipe(pluginB)

И предположим, что pluginA просто печатает на консоль pluginA, а pluginB просто печатает на консоль pluginB. Вы можете подумать, что результат будет:

pluginA
pluginB
pluginA
pluginB
pluginA
...

Другими словами, каждый файл будет проходить через pluginA, а затем этот файл будет проходить через pluginB, затем следующий файл будет проходить через pluginA ] и т. д. То есть pluginA не увидит новый файл, пока pluginB не обработает предыдущий файл, который pluginA завершил обработку. Хотя бывают случаи, когда именно этот порядок и происходит, для общего случая этот порядок не гарантируется . Вы также можете иметь:

pluginA 
pluginA 
pluginA 
pluginB 
pluginA 
pluginB 
pluginB 
pluginB
pluginA 
...

Файлы должны быть просмотрены сначала pluginA, но нет гарантии, что pluginB обработает файл до того, как pluginA перейдет к следующему файлу. [ 1129]

Ваш код работает нормально, если порядок обработки оказывается полностью чередующимся, как в первом примере, который я привел выше. Но в целом этот порядок не гарантируется, и ваш код не будет работать.

Так получилось, что хрупкая часть вашего кода не нужна . Нет необходимости записывать путь к файлу в переменной вне потока файлов, а затем читать его в более поздней части потока. gulp-if передаст проверяемый файл в состояние, которое вы ему передаете. Вот пример:

const gulp = require("gulp");
const gulpIf = require("gulp-if");
gulp.task("default", () =>
          gulp.src("src/**")
          .pipe(gulpIf((file) => {
            console.log(file.path);
            return file.basename === "a";
          }, gulp.dest("out"))));

Эта задача поместит в подкаталог out все файлы с базовым именем "a". Вы также увидите на консоли абсолютный путь к каждому файлу, который проходит через условие, заданное в gulpIf.

Вы можете изменить fileShouldBePreprocessedBySass так, чтобы он принимал файл винила, и просто отметьте там file.path вместо его сохранения и последующего извлечения.

0
ответ дан Louis 29 March 2019 в 01:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: