如何解决缓存中提供的javascript文件的问题?

Dor*_*ora 7 javascript jquery

当服务器端代码更新(与JavaScript相关)时,旧的JavaScript文件从缓存中提供.

我需要一个解决方案,旧的JavaScript文件会更新到更新的版本.更新服务器上的文件后,需要使浏览器缓存(与JavaScript相关)无效.

我有这个问题的以下解决方案.

var randomnumber=Math.floor(Math.random()*10000);

var scriptfile='http://www.whatever.com/myjs.js?rnd='+randnumber;
Run Code Online (Sandbox Code Playgroud)

但是,只有当JavaScript文件有更新而不是每次重新加载页面时,我才需要清除缓存.

Pek*_*ica 15

大多数站点 - 包括Stack Overflow - 使用其版本控制系统中的修订号:

var scriptfile='http://www.whatever.com/myjs.js?rnd='+revision_number;
Run Code Online (Sandbox Code Playgroud)

每当修订版本发生更改时,浏览器都会指向"新"JavaScript文件.

您也可以手动执行此操作,方法是在某处的中心位置指定版本号,并将该版本号添加到每个脚本调用中.更新JavaScript的一部分时,只需增加版本号即可.

第三种方法是检查您所包含的JavaScript文件的"上次修改"时间,并从中构建时间戳:

var scriptfile='http://www.whatever.com/myjs.js?version=20100803';
Run Code Online (Sandbox Code Playgroud)

但这需要服务器端脚本,并且可能在每个页面请求上都太昂贵.


Jes*_*lon 7

使用版本号或更新时间戳,而不是使用随机数,因此它变为:

var script = 'http://mysite.com/the_script.js?2010-08-02';

// or

var script = 'http://mysite.com/the_script.js?v1.20';
Run Code Online (Sandbox Code Playgroud)

如果您不想手动更新,可以使用make搜索的脚本并使用版本号替换标记:

var script = 'http://mysite.com/the_script.js?{{script_update_date}}';

// have a shell script find and replace the above {{ }} tag with the date or such 
// when deploying to production
Run Code Online (Sandbox Code Playgroud)

或者,如果您的版本控制系统使用它(如SVN),您可以将其替换为修订号,以便在签入新脚本时更新它.