- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题:我们是否可以在更改路由(或聚焦选项卡)并重新加载页面时检查部署在 firebase 托管上的新构建,以便用户可以查看新功能?
目前,用户必须刷新站点才能看到构建中部署的新功能。
以下是我项目中当前安装的依赖:
"dependencies": {
"@material-ui/core": "^4.5.0",
"antd": "^3.23.6",
"axios": "^0.19.0",
"env-cmd": "^10.0.1",
"firebase": "^7.4.0",
"highcharts": "^7.2.0",
"highcharts-react-official": "^2.2.2",
"history": "^4.10.1",
"loaders.css": "^0.1.2",
"local-storage": "^2.0.0",
"moment": "^2.24.0",
"node-sass": "^4.12.0",
"notistack": "^0.9.2",
"qs": "^6.9.0",
"query-string": "^6.9.0",
"react": "^16.12.0",
"react-dom": "^16.12.0",
"react-ga": "^2.7.0",
"react-google-login": "^5.0.7",
"react-icons": "^3.7.0",
"react-loaders": "^3.0.1",
"react-mentions": "^3.3.1",
"react-redux": "^7.1.1",
"react-router-dom": "^5.1.2",
"react-scripts": "3.1.2",
"redux": "^4.0.4",
"redux-thunk": "^2.3.0"
}
这就是我的 firebase.json 配置目前的样子:
{
"hosting": {
"target": "build",
"public": "build",
"ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
],
"headers": [
{
"source": "**/*.@(jpg|jpeg|gif|png|css|js|jsx|scss|ttc|woff)",
"headers": [{ "key": "Cache-Control", "value": "no-cache" }] \\ so user doesn't have to force refresh build
}
]
}
}
可能的解决方案:
有人可以指导我正确的方向吗?我在 Github 上创建了一个问题以及。如果我需要更多详细信息,请告诉我。
最佳答案
我能够找到解决问题的方法。我最终在我的 Cloud Firestore 数据库中添加了一个版本集合,它通过一个脚本从我的 CI/CD 管道中更新,该脚本解析 package.json 文件的当前版本并将其存储在 Cloud Firestore 中。在我 React 的主要 App 组件中,我向版本集合添加了一个监听器,它可以比较版本并相应地重新加载页面。
在脚本(启动/构建)之前添加了 REACT_APP_VERSION=$(node -pe\"require('./package.json').version\")
以从 package.json 设置版本
在 App.jsx 中添加在 componentDidMount 的监听器下面
addVersionListener = () => {
var env = process.env.REACT_APP_ENV === "staging" ? "staging" : "production";
db.collection("AppVersion")
.doc(env)
.onSnapshot(docSnapshot => {
if (docSnapshot.exists) {
let data = docSnapshot.data();
let shouldReload = compareVersions(
data.version,
process.env.REACT_APP_VERSION
); // compare-versions npm module
if (shouldReload === 1) {
window.location.reload();
}
}
});
};
部署后运行的脚本 REACT_APP_VERSION=$(node -pe\"require('./package.json').version\") node ./src/updateVersionNumber.js
。在 updateVersionNumber.js
const firebase = require("firebase/app");
const { credentials } = require("./firebase-credentials.js");
if (firebase.apps.length === 0) {
firebase.initializeApp(credentials);
}
require("firebase/firestore");
const updateVersion = () => {
var db = firebase.firestore();
var env = process.env.REACT_APP_ENV === "staging" ? "staging" : "production";
db.collection("AppVersion")
.doc(env)
.get()
.then(async response => {
if (response.exists && process.env.REACT_APP_VERSION) {
try {
await response.ref.update({ version: process.env.REACT_APP_VERSION});
} catch (err) {
console.log(err);
}
}
});
};
updateVersion();
为了进一步管理自动刷新,例如当用户填写某些表格或执行某些任务时,如果页面自动重新加载,这将使他/她失去进度,我使用 React Redux 状态来检测并暂时停止重新加载稍后通过更新 App.jsx 中的上述监听器方法来完成。
关于reactjs - 刷新部署在 firebase 托管上的构建,以更改路由或检测到存在的新构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59640787/
我想知道有没有可能做 new PrintWriter(new BufferedWriter(new PrintWriter(s.getOutputStream, true))) 在 Java 中,s
我正在尝试使用 ConcurrentHashMap 初始化 ConcurrentHashMap private final ConcurrentHashMap > myMulitiConcurrent
我只是想知道两个不同的新对象初始化器之间是否有任何区别,还是仅仅是语法糖。 因此: Dim _StreamReader as New Streamreader(mystream) 与以下内容不同: D
在 C++ 中,以下两种动态对象创建之间的确切区别是什么: A* pA = new A; A* pA = new A(); 我做了一些测试,但似乎在这两种情况下,都调用了默认构造函数,并且只调用了它。
我已经阅读了其他帖子,但它们没有解决我的问题。环境为VB 2008(2.0 Framework)下面的代码在 xslt.Load 行导致 XSLT 编译错误下面是错误的输出。我将 XSLT 作为字符串
我想知道为什么alert(new Boolean(false))打印 false 而不是打印对象,因为 new Boolean 应该返回对象。如果我使用 console.log(new Boolean
本文实例讲述了Python装饰器用法。分享给大家供大家参考,具体如下: 写装饰器 装饰器只不过是一种函数,接收被装饰的可调用对象作为它的唯一参数,然后返回一个可调用对象(就像前面的简单例子) 注
我可以编写 YAML header 来使用 knit 为 R Markdown 文件生成多种输出格式吗?我无法重现 the original question with this title 的答案中
我可以编写一个YAML标头以使用knitr为R Markdown文件生成多种输出格式吗?我无法重现the original question with this title答案中描述的功能。 这个降价
我正在使用vars package可视化脉冲响应。示例: library(vars) Canada % names ir % `$`(irf) %>% `[[`(variables[e])) %>%
我有一个容器类,它有一个通用参数,该参数被限制到某个基类。提供给泛型的类型是基类约束的子类。子类使用方法隐藏(新)来更改基类方法的行为(不,我不能将其设为虚拟,因为它不是我的代码)。我的问题是"new
Java 在提示! cannot find symbol symbol : constructor Bar() location: class Bar JPanel panel =
在我的应用程序中,一个新的 Activity 从触摸按钮(而不是点击)开始,而且我没有抬起手指并希望在新的 Activity 中跟踪触摸的 Action 。第二个 Activity 中的触摸监听器不响
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,
和我的last question ,我的程序无法检测到一个短语并将其与第一行以外的任何行匹配。但是,我已经解决并回答了。但现在我需要一个新的 def函数,它删除某个(给定 refName )联系人及其
这个问题在这里已经有了答案: Horizontal list items (7 个答案) 关闭 9 年前。
我想创建一个新的 float 类型,大小为 128 位,指数为 4 字节(32 位),小数为 12 字节(96 位),我该怎么做输入 C++,我将能够在其中进行输入、输出、+、-、*、/操作。 [我正
我在放置引用计数指针的实例时遇到问题 类到我的数组类中。使用调试器,似乎永远不会调用构造函数(这会扰乱引用计数并导致行中出现段错误)! 我的 push_back 函数是: void push_back
我在我们的代码库中发现了经典的新建/删除不匹配错误,如下所示: char *foo = new char[10]; // do something delete foo; // instead of
A *a = new A(); 这是创建一个指针还是一个对象? 我是一个 c++ 初学者,所以我想了解这个区别。 最佳答案 两者:您创建了一个新的 A 实例(一个对象),并创建了一个指向它的名为 a
我是一名优秀的程序员,十分优秀!