Yui使用新版本无效的javascript浏览器缓存

时间:2014-09-06 05:46:55

标签: maven browser-cache release-management yui3

我有YUI项目被mavenized。当我们发布新的YUI代码时,它不会立即反映在浏览器中,直到您在浏览器上执行SHIFT + REFRESH。

我一直在使用YUI模块方法来加载这样的脚本:

YUI.GlobalConfig = {
   modules: { 

 'manual-entry-util': {
        fullpath: 'resources/js/common.js',
        requires: [ 'node']             
    },
    'user-perm-util' : {
        fullpath: 'resources/js/userPermUtil.js',
        requires: [ 'node',  'io-base', 'json', 'json-stringify']       
    }, 
    'file-upload-custom' : {
        fullpath: 'resources/js/fileUploadCustom.js',
        requires: [ 'gallery-datatable-selection','event-custom', 'node']       
    },
    'icsd-uploader' : {
        fullpath: 'resources/js/icsdUploader.js',
        requires: [ 'uploader', 'node']     
    },
    'ui-util' : {
        fullpath: 'resources/js/uiUtil.js',
        requires: [ 'node']     
    } 
    } 
}; 

我认为我们需要修改网址以获得某种变量,以便浏览器可以获取新代码。

有没有办法通过maven或其他工具自动执行此过程。例如。哪个可以从.js文件的内容生成哈希值,然后将其添加到.js文件的URL?

2 个答案:

答案 0 :(得分:2)

我的方法是在资源路径的开头包含缓存清除值。适当的值可能是当前缩写的提交哈希值或修订号,或者如果使用CI工具,则是当前的内部版本号。您的构建过程会将您的所有资产部署到以此值命名的目录中,因此,如果您当前的提交哈希值为abcd1234,那么您最终会得到resources/abcd1234/js/之类的文件。

您的构建过程还需要动态修改YUI.GlobalConfig对象,可能使用令牌替换,以便YUI Loader可以在那里找到您的文件。这可以通过设置base配置选项(请参阅http://yuilibrary.com/yui/docs/yui/loader.html#configuration-options)在一个位置完成,但由于您为每个文件指定了fullpath,因此您必须设置每个这些

在开发过程中,您必须继续硬重新加载页面(正如您现在使用SHIFT + REFRESH所做的那样),但您的用户将分别缓存每个版本的资源。

答案 1 :(得分:0)

我们使用@blicksky答案的变体。我们构建了自己的组合加载器作为servlet。

首先,我们将YUI设置为自己的Maven项目。版本标记反映了YUI的发布,因此您的版本看起来像<version>3.17.2</version。我们有一个内部仓库,因此YUI项目的任何更新都会在那里发布。 YUI项目只包含/ src / main / resources / META-INF / resources中的YUI副本。在这方面,它与WebJars project采用的方法非常相似。

Combo-loader负责将YUI文件连接在一起以获得更好的加载性能,并且还负责添加缓存破坏URL参数。在生产中,该参数是构建ID,但在开发中,该参数可以是随机数,以便每次都加载资源。我们在服务器上使用Spring,因此我们使用Classpath来解析来自上面提到的YUI Maven项目的YUI文件。基本要点是我们的Servlet实现了ResourceLoaderAware,然后可以使用ResourceLoader来获取要提供的YUI文件。

这种方法很好地帮助了我们,并且允许我们对文件的处理方式进行非常精细的控制,以及改善加载时间。