- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序,其中 webpack 配置为模块 bundler ,babel 作为我的 js 编译器。全部都在 Node 引擎上。我设置当我运行 npm run dev
时,将会发生以下流程:
webpack-dev-server.js
将运行。该文件如下:
const Express = require('express');
const webpack = require('webpack');
const webpackConfig = require('./dev.config');
const compiler = webpack(webpackConfig);
const host = 'localhost';
const port = 8080;
const serverOptions = {
contentBase: `http://${host}:${port}`,
quiet: true,
noInfo: true,
hot: true,
inline: true,
lazy: false,
publicPath: webpackConfig.output.publicPath,
headers: { 'Access-Control-Allow-Origin': '*' },
stats: { colors: true },
};
const app = new Express();
app.use(require('webpack-dev-middleware')(compiler, serverOptions));
app.use(require('webpack-hot-middleware')(compiler));
app.listen(port, function onAppListening(err) {
if (err) {
console.error(err);
} else {
console.info('==> Webpack development server listening on port %s', port);
}
});
然后是server.js
require('./../server.babel');
const path = require('path');
const WebpackIsomorphicTools = require('webpack-isomorphic-tools');
const rootDir = path.resolve(require('../server/config').rootDir);
global.__CLIENT__ = false;
global.__SERVER__ = true;
global.__DEVELOPMENT__ = process.env.NODE_ENV !== 'production';
if (__DEVELOPMENT__) {
if (!require('piping')({
hook: true,
ignore: /(\/\.|~$|\.json|\.scss$)/i
})) {
return;
}
}
global.webpackIsomorphicTools = new WebpackIsomorphicTools(require('../webpack/webpack-isomorphic-tools'))
.development(__DEVELOPMENT__)
.server(rootDir, () => {
require('../server/server');
});
express 和 React 渲染:
import 'babel-polyfill';
// Server
import express from 'express';
import session from 'express-session';
import cookieParser from 'cookie-parser';
// React
import React from 'react';
import ReactDOM from 'react-dom/server';
import createHistory from 'react-router/lib/createMemoryHistory';
import { match } from 'react-router';
// Redux
import { Provider } from 'react-redux';
import { ReduxAsyncConnect, loadOnServer } from 'redux-connect';
import { syncHistoryWithStore } from 'react-router-redux';
import path from 'path';
import csurf from 'csurf';
import bodyParser from 'body-parser';
// Relative imports
import Html from '../shared/html';
import proxy from './proxy';
import createStore from '../shared/redux/create';
import { staticPath } from './config';
import { getRoutes } from '../shared/routes';
require('dotenv').config({
path: path.resolve(__dirname, '../.env'),
});
const SERVER_PORT = process.env.SERVER_PORT;
const APP_SECRET = process.env.APP_SECRET;
const API_PORT = process.env.API_PORT;
const API_HOST = process.env.API_HOST;
function renderPage({ renderProps, store, res, client, csrfToken }) {
loadOnServer({ ...renderProps, store, helpers: { client } })
.then(() => {
const component = (
<Provider store={store} key="provider">
<ReduxAsyncConnect {...renderProps} />
</Provider>
);
res.status(200);
res.send('<!doctype html>\n' +
ReactDOM.renderToString(
<Html
assets={webpackIsomorphicTools.assets()}
component={component}
csrfToken={csrfToken}
store={store}
/>,
),
);
})
.catch((err) => {
console.error(err.stack);
});
}
const app = express();
const csrf = csurf();
// express middlewares
// app.use(favicon(path.resolve(__dirname, '../static/favicon.ico'))); @TODO favicon @ilanus
app.use(bodyParser.json());
app.use(express.static(staticPath));
app.use(cookieParser(APP_SECRET));
app.use(session({
secret: APP_SECRET,
saveUninitialized: true,
resave: true,
}));
app.use(csrf);
app.use('/api', (req, res) => {
if (!req.xhr) res.redirect('/');
proxy.web(req, res, { target: `http://${API_HOST}:${API_PORT}` });
});
app.use((req, res) => {
const csrfToken = req.csrfToken();
if (__DEVELOPMENT__) {
// Do not cache webpack stats: the script file would change since
// hot module replacement is enabled in the development env
webpackIsomorphicTools.refresh();
}
const memoryHistory = createHistory(req.originalUrl);
const store = createStore({}, memoryHistory);
const history = syncHistoryWithStore(memoryHistory, store);
match({ history, routes: getRoutes(store), location: req.originalUrl },
(error, redirectLocation, renderProps) => {
if (redirectLocation) {
res.redirect(redirectLocation.pathname + redirectLocation.search);
} else if (error) {
console.error('ROUTER ERROR:', error);
res.status(500);
} else if (renderProps) {
renderPage({ renderProps, store, res, csrfToken });
} else {
res.status(404).send('Not found');
}
});
});
app.use((err, req, res) => {
if (err === 'EBADCSRFTOKEN') {
res.status(403);
res.send('invalid csrf token');
} else {
res.status(500);
res.send('Oops, internal server error');
}
});
app.listen(SERVER_PORT, (error) => {
if (error) {
console.error(error);
} else {
console.info(`App started listening on port ${SERVER_PORT}`);
}
});
现在,每当我尝试在 render()
函数或 componentDidMount 中使用
我最终得到: console.log('window', window, 'sessionStorage', sessionStorage);
React 组件的 ()sessionStorage is not Defined, window is not Defined
错误。我想那是因为我在服务器端运行堆栈,而这些堆栈在那里不可用,我错过了什么?
最佳答案
您只需要一个函数,而不是直接访问窗口和窗口属性,例如
function globalObj(){
const isNode = typeof process === 'object' && process.versions && !!process.versions.node;
return isNode ? global : window;
}
您可以从那里以通用方式访问 sessionStorage 等,不会出现错误
globalObj()["sessionStorage"]
我希望这会有所帮助。
关于javascript - ReactDOM.renderToString sessionStorage 未定义,window 未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41168615/
我有一个包含 React 应用程序和其他 HTML 元素的项目。这意味着: ReactDOM.render(, document.getElementById('element1') ReactDO
我有如下代码,我在其中调用 ReactDOM.Hydrate。这是共享代码,有时从节点服务器调用,有时在客户端浏览器中调用。仅在客户端上调用它时,我是否需要做任何不同的事情(然后调用Hydrate)。
我有多个元素使用相同的类并具有相同的内容。 所以我可以使用 ReactDOM 来渲染它们,而不是: ReactDOM.render( , document.getElementsByC
ReactJS 新手,无法找出为什么此页面没有显示任何内容 -
我正在尝试用 reactjs 编写一个基本程序 Hello React! ReactDOM.render(
我是 React 新手,我正在尝试遵循这个滴答作响的时钟示例,但做一些不同的事情。我想要ReactDOM将在 index.js 中呈现。这是我的代码: Timer.js: import React f
我有一个方法可以在提供的容器内呈现一个图标(字体很棒的图标)。图标渲染可以通过用户单击特定 div 或程序本身在模仿用户单击特定 div 时自动调用渲染函数来进行。 为了更好地理解这一点。我创建了这个
我正在将 React 与 Webpack 和 Babel 结合使用。我收到运行时错误: Uncaught ReferenceError: ReactDom is not defined 我的 reac
升级到版本 0.14.2 后,我看到错误并建议使用 ReactDOM.render()而不是 React.render(),但是我从哪里导入它呢? 当我不导入它并按原样运行时,它显示为 undefin
索引.js: import React from 'react'; import buttonsInstance from 'components/button-instance'; import {
来自 React 16 docs关于ReactDOM.Hydrate(), Same as render(), but is used to hydrate a container whose HTM
我的 react 有点新。我发现我们必须导入两个东西才能开始,React 和 ReactDOM,任何人都可以解释其中的区别。我正在阅读React documentation ,但没有说。 最佳答案 R
因此请考虑以下示例: import React from 'react'; import ReactDOM from 'react-dom/dist/react-dom'; class Dash
我是 ReactJS 的新手。我试图使用 ReactDOM 渲染一个简单的 div,但无法这样做。这是我的代码: Hello React
我有一个问题。我一直在我工作的公司开发 React 组件,但从未真正使用过 reactDOM.render()功能。(除了内部 INDEX.JS: ReactDOM.render( , documen
我不明白为什么此页面没有显示任何内容: console.log("Hi
我有一个简单的 React 应用程序,它包含一组数据,这些数据显示在 React 中创建的容器中: var products = [ { name: 'product 1'}, { name: 'pr
在我的主文件中我有这段代码 import phoneReactElement from "../components/phone.js"; ReactDOM.render(, document.get
为什么这不起作用?我正在关注 YouTube 教程。 function Hello(props) { return Hello; } ReactDOM.render( Hello, d
目前无法弄清楚为什么我的代码没有呈现。会喜欢你们中一些杰出的 react.js 编码员的一些建议。真的不明白哪里出了问题 - 我觉得应该可以。 这是我的 App.js import React fro
我是一名优秀的程序员,十分优秀!