我已经在Node.js中创建了一个应用程序(使用Express& socket.io)和我想使用Grunt在开发和连接到Node.js应用程序时使用livereload编译我的客户端内容。我该怎么做?(最好不要在另一个端口运行Node.js应用程序,而在另一个端口运行客户端,因为路径和跨域问题)
我也安装了Yeoman,并且它使用了开箱即用的grunt-contrib-livereload包,但据我所知,它使用Node.js Connect服务器来提供客户端文件,因此与我的Node.js应用程序分开。
Yeoman生成的Gruntfile.js示例:
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'
]);
答案 0 :(得分:7)
不确定您是否已经解决了这个问题,但我已经通过添加我的快速应用程序作为附加到'connect.livereload.options.middleware'选项的中间件来完成此操作。
但是,服务器端代码的自动重新加载不起作用。为此,您可以使用简单的“node ./server.js”实现重载友好服务器,创建一个连接中间件,充当开发服务器的透明代理,并在标准连接/ livereload之前在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;
答案 1 :(得分:1)
我的回答是使用我更熟悉的Gulp
,而不是Grunt,但我想同样的方法也适用于Grunt
。
请参阅my repository(和an older one)和my other answer。
既不需要任何浏览器扩展程序,也不需要在文件中添加任何脚本。
该解决方案基于gulp-livereload
和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);
有关它们如何在内部工作的更多信息,请参阅包。
答案 2 :(得分: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>