首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Metalsmith插件:为什么tiny-lr服务器启动了两次?

Metalsmith插件:为什么tiny-lr服务器启动了两次?
EN

Stack Overflow用户
提问于 2014-07-13 19:49:03
回答 1查看 339关注 0票数 1

我正在尝试编写一个metalsmith plugin,它可以在文件更改时重新构建文件,并通过tiny-lr重新加载页面。

监视和重新构建工作正常,但是当文件发生更改时,tiny-lr服务器会再次启动-这会导致一个错误,因为服务器已经准备好运行。

下面是插件代码:

代码语言:javascript
复制
module.exports = plugin;

var gaze    = require('gaze'),
    chalk   = require('chalk'),
    tinylr  = require('tiny-lr');


function plugin(){
  return function(files, metalsmith, done){

    var port    = 35729,
        server  = tinylr();

    server.listen(port, function(){
      console.log(chalk.cyan('Listening on port', port));
    });

    gaze(['templates/*', 'src/**/*'], function(err, watcher) {

      console.log(chalk.green('Watching files'));

      this.on('changed', function(filepath) {

        console.log(chalk.red(filepath) + chalk.blue(' was changed.'));
        console.log(chalk.yellow('Rebuilding files...'));

        metalsmith.build(function(err, files){
          console.log(chalk.blue('Build successful'))
        });
      });
    });
    done();
  }
}

更改文件时的控制台输出:

代码语言:javascript
复制
Listening on port 35729
Watching files
/Users/benjamin/metal/src/content/index.md was changed.
Rebuilding files...

... Uhoh. Got error listen EADDRINUSE ...
Error: listen EADDRINUSE
    at errnoException (net.js:901:11)
    at Server._listen2 (net.js:1039:14)
    at listen (net.js:1061:10)
    at Server.listen (net.js:1127:5)
    at Server.listen (/Users/benjamin/Desktop/metal/node_modules/metalsmith-watchall/node_modules/tiny-lr/lib/server.js:145:15)
    at /Users/benjamin/Desktop/metal/node_modules/metalsmith-watchall/index.js:26:12
    at next (/Users/benjamin/Desktop/metal/node_modules/metalsmith/node_modules/ware/lib/index.js:68:8)
    at /Users/benjamin/Desktop/metal/node_modules/metalsmith-templates/node_modules/async/lib/async.js:119:25
    at /Users/benjamin/Desktop/metal/node_modules/metalsmith-templates/node_modules/async/lib/async.js:24:16
    at convert (/Users/benjamin/Desktop/metal/node_modules/metalsmith-templates/lib/index.js:67:32)
Watching files
Build successful

为什么服务器会第二次启动?

如何防止它被启动?

奖励问题:

为什么控制台消息的顺序与我查看代码时所期望的顺序不同?尤其是为什么在“看文件”之后会出现“构建成功”?我认为它应该直接出现在“正在重建文件...”之后。

EN

回答 1

Stack Overflow用户

发布于 2014-08-06 19:52:15

仍然不知道为什么上面的例子不能工作,但我想出了一些可以工作的东西(感谢chuck提醒我发布一个解决方案……)

代码语言:javascript
复制
module.exports = plugin;

var gaze    = require('gaze'),
    chalk   = require('chalk'),
    tinylr  = require('tiny-lr');


var watchall = {
  running: false
};

function startLiveReloadServer(){
  var port    = 35729,
      server  = tinylr();
  server.listen(port, function(){
    console.log(chalk.cyan('Listening on port', port));
  });
  watchall.server = server;
};

function startWatcher(metalsmith, files, done){
  gaze(['templates/*', 'src/**/*'], function(err, watcher) {
    console.log(chalk.green('Watching files'));
    this.on('changed', function(filepath) {
      console.log(chalk.red(filepath) + chalk.blue(' was changed.'));
      console.log(chalk.yellow('Rebuilding files...'));
      metalsmith.build(function(err, files){
        console.log(chalk.blue('Build successful'))
        watchall.server.changed({body:{files:Object.keys(files)}});
      });
    });
  });
  done();
};

function plugin(){
  return function(files, metalsmith, done){
    if ( watchall.running === false ) {
      startLiveReloadServer();
      startWatcher(metalsmith, files, done);
      watchall.running = true;
    } else {
      done();
    };
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24722357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档