Я давно решил для себя этот вопрос — и описал его здесь:
https://kirick.me/blog/how-to-ajax-sites
Вкратце: сервер отдаёт страницы "как есть" и ничего не знает, что он, оказывается, аякс-сайт. То есть при открытии сайта с нуля он грузится как обычный. А вот потом при переходе по ссылкам контент грузится через аякс, и клиентский скрипт препарирует получаемый контент:
1. вычленяет оттуда
<body>
и заменяет им содержимое страницы;
2. достаёт из
<head>
тэг
<title>
;
3. достаёт из
<head>
все скрипты и стили и добавляет в
<head>
страницы только те, которых там ещё нет.
Асинхронная подгрузка ресурсов, несомненно, нужна, но это отдельная тема, используйте плагин по вкусу. И, например, пусть этот аякс-загрузчик не вставляет скрипты и стили в страницу, а скармливает их этому плагину, а он уже разбирается.
И ещё один момент — если на загруженной аяксом странице требуется подключить дополнительный файл стилей, то будет некоторое время каша из элементов, пока стиль подключается. Но решение простое — вставить критические для отображения стили в тэг
<style>
прямо в страницу — и HTTP-запрос сэкономите, и время загрузки.