angularjs – 使用单页面应用程序(SPA)时如何处理过期文件而不刷
我已经使用Angularjs完成了一个完整的单页应用程序(SPA)应用程序。
到现在为止还挺好。 任何人都知道,所有的javascript文件都是在第一次访问时加载的。或者,有些文件在需要时以懒模式加载。 到现在为止还挺好… 情况是:服务器更新所有文件(html partials,javascripts,css),客户端仍然有很多文件过时。 这将简单地解决刷新浏览器,点击F5键,控制f5或浏览器中的刷新按钮。但是,在使用SPA时,这个概念不存在。 我不知道如何解决这个问题。 我可以以某种方式检测(做一个ping可能),只是重新加载该特定的文件。使用document.write策略。但是现在又出现了一个问题,我有一个单一的javascript文件,所有的javascript都被缩小了。 我可以尝试在浏览器中强制重新加载,或强制重新登录(并重新加载,因为登录是SPA部分)。 但重新加载是一个难看的解决方案,想像客户端丢失所有数据的形式,因为他是不幸的服务器刚刚更新。更糟的是,我现在必须创建一些“自动保存”功能,因为这样。 我不知道如何处理这个,如果可能的话,以“有角度的方式”做。 我不知道谷歌Gmail如何处理这个,因为我保持登录了很多小时没有登录。
其余的人说一个解决方案可以是版本化你的文件。因此,每当浏览器检查这些文件时,浏览器会注意到文件与服务器中的文件不同,以便浏览器缓存新文件。
我建议使用一些构建工具,如gulp,grunt或webpack,最后一个变得越来越受欢迎。 到目前为止,我使用gulp作为我的项目。我正在移动到webpack 如果您对gulp感兴趣,您可以查看gulp-rev和gulp-rev-replace插件。 他们在做什么? 让我们说我们在你的项目app.js中有下一个文件,将gulp-rev应用到你的项目之后你得到的是像app-4j8888dp.js那样的app.js注入的html文件仍然指向app.js,所以你需要更换它。为此,您可以使用gulp-rev-replace插件。 例如。 gulp任务在哪里 var gulp = require('gulp'); var rev = require('gulp-rev'); var revReplace = require('gulp-rev-replace'); var useref = require('gulp-useref'); var filter = require('gulp-filter'); var uglify = require('gulp-uglify'); var csso = require('gulp-csso'); gulp.task("index",function() { var jsFilter = filter("**/*.js",{ restore: true }); var cssFilter = filter("**/*.css",{ restore: true }); var indexHtmlFilter = filter(['**/*','!**/index.html'],{ restore: true }); return gulp.src("src/index.html") .pipe(useref()) // Concatenate with gulp-useref .pipe(jsFilter) .pipe(uglify()) // Minify any javascript sources .pipe(jsFilter.restore) .pipe(cssFilter) .pipe(csso()) // Minify any CSS sources .pipe(cssFilter.restore) .pipe(indexHtmlFilter) .pipe(rev()) // Rename the concatenated files (but not index.html) .pipe(indexHtmlFilter.restore) .pipe(revReplace()) // Substitute in new filenames .pipe(gulp.dest('public')); }); 如果您想了解更多详情,请参阅下面的链接。 https://github.com/sindresorhus/gulp-rev (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |