требуемые модули 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 2

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