2013-02-20 4 views
15

Я написал приложение в Node.js (с помощью Express & socket.io) и Я хотел бы использовать Grunt для компиляции своих клиентских файлов с помощью функции «загрузка» при разработке и подключении к Приложение Node.js. Как я могу это сделать? (желательно, не запуская приложение Node.js в другом порту и клиенте в другом порту, из-за проблем с переходом и междоменными доменами)Grunt livereload с приложением node.js

Я установил также Yeoman, и он использует из коробки пакет grunt-contrib-livereload, но от того, что я понял, он использует сервер Node.js Connect для обслуживания на стороне клиента файлы, таким образом отделяется от моего приложения Node.js ..

Пример из Gruntfile.js генерируемой Yeoman:

var lrSnippet = require('grunt-contrib-livereload/lib/utils').livereloadSnippet; 
var mountFolder = function (connect, dir) { 
    return connect.static(require('path').resolve(dir)); 
}; 

// ... cut some parts 
grunt.initConfig({ 
    watch: { 
     livereload: { 
      files: [ 
       '<%= yeoman.app %>/*/*.html', 
       '{.tmp,<%= yeoman.app %>}/styles/*.css', 
       '{.tmp,<%= yeoman.app %>}/scripts/*.js', 
       '<%= yeoman.app %>/images/*.{png,jpg,jpeg}' 
      ], 
      tasks: ['livereload'] 
     } 
     // ..cut some parts 
    }, 
    connect: { 
     livereload: { 
      options: { 
       port: 9000, 
       middleware: function (connect) { 
        return [ 
         lrSnippet, 
         mountFolder(connect, '.tmp'), 
         mountFolder(connect, 'app') 
        ]; 
       } 
      } 
     } 
    } 
    // ..cut some parts 
}); 

grunt.registerTask('server', [ 
    'clean:server', 
    'coffee:dist', 
    'compass:server', 
    'livereload-start', 
    'connect:livereload', 
    'open', 
    'watch' 
]); 

ответ

7

Не конечно, если вы еще решили этот вопрос, но я сделал это, добавив мое экспресс-приложение как middlewa re прикреплен к опции «connect.livereload.options.middleware».

Однако автоматическая перезагрузка серверного кода не работает. Для этого вы можете реализовать перезагружаемый сервер с помощью простого «узла ./server.js», создать промежуточное промежуточное программное обеспечение, которое будет действовать как прозрачный прокси-сервер для вашего сервера разработки и вызвать его в вашем файле Gruntfile.js перед вашим стандартным подключением/загрузкой сервер запускается.

connect: { 
    options: { 
     port: 9000, 
     // change this to '0.0.0.0' to access the server from outside 
     hostname: 'localhost' 
    }, 
    livereload: { 
     options: { 
      middleware: function (connect) { 
       return [ 
        lrSnippet, 
        mountFolder(connect, '.tmp'), 
        mountFolder(connect, 'app'), 
        require('./server') // your server packaged as a nodejs module 
       ]; 
      } 
     } 
    } 
} 

server.js:

var app = express(); 

... 
// Export your server object. 
module.exports = app; 
+0

Вы настроили сервер на сервере server.js, таком как http.createServer (app) .listen (8080)? Если вы это сделаете и получите доступ к приложению через localhost: 8080, он не будет перезагружать файлы клиента, верно?Но если вы будете обращаться к localhost: 9000, это будет, но затем приложение node.js не ответит оттуда .. или я делаю это неправильно? :) – acoder

+0

Нет. Я не настраиваю http.createServer (приложение). Я использую module.exports = app, и когда я требую («./ server»), он возвращает «приложение», которое является экспресс-приложением (каждое экспресс-приложение является промежуточным программным обеспечением для подключения). Я просто обращаюсь ко всему приложению на http: // localhost: 9000. –

+0

Это довольно хакерский, но я смог получить nodejs + connect/livereload + grunt, чтобы играть красиво. https://github.com/sheenobu/yo-nodejs-example/commit/663509d7d7e41004c402e322292a9a4b14122002 –

0

В Gruntfile, удалить connect:livereload и open из server задачи.

Добавить следующий скрипт в HTML-файл

<!-- livereload script --> 
<script type="text/javascript"> 
    document.write('<script src="http://' 
     + (location.host || 'localhost').split(':')[0] 
     + ':35729/livereload.js?snipver=1" type="text/javascript"><\/script>') 
</script> 
+0

Хорошо, понял. Готово. –

1

Мой ответ использует Gulp, что я больше знакомы с, вместо Grunt, но я полагаю, такой же подход будет работать с Grunt, а также.

См. my repositoryan older one) и my other answer.

Не требуется ни расширение браузера, ни добавление какого-либо скрипта в ваши файлы.

Решение основано на пакетах и connect-livereload, работающих вместе. Во-первых, вы начинаете свой живой релоад слушателя, и трубы в нее любые изменения файлов (изменение * к более специфичным node-glob слушать только определенные файлы):

 

var gulpLivereload = require('gulp-livereload'); 

gulpLivereload.listen(); 

gulp.watch('*', function(file) { 
    gulp.src(file.path) 
    .pipe(gulpLivereload()); 
}); 
 

Во-вторых, необходимо настроить сервер для использования слушатель, как промежуточный слой с помощью connect-livereload:

 

var connect = require('connect'); 
var connectLivereload = require('connect-livereload'); 

connect() 
    .use(connectLivereload()) 
    .use(connect.static(__dirname)) 
    .listen(8080); 
 

Смотрите пакеты для получения дополнительной информации о том, как они работают внутри.

+0

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/12411532) –

+0

@ForwardEd Хорошая точка, детали добавлены. –

Смежные вопросы