刷新部署在 firebase 托管上的构建,以更改路由或检测到存在的新构建
Refresh build deployed on firebase hosting on changing route or detecting new build present
问题:
我们是否可以在更改路由(或聚焦选项卡)并重新加载页面时检查部署在 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
}
]
}
}
可能的解决方案:
- 存储内部版本号并在更新时添加侦听器,
重新加载页面。
- 检查构建 number/timestamp 并以某种方式将其与 firebase 托管最新构建相匹配。
有人可以指导我正确的方向吗?我也在 Github 上创建了一个问题。
如果我需要更多详细信息,请告诉我。
我找到了解决问题的方法。我最终在我的 Cloud Firestore 数据库中添加了一个版本集合,它通过一个脚本从我的 CI/CD 管道更新,该脚本解析 package.json 文件的当前版本并将其存储在 Cloud Firestore 中。在我 React 的主要 App 组件中,我向版本集合添加了一个监听器,它可以比较版本并相应地重新加载页面。
在脚本 (start/build) 之前添加了 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();
为了进一步管理自动刷新,例如当用户填写某些表格或执行某些会使他松动的任务时 his/her 如果页面自动重新加载,进度,我使用 React Redux 状态来检测和停止暂时重新加载,稍后通过更新 App.jsx 中的上述侦听器方法来执行。
问题: 我们是否可以在更改路由(或聚焦选项卡)并重新加载页面时检查部署在 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
}
]
}
}
可能的解决方案:
- 存储内部版本号并在更新时添加侦听器, 重新加载页面。
- 检查构建 number/timestamp 并以某种方式将其与 firebase 托管最新构建相匹配。
有人可以指导我正确的方向吗?我也在 Github 上创建了一个问题。 如果我需要更多详细信息,请告诉我。
我找到了解决问题的方法。我最终在我的 Cloud Firestore 数据库中添加了一个版本集合,它通过一个脚本从我的 CI/CD 管道更新,该脚本解析 package.json 文件的当前版本并将其存储在 Cloud Firestore 中。在我 React 的主要 App 组件中,我向版本集合添加了一个监听器,它可以比较版本并相应地重新加载页面。
在脚本 (start/build) 之前添加了 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();
为了进一步管理自动刷新,例如当用户填写某些表格或执行某些会使他松动的任务时 his/her 如果页面自动重新加载,进度,我使用 React Redux 状态来检测和停止暂时重新加载,稍后通过更新 App.jsx 中的上述侦听器方法来执行。