PWA 的路由器部分在设备上打开空白(使用 Vue)

Router part of PWA opens blank on device (with Vue)

我基于 Vue 构建了 2 个 PWA(使用 Vue UI 模板,路由器和 PWA 已经设置好)但是我遇到了同样的问题:在我添加到设备上的主屏幕之后,当我打开它来自应用程序图标,路由器 viez 不会显示并保持空白,直到我单击路由器 link。我不明白为什么。

其中之一的示例,我的投资组合:

URL Link

GitHub Link

我认为与此问题相关的部分文件:

router.js:

export default new Router({
  mode: 'history',
  base: 'index.html',
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home
    }
  ]
})

firebase.json:

"rewrites": [
  {
    "source": "**",
    "destination": "/index.html"
  }
]

有同样的问题。事实证明,解决方案非常简单。您必须在 manifest.json

中 add/change
"start_url": "/",
"scope": "/"

将以下内容添加到您的vue.config.js

pwa: {
  workboxOptions: {
    navigateFallback: '/index.html',
  },
},

编辑: 查看下面的@webmint 答案,可能会以更好、更干净的方式解决问题。

原文Post:

我解决了在路由中添加别名到起始页的问题(在我的例子中是“登录”)

在manifest.json中:

{
...
"start_url": "index.html",
...
}

在路由器配置中:

let router = new Router({
...
  routes: [
    {   path: '/index.html',
        component: Login,
        alias: '/'
    },
    {
        path: '/',
        name: 'login',
        component: Login
    },
...

冒着重复 kaligari 的回答的风险,我会说所需的部分只是

{ path: '/index.html', component: Home }

在路由器配置中。您还可以使用别名使其在客户端上看起来更好。虽然,当用作 PWA 时,这没有任何区别,因为地址栏不可见。

{ path: '/index.html', component: Home, alias: '/' }

如果它可以帮助某人,这就是对我有用的(在尝试了很多上述解决方案和网络上的其他解决方案之后......):

上下文: PWA 与 Vue.js CLI 3.

问题:在Safari中通过"Add to home screen"选项在"desktop"上安装URL后,点击图标打开了一个白色页。

Android (Chrome) 上的相同功能运行良好。


我用下面的配置解决了它:

manifest.json

  ...
  "start_url": "/index.html",
  ...

router.json(包括一些 Firebase 配置元素)

//......
const router = new Router({
    mode: 'history',
    base: process.env.BASE_URL,
    routes: [
        {
            path: '/',
            redirect: {
                path: '/projects'
            }
        },
        {
            path: '/login',
            name: 'Login',
            component: Login,
        },
        {
            path: '/projects',
            name: 'Projects',
            component: Projects,
            meta: {
                requiresAuth: true
            }
        },
        //......
    ]
});

router.beforeEach((to, from, next) => {
    const requiresAuth = to.matched.some(x => x.meta.requiresAuth);
    const currentUser = firebase.auth().currentUser;

    if (requiresAuth && !currentUser) {
        next('/login');
    } else if (requiresAuth && currentUser) {
        next();
    } else {
        next();
    }
});

export default router;

vue.config.js

module.exports = {
    pwa: {
        name: 'Xxxxxxxxxx',
        themeColor: '#000000',
        msTileColor: '#000000',
        appleMobileWebAppCapable: 'yes',
        appleMobileWebAppStatusBarStyle: 'black',
        workboxOptions: {
            navigateFallback: '/index.html',
        },
    }
};