Gatsby 中的缓存清除 page-data.json 文件

mil*_*nui 8 browser-cache node.js gatsby

我有一个盖茨比生成的网站,我在其中替换了主页的内容。

不幸的是,以前的版本提供了/page-data/index/page-data.json不正确的缓存控制标头,导致/page-data/index/page-data.json缓存在客户端浏览器上(除非强制刷新,否则会显示陈旧的数据)。我还发现 page-data.json 文件没有经过哈希处理(请参阅https://github.com/gatsbyjs/gatsby/issues/15080)。

我已经更新了缓存控制标头,以便从现在起版本不会被缓存,但这对现在拥有缓存版本的客户端没有帮助。

我该如何强制客户端请求该文件的最新版本?

mil*_*nui 6

我最终到达了那里......这是我的gatsby-node.js

const hash = md5(`${new Date().getTime()}`)

const addPageDataVersion = async file => {
  const stats = await util.promisify(fs.stat)(file)
  if (stats.isFile()) {
    console.log(`Adding version to page-data.json in ${file}..`)
    let content = await util.promisify(fs.readFile)(file, 'utf8')
    const result = content.replace(
      /page-data.json(\?v=[a-f0-9]{32})?/g,
      `page-data.json?v=${hash}`
    )
    await util.promisify(fs.writeFile)(file, result, 'utf8')
  }
}

exports.onPostBootstrap = async () => {
  const loader = path.join(__dirname, 'node_modules/gatsby/cache-dir/loader.js')
  await addPageDataVersion(loader)
}

exports.onPostBuild = async () => {
  const publicPath = path.join(__dirname, 'public')
  const htmlAndJSFiles = glob.sync(`${publicPath}/**/*.{html,js}`)
  for (let file of htmlAndJSFiles) {
    await addPageDataVersion(file)
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我有帮助!我还将在答案中包含“require”,以便 NodeJs 新手(我的情况)能够复制粘贴答案。一开始我有点困惑,因为它给了我“md5未定义”等错误。谢谢你! (3认同)

小智 2

除了单独访问每个客户端浏览器并清除其缓存之外,没有任何其他方法可以使所有客户端缓存失效。如果您的网页位于您可以控制的 CDN 后面,您可以在 CDN 级别强制失效,这样新客户端将始终被路由到最新的网页,即使 CDN 缓存了预先存在的过时副本。