到现在为止还挺好。
任何人都知道,所有的javascript文件都是在第一次访问时加载的。或者,有些文件在需要时以懒模式加载。
到现在为止还挺好…
情况是:服务器更新所有文件(html partials,javascripts,css),客户端仍然有很多文件过时。
这将简单地解决刷新浏览器,点击F5键,控制f5或浏览器中的刷新按钮。但是,在使用SPA时,这个概念不存在。
我不知道如何解决这个问题。
我可以以某种方式检测(做一个ping可能),只是重新加载该特定的文件。使用document.write策略。但是现在又出现了一个问题,我有一个单一的javascript文件,所有的javascript都被缩小了。
我可以尝试在浏览器中强制重新加载,或强制重新登录(并重新加载,因为登录是SPA部分)。
但重新加载是一个难看的解决方案,想像客户端丢失所有数据的形式,因为他是不幸的服务器刚刚更新。更糟的是,我现在必须创建一些“自动保存”功能,因为这样。
我不知道如何处理这个,如果可能的话,以“有角度的方式”做。
我建议使用一些构建工具,如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
https://github.com/jamesknelson/gulp-rev-replace