Как использовать grunt-contrib-livereload?

Я пытаюсь использовать grunt-contrib-livereload, но не могу понять это из. Ридми, кажется, пропускает все, что мне нужно объяснить , а затем заканчивается примером, который не работает, когда я его пробую, и не имеет прямого отношения к документации. Я искал лучшее объяснение в сообщении в блоге, учебнике или где-то еще, но не смог его найти. Может кто-нибудь объяснить, как начать работу с этим инструментом?

Вот вопросы, которые у меня есть, на основе readme:

В документации сказано, что задаче livereload «должен быть передан список файлов, которые были изменены» --- но как мне передать ей этот список файлов? Пример, кажется, не иллюстрирует это. Соответствует ли список?

Требуется ли grunt-contrib-connect? Что он делает и как его использовать? Нужно ли мне учиться подключаться, прежде чем я попытаюсь использовать livereload?

В файле readme упоминается промежуточное ПО, которое «должно быть вставлено первым» — но вставлено в что, перед чем еще? И как вставляется?

И я полагаю, я не понимаю, как мне нужно манипулировать портами. «Все браузеры, прослушивающие порт livereload, будут перезагружены» --- но как узнать, какой браузер прослушивает какой порт? Нужно ли мне знать все о портах, прежде чем я смогу попробовать использовать livereload? (Любое предложение о том, как лучше всего узнать об этом?)

Наконец, в примере есть функция folderMount, которая, кажется, не связана ни с одной из предыдущих документов. Что это такое и нужно ли мне это?

Я думаю, я спрашиваю, если кто-то может пожалуйста:

  • указать мне на учебник, который намного эффективнее, чем текущий файл readme;
  • объясните эти необъяснимые части файла readme, если эти ответы нужны мне для понимания плагина;
  • или предоставьте функциональный пример с некоторым объяснением того, почему он функционален.

person davidtheclark    schedule 04.05.2013    source источник


Ответы (4)


Живая перезагрузка теперь встроена в grunt-contrib-watch версию 0.4.0. Поддержка grunt-contrib-livereload и grunt-regarde скоро будет прекращена.

Теперь просто установите параметр livereload на true в вашей конфигурации, и он создаст сервер перезагрузки в реальном времени, а затем перезагрузится после выполнения задач:

grunt.initConfig({
  watch: {
    all: {
      options: { livereload: true },
      files: ['lib/*.js'],
      tasks: ['jshint'],
    },
  },
});

По умолчанию сервер перезагрузки в реальном времени будет запущен на порту 35729. Поэтому, чтобы включить перезагрузку в реальном времени на своей странице, просто добавьте <script src="http://localhost:35729/livereload.js"></script> на свою страницу.

Дополнительную информацию можно найти в документации: https://github.com/gruntjs/grunt-contrib-watch#live-reloading

person Kyle Robinson Young    schedule 07.05.2013
comment
Очень хорошо знать. Я рад видеть, что это было значительно упрощено. - person davidtheclark; 08.05.2013
comment
Я тоже. Хотел бы я знать это до моего эпического ответа! - person imjared; 08.05.2013
comment
Спасибо, вы также можете добавить, что расширение Chrome также отлично работает с этим решением (chrome.google.com/webstore/detail/livereload/), поэтому добавление строки скрипта вручную устарело. - person owzim; 09.05.2013
comment
ЕСЛИ вы хотите перезагрузить в браузере мобильного устройства, удобно загружать скрипт поздно (через jQuery) (и, таким образом, избегать необходимости менять localhost на любой ваш IP-адрес или имя хоста, на который приходит запрос): gist.github.com/cbrunnkvist/9157945 - person conny; 22.02.2014
comment
Вам не нужно какое-либо расширение Chrome для livereload и вам не нужно добавлять какой-либо скрипт в свой файл: github. com/dmitriz/gulp-automation - person Dmitri Zaitsev; 19.04.2015
comment
Откуда он знает корень сервера livereload? Откуда запускается сервер? Какой путь/папка? - person Andreas Norman; 06.05.2015

Изменить: проверить информацию о версии. grunt-contrib-watch теперь имеет встроенную поддержку livereload.

Какая дурь. У меня тоже возникли проблемы с этим, поэтому позвольте мне сделать все, что я могу, чтобы объяснить (или, по крайней мере, заставить вас работать). Имейте в виду, что у меня это настроено именно так, и в большинстве случаев это работает.

Для начала вам нужно убедиться, что вы обновили свой package.json с правильными зависимостями. Я не уверен, что livereload работает с запеченной задачей «смотреть», и я использовал grunt. -отношение в последнее время. Мой package.json обычно выглядит так:

"dependencies": {
  "grunt": "~0.4.x",
  "grunt-contrib-livereload": "0.1.2",
  "grunt-contrib-connect": "0.2.0",
  "grunt-regarde": "0.1.1"
},

Очевидно, вы хотите grunt (duhhh), livereload, connect, кажется, помогает с монтированием папок, а в отношении это похоже на grunt-watch, просто кажется, что он работает лучше (я забыл, почему именно).

Вы можете сделать свой package.json еще лучше, указав livereload в его собственном объекте "devDependencies", если вы так склонны. Теперь запустите свой старый добрый npm install, чтобы получить вкусности в своем проекте.

Поговорим о gruntfiles:

Как вы, наверное, знаете, волшебство происходит благодаря файлу gruntfile. Где-то в нижней части вашего gruntfile вы захотите указать

grunt.loadNpmTasks('grunt-regarde');
grunt.loadNpmTasks('grunt-contrib-livereload');
grunt.loadNpmTasks('grunt-contrib-connect');

В начало вашего gruntfile мы добавим несколько утилит для livereload. Под /*global module:false*/ добавьте var lrSnippet = require('grunt-contrib-livereload/lib/utils').livereloadSnippet;.

После этого вам не нужно учиться подключаться, вы просто должны использовать его. Проверьте мой стиль:

var folderMount = function folderMount(connect, point) {
  return connect.static(path.resolve(point));
};

Это происходит до module.exports = function(grunt) {

Теперь давайте перейдем к сути gruntfile. Опять же, я забыл, что делает connect, но именно здесь в игру вступает магия промежуточного программного обеспечения. В файле modules.exports добавьте:

connect: {
  livereload: {
    options: {
      port: 9999,
      middleware: function(connect, options) {
        return [lrSnippet, folderMount(connect, '.')]
      }
    }
  }
},

Теперь мы хотим, чтобы файлы просматривались. Мне нравится настраивать несколько разных задач, так как я не хочу, чтобы весь мой процесс grunt запускался каждый раз, когда я сохраняю файл CSS. Вот с чем я работаю (опять же, добавьте к module.exports):

regarde: {
  txt: {
    files: ['styles/*.css', 'index.html'],
    tasks: ['livereload']
  },
  styles: {
    files: ['sass/*.scss', 'sass/*/*.scss'],
    tasks: ['compass']
  },
  templates: {
    files: ['templates/*.jade'],
    tasks: ['jade']
  }
},

Вы можете видеть, что я только хочу, чтобы livereload срабатывала при внесении изменений в мой скомпилированный css (*.css) или в мой скомпилированный html. Если я редактирую файл SCSS, я хочу запустить только компас. Если я редактирую нефритовый шаблон, я хочу запускать компилятор только из нефрита в HTML. Думаю, вы видите, что происходит. Вы можете играть с этим, просто будьте умны, потому что вы можете попасть в бесконечный цикл.

Наконец, вам нужно запустить эти процессы. Мне нравится привязывать их всех к моей основной задаче, потому что мой gruntfile просто это мило.

// Default task.
grunt.registerTask('default', ['livereload-start', 'connect', 'regarde']);

Теперь, когда вы запускаете grunt в CLI, вы должны (надеюсь, возможно, скрестить пальцы) получить что-то вроде этого:

Running "connect:livereload" (connect) task
Starting connect web server on localhost:9999.

Перейдите к http://localhost:9999/yourpage.html и наблюдайте, как происходит волшебство.

полный файл grunt здесь полный package.json здесь.

person imjared    schedule 07.05.2013
comment
Спасибо за все подробности. Очень полезно. - person davidtheclark; 08.05.2013

Вот решение на основе Gulp вместо Grunt и следующие Gulpfile.js, чтобы livereload заработало:


var gulp = require('gulp');
var connect = require('connect');
var connectLivereload = require('connect-livereload');
var opn = require('opn');
var gulpLivereload = require('gulp-livereload');

var config = {
    rootDir: __dirname,
    servingPort: 8080,

    // the files you want to watch for changes for live reload
    filesToWatch: ['*.{html,css,js}', '!Gulpfile.js']
}

// The default task - called when you run `gulp` from CLI
gulp.task('default', ['watch', 'serve']);

gulp.task('watch', ['connect'], function () {
  gulpLivereload.listen();
  gulp.watch(config.filesToWatch, function(file) {
    gulp.src(file.path)
      .pipe(gulpLivereload());
  });
});

gulp.task('serve', ['connect'], function () {
  return opn('http://localhost:' + config.servingPort);
});

gulp.task('connect', function(){
  return connect()
    .use(connectLivereload())
    .use(connect.static(config.rootDir))
    .listen(config.servingPort);
});

person Dmitri Zaitsev    schedule 19.04.2015

Я знаю, что это немного устарело, но может помочь кому-то. В Gruntfile.js добавьте «опции»:

sass: {
    files: 'scss/**/*.scss',
    tasks: ['sass'],
    options: {
      livereload: true,
    }
  }

В указатель добавить:

<script src="http://localhost:35729/livereload.js"></script>
person Panta Alejandro    schedule 14.10.2015