单页应用无需加载新页面即可显示不同的内容。为此,它们会在链接和 History API 上使用点击处理程序。History API 允许操纵浏览器会话历史记录。这样,我们就可以在显示不同网页(在单页应用中通常称为“视图”)时更新网址。它还可确保浏览器的返回按钮仍能按预期运行。
请查看此 Codelab 中的单页应用。它会显示猫或狗的图片,并提供在这两种动物之间切换的链接。看起来运行良好!
揭秘隐蔽的 404 错误
遗憾的是,应用中存在一个细微的 bug。我们来看看!
- 如需预览网站,请按查看应用。然后按全屏
。
- 点击 Doggos 链接。请注意网址的变化。
- 重新加载应用。
您会看到一个显示“Cannot GET /doggos”的页面,这是一个隐蔽的 404 错误。它具有“隐蔽性”,因为只要您只点击 Web 应用中的链接,该应用似乎就能正常运行。在新浏览器窗口中使用这些网址或刷新页面时,这些网址会失效。问题在于,服务器不知道如何响应对这些网址的请求。Web 应用中的 JavaScript 代码使用 History API 在这些网址之间导航,但服务器不知道如何处理这些网址。每当服务器不知道如何处理请求的网址时,它都会返回 HTTP 状态代码 404。此代码表示服务器未找到与请求的网址对应的任何内容。
在这种情况下,搜索引擎不会将这些网址编入索引,因为用户点击搜索结果后会看到出错提示,而不是他们要查找的内容(例如狗狗图片)。
修复服务器
此项目使用以 JavaScript 编写的 express.js 服务器。我们来修复服务器,让它使用 index.html 进行响应,单页应用会处理其余工作。
- 点击 Remix to Edit(混剪以编辑)使项目可编辑。
- 选择
server.js文件。
此文件包含服务器代码。它会设置一个 express.js 服务器并发送 index.html 的内容。第 15 行中的路由设置仅在请求发送到网址 / 时才会提供 Web 应用。服务器还应提供我们创建的其他网址。我们将其更改为处理所有网址,以便将来也能处理其他网址。
为此,我们可以将第 15 行开始的代码更改为:
app.get('/*', function(request, response) {
response.sendFile(__dirname + '/views/index.html');
});
/* 与任何网址都匹配,现在,对于任何给定的网址,服务器都会使用 index.html 中的 Web 应用进行响应。
- 如需预览网站,请按查看应用。然后按全屏
。
现在,刷新并在新的无痕式窗口中打开链接应该可以正常运行。