Flutter Web中如何将serviceWorkerVersion替换为{{flutter_service_worker_version}}模板令牌?
解决Flutter Web中serviceWorkerVersion弃用的替换问题
按照Flutter的提示,需要把本地变量serviceWorkerVersion替换成模板令牌{{flutter_service_worker_version}},具体修改步骤如下:
- 删除弃用的本地变量:直接移除代码里的
var serviceWorkerVersion = null;声明,这个变量已经不需要了。 - 替换Service Worker URL中的变量:将构建
serviceWorkerUrl的代码从
修改为var serviceWorkerUrl = 'flutter_service_worker.js?v=' + serviceWorkerVersion;var serviceWorkerUrl = 'flutter_service_worker.js?v={{flutter_service_worker_version}}'; - 替换脚本版本校验逻辑:把判断Service Worker版本的条件从
修改为} else if (!reg.active.scriptURL.endsWith(serviceWorkerVersion)) {} else if (!reg.active.scriptURL.endsWith('{{flutter_service_worker_version}}')) {
修改后的完整代码
<body> <img src="img/logo_symbol.png" class="center"/> <script> var scriptLoaded = false; function loadMainDartJs() { if (scriptLoaded) { return; } scriptLoaded = true; var scriptTag = document.createElement('script'); scriptTag.src = 'main.dart.js'; scriptTag.type = 'application/javascript'; document.body.append(scriptTag); } if ('serviceWorker' in navigator) { // Service workers are supported. Use them. window.addEventListener('load', function () { // Wait for registration to finish before dropping the <script> tag. // Otherwise, the browser will load the script multiple times, // potentially different versions. var serviceWorkerUrl = 'flutter_service_worker.js?v={{flutter_service_worker_version}}'; navigator.serviceWorker.register(serviceWorkerUrl) .then((reg) => { function waitForActivation(serviceWorker) { serviceWorker.addEventListener('statechange', () => { if (serviceWorker.state == 'activated') { console.log('Installed new service worker.'); loadMainDartJs(); } }); } if (!reg.active && (reg.installing || reg.waiting)) { // No active web worker and we have installed or are installing // one for the first time. Simply wait for it to activate. waitForActivation(reg.installing || reg.waiting); } else if (!reg.active.scriptURL.endsWith('{{flutter_service_worker_version}}')) { // When the app updates the serviceWorkerVersion changes, so we // need to ask the service worker to update. console.log('New service worker available.'); reg.update(); waitForActivation(reg.installing); } else { // Existing service worker is still good. console.log('Loading app from service worker.'); loadMainDartJs(); } }); // If service worker doesn't succeed in a reasonable amount of time, // fallback to plaint <script> tag. setTimeout(() => { if (!scriptLoaded) { console.warn( 'Failed to load app from service worker. Falling back to plain <script> tag.', ); loadMainDartJs(); } }, 4000); }); } else { // Service workers not supported. Just drop the <script> tag. loadMainDartJs(); } </script> </body>
内容的提问来源于stack exchange,提问作者Roar Grønmo
相关产品推荐
相关产品推荐

