Reactjs React元标记服务器端
我已经使用react document meta在客户端的react js中完成了meta标记的实现,我的标题已经更改。但是我对meta标记的服务器端预渲染感到困惑。我对这一点完全是新手。我已经通过了和Npm之类的链接,但无法通过服务器端渲染。希望您能提供帮助。好吗我最近一直在用expressjs做这个,我想我已经破解了 首先,你需要为你的react“应用程序”创建一个单独的实例,它将被babel化。我倾向于把所有东西都放在一个src中,然后把它放到dist中。然后,我的服务器主目录就变成了Reactjs React元标记服务器端,reactjs,meta-tags,Reactjs,Meta Tags,我已经使用react document meta在客户端的react js中完成了meta标记的实现,我的标题已经更改。但是我对meta标记的服务器端预渲染感到困惑。我对这一点完全是新手。我已经通过了和Npm之类的链接,但无法通过服务器端渲染。希望您能提供帮助。好吗我最近一直在用expressjs做这个,我想我已经破解了 首先,你需要为你的react“应用程序”创建一个单独的实例,它将被babel化。我倾向于把所有东西都放在一个src中,然后把它放到dist中。然后,我的服务器主目录就变成了/d
/dist/index.js
,这包括我使用'dist/app/index.js'的应用程序
下一步,您将要创建资产,因为在节点进程中本地渲染与在DOM上本地渲染非常不同
好的,首先src/index.js
import express from 'express';
import app from './App';
import Mailgun from 'mailgun-js';
const server = express();
server.use(express.static('public'));
const port = process.env.SERVER_PORT || 3000;
server.get('/*', function(request, response) {
response.send(app());
});
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux'
import createStore from './../../src/App/Store';
import {createBrowserHistory} from 'history';
import reducers from './../../src/App/Reducers';
import sagas from './../../src/App/Sagas';
import App from './../../src/App/app';
const preloadedState = window.__PRELOADED_STATE__;
// Allow the passed state to be garbage-collected
delete window.__PRELOADED_STATE__;
preloadedState.server.env = false;
const browserHistory = createBrowserHistory();
const store = createStore(browserHistory, reducers, sagas, preloadedState);
ReactDOM.hydrate(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root'));
这是我的App/index.js
文件,它是我的初始内容,不是我的react应用
import * as assets from './../Assets';
import App from './app';
import React from 'react';
import {renderToString} from 'react-dom/server';
import {Provider} from 'react-redux';
import createStore from './Store';
import reducers from './Reducers';
import sagas from './Sagas';
//const browserHistory = createBrowserHistory();
const store = createStore({}, reducers, sagas);
const html = renderToString(
<Provider store={store}>
<App />
</Provider>
);
export default function render () {
return `<!doctype html>
<html prefix="og: http://ogp.me/ns#">
<head lang="en">
<meta charset="UTF-8">
<title>Preloaded title</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</head>
<body>
<link rel="stylesheet" href="build/${assets.get('index.css')}"/>
<div id="root">${html}</div>
<div id="fb-root"></div>
<script type="text/javascript">
// WARNING: See the following for security issues around embedding JSON in HTML:
// http://redux.js.org/docs/recipes/ServerRendering.html#security-considerations
window.__PRELOADED_STATE__ = ${JSON.stringify(store.getState()).replace(/</g, '\\u003c')}
</script>
<script type="text/javascript" src="build/${assets.get('index.js')}"></script>
</body>
</html>`;
}
注意ReactDOM.hydrome
不是ReactDOM.render
在这个文件中,您可以添加您的谷歌分析等任何与DOM/窗口、DOM加载等有关的内容
基本上就是这样!我使用了下面的例子
感谢您提供如此详细的答案……不过有两个问题:1)如果我想添加描述和关键字,它将位于标题和视口所在的标题标签中?2) 客户端的react document meta是否适用于此…我的意思是,我看到服务器端使用了DocumentMeta.rewind()等术语…因此不确定我个人是否未使用react DocumentMeta,但我在呈现的应用程序中使用了react头盔。你可以有效地做到这两个!但请记住,该字符串中的任何内容都将被覆盖。你可能用得很好。可能也会做同样的事情!!你会试试outpastbin、repo或任何你想让我看的东西吗?嘿..完成了…只有我的元标记会根据url改变的事情…如何在node.js中获取当前url?