客户端请求以前的webpack build发出的文件

时间:2018-01-17 23:46:43

标签: webpack webpack-2

我正在让webpack在输出包filename中包含一个哈希值,用于缓存失效。当我将构建推送到生产时,发送包含对先前构建的哈希的引用的html文件的客户端将请求该文件。与此同时,如果新版本的文件已替换旧文件,那么这些资产请求将为404。

示例:

  • 服务器包含bundle.abc123.js
  • 浏览器请求index.html,其中包含<script src="bundle.abc123.js>
  • index.html已发送至浏览器
  • 推出新版本。 bundle.abc123.js已被删除(例如,通过clean-webpack-plugin。新捆绑生成为bundle.def456.js
  • 浏览器接收并解析index.html。浏览器请求bundle.abc123.js
  • server自然返回js文件的404响应

我需要清理/dist目录,这样我就不会累积所有旧的构建文件。我希望用户在构建完成后很快就会使用旧的引用来为旧文件提供服务。

有没有办法清除所有早于以前版本的文件的目录? (我宁愿不将文件移动到/previous目录并乱用请求重写。)

示例:

  • 首次构建会创建a.js
  • 下一次构建离开a.js并添加b.js
  • 下一个版本会删除a.js,离开b.js,然后添加c.js
  • 下一次构建只会生成c.jsd.js,依此类推

1 个答案:

答案 0 :(得分:0)

我不知道这个解决方案是否理想,但这是我最终的目标。另外,我确信可以通过编写webpack插件来完成,但是在我用MVC框架的语言实现它之前我还没写过,我用的是,把它放在启动/重新启动例程中。无论哪种方式,它都是您希望在发出/dist文件后发生的事情。

  • 读取/assets/manifest.json,其中包含当前和以前文件的列表
  • 从manifest.json中列出的/ assets中删除文件&gt;前
  • 更新manifest.json&gt;之前的manifest.json&gt;的内容电流
  • 更新manifest.json&gt;当前的内容为/ dist
  • 将更新后的manifest.json文件写入磁盘
  • 将/ dist的内容复制到/ assets(保留当前存在的文件)

所以最后,尽管webpack将其工件发送到/dist,但标记中的所有srchref引用都引用/assets,这是真正的交易。我编写的post-webpack代码生成manifest.json文件以及上面提到的其他步骤。

这将维护当前和之前构建的文件(n和n-1),所有这些文件都在同一文件夹中。不需要重写或查找:只需维护文件,直到下一次构建结束,此时n-1个文件将成为n-2个文件并被清除。

如果有人不喜欢长时间暴露旧文件的想法,你可以将清理移动到一个进程,该进程在构建之后使用你想要的任何方法执行任意时间。