Как я могу заставить полный refre sh (повторная загрузка кэшированных файлов) после каждой публикации - PullRequest
0 голосов
/ 17 марта 2020

У меня есть сайт, созданный с использованием ReactJS, который постоянно развивается, и я публикую sh новую версию и создаю почти каждый день, у людей, которые используют мой сайт, есть такая проблема, что даже если они делают F5 и обновите страницу sh, все равно Memory Cached, например, файлы chunk, что означает, что они не получают последние изменения, и им необходимо вручную очистить кэш браузера, чтобы получить некоторый результат!
Так что здесь мой вопрос, как я могу сказать своему приложению, что «эй, это новая сборка», поэтому, если происходит refre sh F5, он загружает все и не использует кэшированные файлы
Любое решение высоко ценится
Спасибо.

Обновление 01: Я только что попытался изменить свой файл jsconfig.json, в надежде изменить имя чанка примерно так:

{
    "compilerOptions": {
        "baseUrl": "src"
    },
    "include": [
        "src"
    ],
    "output": {        
        "chunkFilename": "[name].chunkv2.0.js"
    }       
}

Но ни один из чанков были разные, то есть их имя было все еще [somehash].chunk.js
Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

как я могу сказать своему приложению, что "эй, это новая сборка"? так что если происходит refre sh F5, он загружает все и не использует кэшированные файлы

, конечно, вы можете

в надежде изменить имя чанка как-то так main.bad98a53.chunk_v0.1.j

без необходимости

Как вы можете уведомить об изменениях на сайте?

сначала вы должны использовать [contenthash] для имени чанка в веб-пакете, и когда вы публикуете sh новую версию, contenthash изменится, если содержимое чанка изменилось.

секунду, используйте fetch для получения текстового содержимого HTML, которое содержит сценарии и сравнить его с предыдущим, как строка. Текст будет выглядеть так:

"
<html>
  //...
  <script src="main.11bsfas21.js"></script>
</html>
"

// after publish
"
<html>
  //...
  <script src="main.aagssh.js"></script>
</html>
"

если есть разница, выполните location.reload(true)

код будет выглядеть так:


let previous;
let htmlContent;

const diff = (callback) => {
  if (!previous) {
    previous = htmlContent;
    return
  }
  if (previous === htmlContent) return

  callback()
}

const loadContent = async () => {
  // get the html content
  const content = await window.fetch(location.host).then(res => res.text())
  return content
}

setTimeout(() => {
  loadContent()
     .then(content => {
       htmlContent = content;
       diff(() => location.reload(true))
     })
}, 1000)

это просто пример, вы Можно настроить обратный вызов, как показать компонент модели. Основная работа сравнивает текст HTML, если contenthash изменится, текст HTML не будет равен и вызовет обратный вызов.

use location.reload(true), что заставит веб-сайт использовать последний источник, а не использовать ресурсы кэша.

0 голосов
/ 17 марта 2020

Ваш лучший выбор - улучшить конвейер сборки и убедиться, что вы используете кеш браузера. Прочитайте Стратегии уничтожения кеша , хотя это нацелено на CSS, принципы применимы и к JavaScript.

Если вы используете Webpack, тогда ознакомьтесь с собственной документацией на топи c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...