требуемые модули node / express не обновляются с помощью chokidar?
Я прочитал здесь ряд вопросов и ответов, касающихся чокидара, однако я все еще в тупике... так что буду очень признателен всем, кто может отладить мой конкретный фрагмент.
Я запускаю приложение basic Express node на localhost: 3000.
Точка входа-это приложение.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;
И внутри ./ маршруты / игра.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;
Обновление игры.js (например, изменение "test-4" на "test-5") не влияет на приложение без перезагрузки сервера. Я предполагал, что чокидар позволит мне это сделать. обновить игру.js и отразились ли изменения на следующей загрузке страницы?
Для справки игра.шаблон njk выглядит следующим образом:
{% extends "app.njk" %}
{% block pageContent %}
<div id="pageContent" class="container">
This. is. game. {{ also }}
</div><!-- /#pageContent .container -->
{% endblock pageContent %}
Если я обновляю шаблон, он обновляется мгновенно (согласно утверждению nunjucks watch: true), но не повезло с обновлением also 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