【发布时间】:2020-07-04 15:13:25
【问题描述】:
我一直在尝试使用服务器端渲染设置 react-helmet。我关注了有关如何使用 SSR 设置 react-helmet 的文档和一些博客文章,但未能产生预期的结果。这是我如何渲染应用程序的代码 sn-p:
import React from 'react';
import { renderToString } from 'react-dom/server';
import App from './src/App';
const express = require('express');
const app = express();
app.get('*', (req, res) => {
const app = renderToString(<App />);
const helmet = Helmet.renderStatic();
res.send(formatHTML(app, helmet));
})
function formatHTML(appStr, helmet) {
return `
<!DOCTYPE html>
<html lang="en">
<head>
${helmet.title.toString()}
${helmet.meta.toString()}
</head>
<body>
<div id="root">
${ appStr }
</div>
<script src="./bundle.js"></script>
</body>
</html>
`
}
当我运行上述代码时,我收到一条错误消息,提示“无法在模块外使用 import 语句”。是否可以同时使用 es5 和 es6 语法?还是有更好的方法来设置 React-helmet?
这是我的 babel 配置文件
{
"presets": [
[
"@babel/preset-env",
{
"modules": false
}
],
"@babel/preset-react",
"@babel/preset-flow"
],
"env": {
"development": {
"only": [
"app",
"internals/scripts"
],
"plugins": [
"@babel/plugin-transform-react-jsx-source"
]
},
"production": {
"only": [
"app"
],
"plugins": [
"transform-react-remove-prop-types",
"@babel/plugin-transform-react-constant-elements",
"@babel/plugin-transform-react-inline-elements"
]
},
"test": {
"plugins": [
"@babel/plugin-transform-modules-commonjs",
"dynamic-import-node"
]
}
},
"compact": true,
"plugins": [
"@babel/plugin-syntax-dynamic-import",
"@babel/plugin-syntax-import-meta",
"@babel/plugin-proposal-class-properties",
"@babel/plugin-proposal-json-strings",
[
"@babel/plugin-proposal-decorators",
{
"legacy": true
}
],
"@babel/plugin-proposal-function-sent",
"@babel/plugin-proposal-export-namespace-from",
"@babel/plugin-proposal-numeric-separator",
"@babel/plugin-proposal-throw-expressions",
"@babel/plugin-proposal-export-default-from",
"@babel/plugin-proposal-logical-assignment-operators",
"@babel/plugin-proposal-optional-chaining",
[
"@babel/plugin-proposal-pipeline-operator",
{
"proposal": "minimal"
}
],
"@babel/plugin-proposal-nullish-coalescing-operator",
"@babel/plugin-proposal-do-expressions",
"@babel/plugin-proposal-function-bind",
"lodash"
]
}
【问题讨论】:
-
看看this example。
-
我试过这个。我在导入反应组件的那一行仍然出现错误。 [语法错误:不能在模块外使用 import 语句]
-
你是如何捆绑应用的?你在使用 Webpack 吗?你的配置是什么样的?
-
我正在使用 babel webpack 进行捆绑。我已经包含了 .babelrc 配置文件
-
@GhouseMohamed 我刚刚用我的最新研究更新了我的答案。我现在用渲染的 HTML 替换
<div id="root"></div>,它可以加速 first contentful paint,从而提高 SEO 性能。
标签: node.js reactjs react-helmet