2017-05-13 30 views
1

我已阅读了关于chokidar的一些问题和答案,但是我仍然难倒了......所以真的很感谢能调试我的特定片段的任何人。所需节点/快递模块不与chokidar更新?

我在localhost:3000上运行一个基本的Express节点应用程序。

入口点是app.js:

const express = require('express'); 
const path = require('path'); 
const favicon = require('serve-favicon'); 
const logger = require('morgan'); 
const cookieParser = require('cookie-parser'); 
const bodyParser = require('body-parser'); 
const clearRequire = require('clear-require'); 

const production = process.env.NODE_ENV === 'production'; 

const app = express(); 

// config nunjucks 
const nunjucks = require('nunjucks'); 
nunjucks.configure('views', { 
    autoescape: true, 
    watch: true, 
    nocache: true, 
    express: app 
}); 

// Routes for Express into modules 
var index = require('./routes/index'); 
var game = require('./routes/game'); 

if (!production) { 
    const chokidar = require('chokidar'); 
    const watcher = chokidar.watch('./routes'); 

    watcher 
     .on('ready',() => console.log('Scan complete. Ready for changes.')) 
     .on('change', path => { 
      var clearPath = "./" + path.split(".")[0]; 
      clearRequire(clearPath); 
     }); 
} 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'njk'); 

// uncomment after placing your favicon in /public 
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 


app.use('/', index); 
app.use('/game', game); 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handler 
app.use(function(err, req, res, next) { 
    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 

    // render the error page 
    res.status(err.status || 500); 
    res.render('error', { test: 'test'}); 
    next(); 
}); 

module.exports = app; 

和./routes/game.js内:

var express = require('express'); 
var router = express.Router(); 

/* GET game page. */ 
router.get('/', function(req, res) { 
    res.render('game', { title: 'Game', also: 'test-4' }); 
}); 

module.exports = router; 

更新game.js(例如,改变 “测试-4” 到“测试-5“)对应用程序没有影响,无需重新启动服务器。我曾假设chokidar会允许我更新game.js,并在下一页加载时反映这些变化?

供参考game.njk模板看起来是这样的:

{% extends "app.njk" %} 

{% block pageContent %} 
    <div id="pageContent" class="container"> 
     This. is. game. {{ also }} 
    </div><!-- /#pageContent .container --> 
{% endblock pageContent %} 

如果我更新模板,它会立即更新(按照nunjucks观看:真实的说明),但是,也VAR更新没有运气。

感谢您的帮助。

回答

1

在清除缓存时,您不会更新game路由。缓存刷新将适用于新需要的模块,但对已经需要的模块不起作用。所以你需要在清除缓存后再次要求游戏路线。

watcher 
     .on('ready',() => console.log('Scan complete. Ready for changes.')) 
     .on('change', path => { 
      var clearPath = "./" + path.split(".")[0]; 
      clearRequire(clearPath); 

      //Move this code elsewhere or not... 
      if(path == "routes/game.js"){ 
       //renew game route 
       game = require("./routes/game"); 
      } 
     }); 

,然后改变:

app.use('/game', game); //Changing game won't have any effect 

要:

app.use('/game', function(req, res, next){ 
    game(req, res, next); //This game will have the renewed route 
}); 

在任何情况下,我会建议使用nodemon

Nodemon是一个实用程序,它将监视源中的任何更改并自动重新启动服务器。完美的发展。使用npm进行安装。

只需使用nodemon代替节点来运行您的代码,并且现在您的代码在您的代码更改时将自动重新启动。要安装, 得到的node.js,然后从你的终端运行:

npm install -g nodemon 

然后:

nodemon server.js 
+1

嘿感谢这么多这一点。我已经开始尝试使用nodemon而不是chokidar,但是当我启动它时,它并没有正确运行服务器,直到我意识到express已经从bin/www开始应用程序(您的文章促使我探索并最终确定) –

+0

很高兴帮助您,与nodemon玩得开心!它真的是要走的路! –