2014-09-06 92 views
0

我有YUI项目是mavenized。当我们发布新的YUI代码时,它不会立即反映在浏览器中,直到您在浏览器上执行SHIFT + REFRESH为止。Yui无效javascript版本缓存与新版本

我一直在用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中?

回答

0

我们使用@blicksky答案的变体。我们将自己的组合装载器构建为一个servlet。

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

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

该方法为我们提供了很好的服务,并且使我们对如何提供文件以及提高加载时间进行了非常细致的控制。

+0

谢谢。这看起来很详细。我将不得不单独消化每一步,因为我还没有使用组合加载器。对于缓存破坏,我修改了所有的URL。js文件在Maven构建过程中添加一个像这样的GIT哈希(fullpath:'resources/js/32kdf23rweqeqe/userPermUtil.js')。所以我不得不要求maven在构建过程中将.js文件复制到这个新位置。我猜ResourceLoaderAware会取消将js文件复制到基于散列的文件夹的不必要步骤。 – makcalif 2014-09-09 04:23:17

2

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

您的构建过程还需要动态修改您的YUI.GlobalConfig对象,也许使用令牌替换,以便YUI加载器可以在那里找到您的文件。这可以通过设置base配置选项(请参阅http://yuilibrary.com/yui/docs/yui/loader.html#configuration-options)在一个位置完成,但由于您为每个文件指定了fullpath,因此您必须设置每个文件。 (您正在使用SHIFT + REFRESH进行操作),但是您的用户会分别缓存每个版本的资源。

+0

我从理论上理解解决方案,这就是我在某些问题上实现的方法。我正在寻找更多具体的Maven步骤,因为这是很多人会做的事情。另外,我遇​​到了一些问题,如果我使它工作,.js文件需要放在像'abcd1234'这样的文件夹下,那样我就不能在爆炸模式下运行我的战争,因为爆炸模式不使用maven。 – makcalif 2014-09-08 03:48:10