J'essaie de configurer mon gulpfile.js
pour utiliser livereload sur un serveur express sans trop de chance. Je vois des exemples là-bas, mais ils semblent être liés à un serveur de fichiers statique.
http://code.tutsplus.com/tutorials/gulp-as-a-development-web-server--cms-209http://rhumaric.com/2014/01/livereload-magic-gulp-style /
J'ai donc un app.js
fichier qui fait le serveur express standard avec des fichiers jade, etc. Ce que je veux faire, c'est le faire fonctionner avec livereload à partir d'un démarrage gulp.js.
app.set('port', process.env.PORT || 3000);
var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
});
Il existe de nombreux plugins comme gulp-livereload
, connect-livereload
, gulp-connect
, gulp-watch
alors comment est-ce que je peux le brancher?
J'ai ajouté du code qui
Détecte les changements dans les fichiers du serveur et recharge le serveur via nodemon
Attend quelques secondes après le rechargement du processus afin de donner au serveur le temps d'exécuter son code d'initialisation.
Déclenche un changement dans un serveur de chargement de foie
note 1 : Votre build doit également inclure un serveur livereload et attacher des scripts livereload aux fichiers html avant d'appeler la tâche 'serve'
note 2 : il s'agit d'une tâche asynchrone qui ne se termine jamais, ne pas l'utiliser comme une dépendance à d'autres tâches
gulp.task('serve', function (cb) {
nodemon({
script : <server start file>,
watch : <server files>
//...add nodeArgs: ['--debug=5858'] to debug
//..or nodeArgs: ['--debug-brk=5858'] to debug at server start
}).on('start', function () {
setTimeout(function () {
livereload.changed();
}, 2000); // wait for the server to finish loading before restarting the browsers
});
});
Voici ma solution:
//gulpfile.js:
var gulp = require('gulp');
var nodemon = require('gulp-nodemon');
var server = require('gulp-express');
var lr = require('tiny-lr')();
gulp.task('default', function () {
nodemon({
script: 'server.js'
})
.on('restart', function () {
console.log('restarted!')
});
lr.listen(35729);
gulp.watch('server/**/*', function(event) {
var fileName = require('path').relative('3000', event.path);
lr.changed({
body: {
files: [fileName]
}
});
});
});
Vous devez également inclure connect-livereload dans votre serveur express:
app.use(require('connect-livereload')());
Incluez-le avant bodyParser. J'ai lu que cela n'est pas nécessaire si vous avez l'extension chrome live reload.
gulp-express est la bonne chose pour vous. Il exécute votre script express en tant que serveur, avec livereload!
J'ai eu le même problème et je n'ai rien trouvé de similaire. Ma solution se retrouve avec le morceau de code suivant dans Gulpfile
:
var fork = require('child_process').fork;
var tinyLr = require('tiny-lr');
var async = require('async');
var plugins = require('gulp-load-plugins')({ lazy: false });
var lr = null;
var lrPort = 35729;
var buildDir = 'build';
var serverAppFile = path.join(__dirname, 'build/server/app.js');
// This guy starts and stops nodejs process which runs our Express app
var app = {
start: function(callback) {
process.execArgv.Push('--debug');
var instance = app.instance = fork(serverAppFile, {
silent: true
});
app.dataListener = function(data) {
var message = '' + data;
// Assume that server is started when it prints the following to stdout
if (message.indexOf('Express server listening on port') === 0) {
callback();
}
};
instance.stdout.on('data', app.dataListener);
instance.stdout.pipe(process.stdout);
instance.stderr.pipe(process.stderr);
},
stop: function(callback) {
app.instance.stdout.removeListener('data', app.dataListener);
plugins.util.log('Killing Express server with PID', app.instance.pid);
app.instance.kill('SIGTERM');
callback();
}
};
// build-assets task actually processes my client js, less, images, etc and puts them to build dir
// build-server task copies server files (app.js, controllers, views) to build dir
gulp.task('serve', ['build-assets', 'build-server'], function(callback) {
async.series([
app.start,
function(callback) {
lr = tinyLr();
lr.listen(lrPort, callback);
}
], callback);
});
gulp.task('watch', ['serve'], function() {
// Reload page if built files were updated
gulp.watch([
buildDir + '/**/*.handlebars',
buildDir + '/**/*.html',
buildDir + '/**/*.js',
buildDir + '/**/*.css'
], function(event) {
var fileName = path.relative(path.join(__dirname, buildDir), event.path);
plugins.util.log('Detected updated file ' + fileName + ', reloading server and page in browser');
async.series([
// Restart Express server
app.stop,
app.start,
// Send reload notification to browser
function(callback) {
lr.changed({
body: {
files: [fileName]
}
});
callback();
}
]);
});
// Perform build steps on source file modifications
gulp.watch(['app/**/*.js', '!app/**/*.spec.js'], ['build-app-js']);
gulp.watch(['app/**/*.html'], ['build-templates']);
gulp.watch(['app/**/*.less'], ['build-less']);
gulp.watch(['server/**/*.*'], ['build-server']);
});
Vous devrez installer tiny-lr
, async
, gulp-util
et gulp-load-plugins
packages pour que cet exemple fonctionne. Je suppose que je vais créer un plugin Gulp distinct pour cela =)
Pour charger à la fois les modifications avant et arrière du navigateur. Il existe également la possibilité de ne pas utiliser Gulp. Ensuite, la bonne combinaison de packages est "livereload", "connect-livereload" et un peu d'aide de "nodemon". Voici comment ils s'associent:
livereload
ouvre un port haut et informe le navigateur des fichiers publics modifiésconnect-livereload
monkey patches chaque page HTML servie avec un extrait qui se connecte à ce port hautnodemon
est ensuite utilisé pour redémarrer le serveur sur les fichiers backend modifiésConfigurer la charge du foie dans Express
Vous voudrez configurer Express pour démarrer le serveur de chargement du foie en regardant le répertoire public et envoyer une requête ping au navigateur pendant le redémarrage induit par nodemon:
const livereload = require("livereload");
const connectLivereload = require("connect-livereload");
// open livereload high port and start to watch public directory for changes
const liveReloadServer = livereload.createServer();
liveReloadServer.watch(path.join(__dirname, 'public'));
// ping browser on Express boot, once browser has reconnected and handshaken
liveReloadServer.server.once("connection", () => {
setTimeout(() => {
liveReloadServer.refresh("/");
}, 100);
});
const app = express();
// monkey patch every served HTML so they know of changes
app.use(connectLivereload());
Démarrez Express avec nodemon
Ensuite, vous démarrez le serveur avec nodemon, par exemple, avec un script de surveillance dédié npm run watch
.
Le point clé ici est d'ignorer le répertoire public qui est déjà surveillé par livereload. Vous pouvez également configurer des fichiers avec des extensions non par défaut, comme le pug et la moustache, à surveiller.
"scripts": {
"start": "node ./bin/www",
"watch": "nodemon --ext js,pug --ignore public"
},
Vous pouvez lire une explication plus longue dans "Actualiser les modifications avant et arrière du navigateur avec Express, LiveReload et Nodemon."
Jetez un œil à gulp-nodemon qui redémarrera votre serveur lorsque le code change.
Exemple:
gulp.task('develop', function () {
nodemon({ script: 'app.js', ext: 'html js' })
.on('restart', function () {
console.log('restarted!')
})
})
Le rechargement en direct devrait fonctionner avec n'importe quel script nodejs. Voici un bon Gist .