【发布时间】:2021-08-11 09:57:48
【问题描述】:
我正在使用 SSR 渲染应导入图像的反应组件。我添加了:
declare module '*.ico' {
const value: any
export default value
}
哪个有效。然后当我尝试这样做时:
import Favicon from '/path/to/favicon.ico'
我收到错误“SyntaxError:无效或意外令牌”。即使我什至不尝试使用它,我也会收到此错误,它会在导入本身中断:
SyntaxError: Invalid or unexpected token
at wrapSafe (internal/modules/cjs/loader.js:979:16)
at Module._compile (internal/modules/cjs/loader.js:1027:27)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
at Module.load (internal/modules/cjs/loader.js:928:32)
at Function.Module._load (internal/modules/cjs/loader.js:769:14)
at Module.require (internal/modules/cjs/loader.js:952:19)
at require (internal/modules/cjs/helpers.js:88:18)
我会问我如何才能使用它,但我首先坚持只是在尝试使用它之前导入它。
注意,我不想在渲染单个组件服务器端时重新运行 webpack 或类似的东西,那么如何在不使用 webpack 的情况下使用带有导入的图像。
我开始认为实现此目的的唯一方法是手动使用 fs.writeFile 并将静态 URL 手动分配给图像源,但我希望有比这更简单的解决方案,我假设 webpack 正在做引擎盖下的所有内容。
编辑:我以为我找到了解决方案,但仍然没有运气。
你可以有这样的东西,它可以渲染一个页面:
export const component = async (
request: Request,
response: Response,
): Promise<void> => {
console.log(request.url)
const stream = renderToNodeStream(<Component />)
stream.pipe(response)
stream.on('end', () => {
response.end()
})
}
互联网上几乎所有的博客文章和示例都停在那里说“好吧,工作完成了”,但事实并非如此,这甚至还不到故事的一半。
当您将上述内容与以下内容一起使用时:
import Favicon from '/path/to/favicon.ico'
在该组件内部,它会中断,因为 typescript 无法解析任何图像,这是有道理的。它也会破坏任何 CSS 或其他任何没有反应的东西。这意味着您不能重用任何客户端组件并在服务器上重新渲染它们,如果它们包含任何图像或任何 CSS 或任何不是纯 typescript/react 的东西,则不能。
你可以使用:
import webpack from 'webpack'
import config.js from './config'
...
const compiler = webpack(config('production'))
compiler.run((error, stats) => {
compiler.close()
})
使用它,您可以使用 webpack 编译和捆绑特定文件并以编程方式调用它,但这并不能真正解决问题。我不明白为什么那里的每个示例都只显示renderToStaticMarkup 或renderToString,而没有一个告诉您“哦,顺便说一句,在您拥有的任何东西上使用它都会破坏。”如果您不使用 webpack 对其进行预编译并在 fs.readFile'ing 该 *.html 并将其提供给 react 的渲染之前在每个预渲染的 HTML 上运行 webpack 编译器,则不可能以任何有用的方式运行或使用或利用 react-dom/server .
您也不能只手动使用<img src='/path/to/image'/>,因为那样您的服务器和客户端代码将不一样,所以hydrate 会抱怨,因为 webpack 渲染图像的方式与您手动执行的方式不同,更不用说你不能用 import Component from './component' 这样的东西重用相同的组件,你必须复制整个代码库,一次用于 webpack 客户端,一次用于手动编写图像路径。
那么你怎么能简单地使用renderToString 渲染图像,我不明白那里没有人,没有博客文章,没有讨论论坛,或者没有任何关于此的信息?!不仅如此,为什么每个人都只是说“哦,只需使用renderToString 和瞧”,而它显然不适用于图像/css 或其他任何东西。
我错过了什么拼图,我错过了什么非常愚蠢或明显的东西吗?
【问题讨论】:
标签: reactjs typescript server-side-rendering