A. 预期在“/”找到某些文件
您出现此错误是因为浏览器预期从服务器的根目录下提供访问某些文件,包括:
/manifest.json
/sitemap.xml
/favicon.ico
/robots.txt
/browserconfig.xml
/site.webmanifest
这些路径中的大多数都可以使用元标记进行设置,但老旧的浏览器会忽略它们,并在未提供这些确切的文件名时出现错误。
B. 配置替代路径并使用NextJS的静态文件
截至撰写本文的时间,NextJS正在进行支持离线功能的工作(请参见此处的工作进展),但还没有完全准备好。
如果您不需要支持老旧浏览器且不需要高级搜索引擎优化,则可以使用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
文件不能从子目录服务 (来源),因此如果您需要定义此文件,则此解决方案不适用。
C. 像预期的那样提供这些文件
正确的解决方案是从您的express服务器上像这样服务这些文件
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示例存储库
/public
目录。其中有一些文件是静态提供的,这是manifest.json
等文件的“根”URL。 - mtx