部署后如何强制客户端重新加载?

And*_*rew 15 javascript client node.js socket.io mean-stack

我正在使用MEAN堆栈(mongo,express,angular和node).我每隔几天就会相对频繁地部署到生产中.我担心的是我有时会更改客户端代码和API,我宁愿不必确保API与以前版本的客户端代码的向后兼容性.

在这种情况下,当我推向生产时,确保所有客户重新加载的最有效方法是什么?我已经看过,例如Evernote有一个弹出窗口,上面写着一些内容,请重新加载浏览器以获取最新版本的Evernote.我想做类似的事情...我需要沿着socket.io或sock.js的路径走下去,还是我错过了一些简单的东西,有一种更简单的方法来实现这一点?

Mar*_*thy 8

更新: AppCache于2015年夏季被弃用,因此以下不再是最佳解决方案.新建议是改为使用服务工作者.但是,服务工作者目前仍然在IE和Safari中使用粗略的(读取:可能没有)支持.

或者,许多构建工具现在无缝地结合缓存清除和文件"版本控制"技术来解决OP问题.WebPack可以说是这个领域的当前领导者.


这可能是使用HTML5的AppCache的一个很好的用例

您可能希望将其中一些步骤自动化到您的部署脚本中,但这里有一些您可能觉得有用的代码可以帮助您入门.

首先,创建您的appcache清单文件.这还允许您在客户端浏览器中缓存资源,直到您明确修改appcache清单文件的日期.

/app.appcache:

CACHE MANIFEST

#v20150327.114142

CACHE:
/appcache.js
/an/image.jpg
/a/javascript/file.js
http://some.resource.com/a/css/file.css

NETWORK:
*
/
Run Code Online (Sandbox Code Playgroud)

app.appcache中,行上的注释#v20150327.114142是我们向浏览器指示清单已更改并应重新加载资源的方式.它可以是任何东西,只要文件看起来与以前版本的浏览器不同.在应用程序中部署新代码期间,应修改此行.也可以使用构建ID.

其次,在您要使用appcache的任何页面上,修改标头标签:

<html manifest="/app.appcache"></html>
Run Code Online (Sandbox Code Playgroud)

最后,您需要添加一些Javascript来检查appcache是​​否有任何更改,如果有,请执行一些操作.这是一个Angular模块.对于这个答案,这是一个香草的例子:

appcache.js:

window.applicationCache.addEventListener('updateready', function(e) {
    if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
        // Browser downloaded a new app cache.
        // Swap it in and reload the page to get the latest hotness.
        window.applicationCache.swapCache();
        if (confirm('A new version of the application is available. Would you like to load it?')) {
            window.location.reload();
        }
    }
    else {
        // Manifest didn't changed. Don't do anything.
    }
}, false);
Run Code Online (Sandbox Code Playgroud)

或者,如果AppCache不适合您的情况,更多的贫民区解决方案是创建一个简单的API端点,返回当前构建ID或上次部署日期时间.您的Angular应用程序偶尔会点击此端点并将结果与​​其内部版本进行比较,如果不同,则重新加载自身.

或者,您可以考虑一个实时重新加载脚本(示例),但是,虽然在开发中非常有用,但我不确定在生产中使用实时/就地重新加载资产是多么好的想法.