javascript - 如何处理作为 ES6 模块导入的 JavaScript 文件的缓存

标签 javascript browser-cache es6-modules

旧情

以前,如果有可用的新版本,我使用以下方法强制浏览器重新加载我的 JavaScript 文件。

<script src="common.js?version=1337"></script>
<script src="app.js?version=1337"></script>

我的 HTML 是自动生成的(例如使用 PHP),因此很容易实现自动化。

新情况

现在我想使用 ES6 模块并导入我的常用代码。 我的 HTML 变成:

<script src="app.js?version=1337" type="module"></script>

app.js 包含导入:

import {foo, bar} from './common.js';

问题

现在我的问题是:在新场景中如何影响 common.js 的缓存?

我不想在每次编辑 common.js 时都手动编辑 app.js。如果可能的话,我也不想动态生成/预处理我的任何 JavaScript 文件。

最佳答案

简短版本:

只需使用 Webpack , 你可以继续做你的把戏,因为所有的 javascript 都在一个文件中。

长版:

你说你不想预处理你的 javascript 文件。我会重新考虑这种立场。大多数现代网络应用程序(及其相关框架,如 React、Angular、Vue.js)都是使用某种预处理器/打包器构建的,它将应用程序的所有 javascript 捆绑到一个或多个文件中。

这样做有很多很好的理由,我们不需要在这里完全重复,但简而言之,您可以进行类型检查(例如 TypeScript)、linting、tree-shaking、优化、混淆和容易压实。

捆绑的 javascript 通常更小(大幅度)、更快、更正确。它可以缩短加载时间并减少带宽使用,这在当今超过 50% 的网络流量来自移动设备时尤为重要。

虽然这可能有点学习曲线,但这是我们行业的发展方向,并且有充分的理由。之所以没有一种简单的方法在 ES 模块中包含缓存破坏查询参数很重要,可能是因为该语言的设计者认为这是一种反模式。

关于javascript - 如何处理作为 ES6 模块导入的 JavaScript 文件的缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45943972/

相关文章:

javascript - 如何在类似于 Python timeit 的 JavaScript 中计时函数

javascript - 如何根据媒体查询禁用特定脚本?

ios - 使用 Swift iOS 在 SFSafariViewController 中配置浏览器缓存

javascript - 为什么使用默认导入而不是命名导入时我的 ES6 webpack 包更大?

javascript - 单元测试 ECMAScript 模块 (ESM) 和模拟本地状态?

javascript - 如何使用 Sinon 监视导入的函数?

javascript - 如何选择 d3 中的前两个元素并对它们应用过渡?

javascript - (仅限 Safari)Axios 请求不会将 cookie 发送到 Node.js/Express REST API

google-chrome - Chrome 与 Firefox 后台缓存

browser-cache - 为什么浏览器缓存 http ://example. com 的 301 重定向并将其用于 http ://example. com :8080?