A. 一些文件预计会在“/”找到
您遇到此错误是因为浏览器希望从服务器的根目录提供一些文件,包括:
/manifest.json
/sitemap.xml
/favicon.ico
/robots.txt
/browserconfig.xml
/site.webmanifest
虽然这些路径中的大多数都可以使用元标记设置,但旧版浏览器会忽略它们,如果没有提供这些确切的文件名,则会出错。
B. 配置备用路径并使用 NextJS 静态文件
在撰写本文时,NextJS的离线支持工作正在进行中。但它还没有准备好。
如果您不需要支持旧版浏览器并且不需要高级 SEO,则可以使用 NextJS 的Head
组件(请参阅文档)来定义manifest.json
路径,就像对任何 NextJS 静态文件一样:
import Head from "next/head"
export default () => (
<Head>
<link rel="manifest" href="/static/manifest.json" />
<link rel="manifest" href="/static/site.webmanifest" />
<link rel="shortcut icon" href="/static/favicon.ico"
</Head>
)
请注意,robots.txt
不能从子目录(source)提供服务,因此如果您需要定义此文件,此解决方案不适合。
C. 按预期提供这些文件
正确的解决方案是像这样从您的快速服务器提供这些文件
const { createServer } = require('http')
const { parse } = require('url')
const next = require('next')
const { join } = require('path')
const port = parseInt(process.env.PORT, 10) || 3000
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
app.prepare()
.then(() => {
createServer((req, res) => {
const parsedUrl = parse(req.url, true)
const rootStaticFiles = [
'/manifest.json',
'/sitemap.xml',
'/favicon.ico',
'/robots.txt',
'/browserconfig.xml',
'/site.webmanifest',
]
if (rootStaticFiles.indexOf(parsedUrl.pathname) > -1) {
const path = join(__dirname, 'static', parsedUrl.pathname)
app.serveStatic(req, res, path)
} else {
handle(req, res, parsedUrl)
}
})
.listen(port, (err) => {
if (err) throw err
console.log(`> Ready on http://localhost:${port}`)
})
})
注意:此代码直接来自NextJS 示例存储库