所需的节点/快递模块不更新与chokidar?

我已经阅读了关于chokidar的一些问题和答案,但是我仍然难住…所以真的很感谢任何人可以debugging我的具体片段。

我在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(例如,将“test-4”更改为“test-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更新。

感谢任何帮助。

当你清除caching时,你不会更新game路线。 caching刷新将适用于新需要的模块,但不会对已经需要的模块有任何效果。 所以你需要清除caching后再次要求游戏路线。

 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来运行你的代码,现在你的程序会在代码改变时自动重启。 要安装,获取node.js,然后从terminal运行:

 npm install -g nodemon 

接着:

 nodemon server.js