NuxtJS静态生成的HTML页面在调用/index.html时不加载Javascript

l9c*_*cgv 6 javascript vue.js server-side-rendering nuxt.js

我正在开发一个 nuxtjs 项目,该项目将生成用于静态使用。当然,它使用 Javascript 进行导航、某些表单等。

当我使用npm run dev页面时,一切正常。

使用npm run build && npm rungenerate导出后,我将生成的内容从 /dist 部署到我的服务器(用户请求的 cdn,在这种情况下是 Google Cloud Storage),如果我不添加index.html,我可以毫无问题地使用该页面后缀。

例子:

访问https://page.com/subpage/效果很好

访问https://page.com/subpage/index.html并不是真的。

是的,它使用 CSS 和 DOM 渲染内容,但 Javascript 根本不起作用。在 Google Chrome 的开发工具中,我可以看到在这两种情况下,javascript 似乎都已加载,但在第二种情况下并未调用。请参阅随附的屏幕截图。两者都很相似。

开发工具

我的 nuxt-Config 关于渲染、构建配置几乎是空的。我只是禁用了 resourcesHints,仅此而已。我不确定这是否是路由器只接受包含index.html 的文件夹本身的问题。路由器路径是由 nuxtLinks 动态生成的。

有任何想法吗?

l9c*_*cgv 6

更新

经过大约1-2个小时的寻找答案,我终于找到了解决方案。

有一种方法可以将index.html后缀添加到路由器作为每个路径的别名。

通过扩展nuxt-config中的路由器,理论上可以根据路由器路径添加别名。它并不总是最好的方法,但在这种情况下效果很好。

router: {
  extendRoutes(routes) {
    routes.forEach((route) => {
      // When options.generate.subFolders is true (default)
      const alias =
        route.path.length > 1 ? `${route.path}/index.html` : '/index.html'
      // When options.generate.subFolders is false
      // const normalizedRoute = route.path.replace(/\/$/, '') // Remove trailing slashes if they exist
      // const alias =
      //   route.path.length > 1 ? `${normalizedRoute}.html` : '/index.html'
      route.alias = alias
    })
  }
}
Run Code Online (Sandbox Code Playgroud)

我从animagnam(https://www.reddit.com/r/Nuxt/comments/gzwrqu/visiting_ generated_site_routes_with_trailing/ftnylrt?utm_source=share&utm_medium=web2x&context=3)的reddit帖子中剪下了这个片段,它在生产和测试中完美运行。