#node.js #reactjs #express #create-react-app #server-side-rendering
#node.js #reactjs #экспресс #create-react-app #рендеринг на стороне сервера
Вопрос:
Я обслуживаю create-react-app build
с помощью Express и добавляю некоторые теги скрипта index.html
перед его обслуживанием. Поскольку я обрабатываю index.html
файл перед подачей, я не хочу, чтобы мое express.static
промежуточное программное обеспечение обрабатывало запросы для /
or /index.html
. Вот что я пытался сделать, чтобы это сработало:
app.use(
[/^/index.html/, /^//],
express.static(path.join(__dirname, "../../build"))
);
app.get("/*", function (req, res) {
// logic to manipulate index.html
res.send($.html());
});
Но это просто дает мне пустой белый экран, даже если вставляется исходный html-код, поэтому я предполагаю, что статическое промежуточное программное обеспечение все еще обрабатывает /
запрос, оно просто перестало обслуживать другие статические ресурсы.
Как мне настроить этот код, чтобы мой express.static перестал переопределять мой /*
маршрут?
Важно, чтобы я сохранил маршрут as /*
, потому что я хочу, чтобы он обрабатывал все маршруты, определенные в react-router в клиентском приложении. Поэтому я не могу переместить express.static
промежуточное программное обеспечение ниже /*
маршрута, иначе это переопределит все запросы на статические ресурсы.
Ответ №1:
Вы можете передать {index: false}
в качестве второго аргумента express.static
, это исключит index.html
отправку из build
каталога.
app.use(express.static(path.join(__dirname, "../../build"), {index: false}));
app.get("*", (req, res) => {
// logic to manipulate index.html
res.send($.html());
});
Ответ №2:
Вы могли бы просто добавить отдельный обработчик для index.html
и /
перед статическим промежуточным программным обеспечением:
function serveIndex(res) {
res.send($.html());
}
app.get(["/index.html", "/"], (req, res) => {
serveIndex(res);
});
app.use(express.static(path.join(__dirname, "../../build")));
app.get("/*", (req, res) => {
serveIndex(res);
});
Комментарии:
1. На самом деле я просто импортировал массив всех маршрутов react-router и
/*
заменил его этим. Затем мне просто нужно было переместитьсяexpress.static
ниже этого обработчика, чтобы заставить его работать. Но это кажется простым обходным путем. Спасибо!