【问题标题】:gulp.js livereload with express server?gulp.js livereload 与快递服务器?
【发布时间】:2014-07-03 04:16:12
【问题描述】:

我正在尝试将我的gulpfile.js 设置为在快速服务器上使用 livereload,但运气不佳。我看到了一些例子,但它们似乎与静态文件服务器有关。

http://code.tutsplus.com/tutorials/gulp-as-a-development-web-server--cms-20903 http://rhumaric.com/2014/01/livereload-magic-gulp-style/

所以我有一个app.js 文件,它使用jade 文件等执行标准快递服务器。我想做的是让它与gulp.js 启动时的livereload 一起工作。

app.set('port', process.env.PORT || 3000);
    var server = app.listen(app.get('port'), function() {
    debug('Express server listening on port ' + server.address().port);
});

有很多插件,例如gulp-livereloadconnect-livereloadgulp-connectgulp-watch,那么我该如何连接呢?

【问题讨论】:

标签: node.js express gulp livereload


【解决方案1】:

我已经添加了代码

  1. 检测服务器文件的变化并通过nodemon重新加载服务器

  2. 在进程重新加载后等待几秒钟,以便让服务器有时间运行其初始化代码。

  3. 触发 livereload 服务器的更改

注意 1:在调用“服务”任务之前,您的构建还应该包括一个 livereload 服务器并将 livereload 脚本附加到 html 文件

注意 2:这是一个永不结束的异步任务,不要将其用作其他任务的依赖项


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
    });
});

【讨论】:

  • 如果包含其中的 livereload 部分将会非常有帮助。看起来你的可能是这里最好的解决方案,但它并不完整。
  • 请注意,如果您根据文档规范调用 livereload.changed(),这可能会有所帮助。 npmjs.com/package/gulp-livereload#livereloadchangedpath 因此,如果这样做,您将需要添加一个字符串或一个带有路径的对象。 @andrei 的答案调用 lr listen after,这可能也有效地重新加载(livereload 部分)。我有一个使用复杂手表的代码库并在此基础上构建示例,其中有很多相关的 gulp 任务github.com/brian-lamb-software-engineer/expressBuilder/tree/…
【解决方案2】:

这是我的解决方案:

//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]
        }
      });
    });
});

您还需要在 express 服务器中包含 connect-livereload:

app.use(require('connect-livereload')());

在 bodyParser 之前包含它。我已经读过,如果您有 chrome 实时重新加载扩展程序,则不需要这样做。

【讨论】:

    【解决方案3】:

    gulp-express 适合您。它使用 livereload 将您的 express 脚本作为服务器运行!

    【讨论】:

    • gulp-express hs 移至 gulp-live-server,它本身在 require() 上的实际服务器文件存在问题,并且还需要重新加载浏览器。将 nodemon 与 livereload 或 gulp-live-server 和 watch 混合使用似乎是一个解决方案。
    【解决方案4】:

    我遇到了同样的问题,但找不到任何相关内容。我的解决方案以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']);
    });
    

    您需要安装 tiny-lrasyncgulp-utilgulp-load-plugins 软件包才能使此示例正常工作。 我想我会为它创建一个单独的 Gulp 插件 =)

    【讨论】:

      【解决方案5】:

      查看gulp-nodemon,它会在代码更改时重新启动您的服务器。

      例子:

      gulp.task('develop', function () {
        nodemon({ script: 'app.js', ext: 'html js' })
          .on('restart', function () {
            console.log('restarted!')
          })
      })
      

      【讨论】:

      • 对于我的 express 4 应用程序,一旦我将 app.js 更改为 bin/www,我就很成功了。谢谢!
      • 他没有要求重启服务器。他要求 livereload,这意味着在文件更改时重新加载浏览器。
      • 你到了一半 kwcto,然后结合 nodemon 和 livereload 解决了重新加载服务器和浏览器的问题。
      【解决方案6】:

      实时重新加载应该适用于任何 nodejs 脚本。这是一个很好的gist

      【讨论】:

      • 用于浏览器,但不适用于服务器。对于 requires() 等,我很难让它正确触发服务器重新加载。
      【解决方案7】:

      实时重新加载浏览器的前端和后端更改。也可以选择不使用 Gulp。然后,正确的包组合是“livereload”、“connect-livereload”和“nodemon”的一些帮助。以下是他们的合作方式:

      • livereload打开高端口,通知浏览器公共文件发生变化
      • connect-livereload monkey 用连接到这个高端口的 sn-p 修补每个提供的 HTML 页面
      • nodemon 然后用于在更改的后端文件上重新启动服务器

      在 Express 中设置 livereload

      您需要将 Express 设置为启动 livereload 服务器以查看公共目录并在 nodemon 引起的重启期间 ping 浏览器:

      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());
      

      用 nodemon 启动 Express

      然后您将使用 nodemon 启动服务器,例如,使用专用的监视脚本 npm run watch

      这里的关键点是忽略已经被 livereload 监视的公共目录。您还可以配置具有非默认扩展名的文件,例如 pug 和 mustache。

      "scripts": {
        "start": "node ./bin/www",
        "watch": "nodemon --ext js,pug --ignore public"
      },
      

      您可以在"Refresh front and backend changes to browser with Express, LiveReload and Nodemon."阅读更长的解释

      【讨论】:

        【解决方案8】:

        你可以在http://github.com/arvsr1988/gulp-expressjs-setup看到我使用的设置

        【讨论】:

          猜你喜欢
          • 2015-12-23
          • 2013-11-18
          • 2019-10-21
          • 2015-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-15
          相关资源
          最近更新 更多