Как стать автором
Обновить

Комментарии 7

Это костыль для фикса проблем с SEO для костыля созданного для фикса проблем СЕО для Vue.js?

Не назвал бы серверный рендеринг костылём... Помимо решения проблем SPA с SEO он также ускоряет доставку контекнта пользователю: обращения к апи происходят гораздо быстрее, если он запущен где-то рядом, конечно. Поэтому пользователь при входе на сайте получает отрендериную страницу зачастую в разы быстрее, чем без ssr...

А в данной статье описан скорее костыль для гугл кеша.

Расскажите пожалуйста о случаях когда SPA нужно СЕО и при этом нельзя вынести это СЕО в несколько статических страниц, для которых будет применяться чисто серверный рендеринг.
Конечно можно назвать это как угодно, но это реально работает.

Для себя нашёл решением, динамически проставлять 'mode' для роутера, в случае если 'window.location' это урл какого-либо кеша, то 'mode: "abstract"', а после создания роутера делать 'router.push' с верным урлом, достаточно удобно брать 'window.__NUXT__.state.route.fullPath'

...
const cacheUrlMatchers = [
  {
    hostname: 'yandexwebcache.net',
    pathname: '/yandbtm',
  },
  {
    hostname: 'webcache.googleusercontent.com',
    pathname: '/search',
  },
];
...
const isCachedUrl = (fullUrl = '') => {
  if (process.server) return null;

  const url = new URL(fullUrl);

  return cacheUrlMatchers
    .some(({ hostname, pathname }) =>
      url.hostname === hostname && url.pathname === pathname
    );
};
export function createRouter(ssrContext, createDefaultRouter, routerOptions) {
  const options = routerOptions || createDefaultRouter(ssrContext).options;

  // Fix webcache routing
  const isCache = process.client && isCachedUrl(window.location.href);
  const mode = isCache
    ? 'abstract'
    : options.mode;

  const resultOptions = {
    ...options,
    mode,
  };
  const router = new Router(resultOptions);

  // Set init route in cache
  if (isCache && window.__NUXT__) {
    const { route } = window.__NUXT__.state;

    router.push(route.fullPath);
  }

  return router;
}

Gist

Не могу удалять/редактировать, поэтому дополняю, т.к. предыдущий код перестал работать где-то с 2.14.8 по 2.15.7

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.