У меня возникла проблема с хостингом Firebase моего приложения Flutter. Я настроил хостинг Firebase, как описано в документации. Когда я развертываю проект с помощью этого файла firebase.json, он работает так, как задумано.
...
"hosting": {
"public": "build/web",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"frameworksBackend": {
"region": "europe-west1"
}
...
Чтобы сделать URL-адреса типа <Hosting-Domain>/download
доступными, мне нужно добавить перезапись, например:
...
"hosting": {
"public": "build/web",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"frameworksBackend": {
"region": "europe-west1"
},
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
},
...
Когда я развертываю проект с перезаписью, он отлично работает, эмулируя локально с помощью Firebase Emulator Suite, но когда я открываю веб-сайт онлайн, отображается пустая страница. Консоль отображает следующие сообщения:
> Rejecting promise with error: FormatException: SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON
> Uncaught (in promise) null
FormatException, по-видимому, относится к моему файлу Index.html, который выглядит следующим образом:
<!DOCTYPE html>
<html>
<head>
<!--
If you are serving your web app in a path other than the root, change the
href value below to reflect the base path you are serving from.
The path provided below has to start and end with a slash "/" in order for
it to work correctly.
For more details:
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base
This is a placeholder for base href that will be replaced by the value of
the `--base-href` argument provided to `flutter build`.
-->
<base href = "/">
<meta charset = "UTF-8">
<meta content = "IE=Edge" http-equiv = "X-UA-Compatible">
<meta name = "description" content = "A new Flutter project.">
<!-- iOS meta tags & icons -->
<meta name = "apple-mobile-web-app-capable" content = "yes">
<meta name = "apple-mobile-web-app-status-bar-style" content = "black">
<meta name = "apple-mobile-web-app-title" content = "flutter_application_2">
<link rel = "apple-touch-icon" href = "icons/Icon-192.png">
<!-- Favicon -->
<link rel = "icon" type = "image/png" href = "favicon.png"/>
<title>flutter_application_2</title>
<link rel = "manifest" href = "manifest.json">
</head>
<body>
<script type = "module">
// Import the functions you need from the SDKs you need
import { initializeApp } from "https://www.gstatic.com/firebasejs/10.12.2/firebase-app.js";
import { getAnalytics } from "https://www.gstatic.com/firebasejs/10.12.2/firebase-analytics.js";
// TODO: Add SDKs for Firebase products that you want to use
// https://firebase.google.com/docs/web/setup#available-libraries
// Your web app's Firebase configuration
// For Firebase JS SDK v7.20.0 and later, measurementId is optional
const firebaseConfig = {
// My Firebase-Config
};
// Initialize Firebase
const app = initializeApp(firebaseConfig);
const analytics = getAnalytics(app);
</script>
<script src = "flutter_bootstrap.js" async></script>
</body>
</html>
Способы, которыми я пытался исправить эту ошибку:
"$FLUTTER_BASE_HREF"
или “./”
."public": "build/web"
в firebase.json на "source": "."
и подобные комбинации.Эта проблема затрагивала инструменты Firebase v13.11.3 и v13.11.4. Обновление до версии 13.12.0 (npm update -g firebase-tools
) устранило эту проблему.