【发布时间】:2015-11-19 22:25:49
【问题描述】:
我正在尝试在 React 中使用同构渲染,以便可以将静态 HTML 作为文档输出为我的应用程序。
问题是我有一个仅在客户端上运行的特定组件,因为它引用了window。解决方案很明显:不在服务器上渲染它。是的,我不能在服务器上渲染它,但我仍然需要将它包含在我的webpack 包中,以便我可以在客户端上渲染它。问题是,阻止我的组件在服务器上呈现的代码是:
function isServer() {
return ! (typeof window != 'undefined' && window.document);
}
但是当webpack 捆绑时isServer() 也是true,我希望它在webpack 运行时正常工作。
那么,我如何检测webpack 正在运行?
我正在寻找这样的东西:
function isWebpack() {
// what do I put here?
}
如果isServer() 和!isWebpack(),现在我可以正常渲染我的客户端组件。
谢谢!
编辑
这是我正在尝试构建的组件:
function isServer() {
return ! (typeof window != 'undefined' && window.document);
}
import React from 'react';
const LED = React.createClass({
render: function () {
if(!isServer()) {
var LiveSchemaEditor = require('../../src/components/LiveSchemaEditor.js');
return <LiveSchemaEditor />;
}
return <div>I AM IN THE SERVER</div>;
}
});
export default LED;
困扰我的是webpack 包包含LiveSchemaEditor.js 的内容,但在客户端时仍会打印I AM IN THE SERVER。这没有意义。
【问题讨论】:
-
会检查一些节点-y 工作吗?
function isNode() { return process && typeof process.env === 'object' && Object.keys(process.env).length; }在浏览器上,返回0,但在节点中运行,它将 > 0。或者只是查找以下任何一个:nodejs.org/docs/latest/api/process.html#process.version -
@m59,谢谢,但在服务器渲染时也会返回 true。我需要只有在 webpack 正在运行时才返回 true 的东西。如果我可以在 webpack 运行时专门设置
process.env.NODE_ENV,那就可以了。 -
我不使用 webpack,所以你能告诉我如何设置你所指的情况吗? Webpack 实际上是在执行你的代码吗?
-
这对你来说会有点困难,因为你不习惯它:)。 Webpack 是一个打包工具。它遍历 CommonJs
require语句以构建 JavaScript 文件树并输出结果包。感谢您提供帮助。 -
我一直在使用browserify,之前也使用过webpack。应该不难。我不明白 webpack 本身将如何在捆绑过程中运行您的功能。 Webpack 不执行它捆绑的代码。您要么在运行时在浏览器或服务器中执行代码,所以只有检查它是在浏览器还是服务器中运行很重要,对吧?
标签: javascript node.js reactjs webpack