Javascript 我是否可以检测Web包是否正在处理我的脚本?
我正在尝试在React中使用同构渲染,以便可以输出静态HTMLs作为应用程序的文档 问题是我有一个只在客户机上运行的特定组件,因为它引用了Javascript 我是否可以检测Web包是否正在处理我的脚本?,javascript,node.js,reactjs,webpack,Javascript,Node.js,Reactjs,Webpack,我正在尝试在React中使用同构渲染,以便可以输出静态HTMLs作为应用程序的文档 问题是我有一个只在客户机上运行的特定组件,因为它引用了window。解决方案很明显:不要在服务器上渲染它。是的,我无法在服务器上渲染它,但我仍然需要将它包含在我的网页包中,以便我可以在客户端渲染它。问题在于,阻止我的组件在服务器上呈现的代码是: function isServer() { return ! (typeof window != 'undefined' && window.do
window
。解决方案很明显:不要在服务器上渲染它。是的,我无法在服务器上渲染它,但我仍然需要将它包含在我的网页包中,以便我可以在客户端渲染它。问题在于,阻止我的组件在服务器上呈现的代码是:
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;
函数isServer(){
return!(typeof window!=“未定义”和&window.document);
}
从“React”导入React;
常量LED=React.createClass({
渲染:函数(){
如果(!isServer()){
var LiveSchemaEditor=require('../../src/components/LiveSchemaEditor.js');
返回;
}
返回我在服务器中;
}
});
输出默认LED;
困扰我的是webpack
捆绑包包含LiveSchemaEditor.js
的内容,但它仍然打印我在客户端时在服务器中。这没有意义。将其放在您的网页配置的插件下:
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify('production'),
APP_ENV: JSON.stringify('browser')
}
}),
使用此选项,您可以通过以下方式检查是否在浏览器中运行:
if (process.env.APP_ENV === 'browser') {
const doSomething = require('./browser-only-js');
doSomething();
} else {
const somethingServer = require('./server-only-js');
somethingServer();
}
if (process.env.APP_ENV !== 'browser') {
const somethingServer = require('./server-only-js');
somethingServer();
}
因为这些环境变量在构建期间被替换,所以Webpack将不包含仅用于服务器的资源。你应该总是以一种简单、直接的方式做这类事情。Uglify将删除所有死代码
由于您以前使用过一个函数,而该函数在生成过程中未进行评估,Webpack无法知道它可以跳过哪些要求
(在生产模式下,NODE_ENV
-变量应始终设置为production
,因为包括React在内的许多库都使用它进行优化。)您也可以这样做-
typeof __webpack_require__ === 'function'
我猜这可能随时会改变,所以请谨慎使用/ 更改render()
的输出会导致react无法重新水化组件,因此将讨论服务器端渲染
取而代之,考虑使用<强>组件DestMux<强>,它只在浏览器中运行:
//文件级常量(缓存结果)
让LiveSchemaEditor=()=>null;
//...
componentDidMount(){
LiveSchemaEditor=LiveSchemaEditor | | require('../../src/components/LiveSchemaEditor.js');
this.setState({editor:});
}
render(){
如果(!this.state.editor){
返回装载。。。;
}
返回此.state.editor;
}
这对我来说很有用
if(typeof process.env.NODE_env==“未定义”){
//不是网页包
}否则{
//它的网页
}
在Node.jsglobal中。global
是循环引用,Webpack不创建此循环:
函数是_node(){
返回全局的类型!='undefined'&&global.global===global;
}
检查node-y是否有效<代码>函数isNode(){return process&&typeof process.env===='object'&&object.keys(process.env).length;}
在浏览器上返回0
,但在节点中运行时,它将>0。或者只需查找以下内容:@m59,谢谢,但在服务器渲染时也会返回true。我需要的东西,返回真的只有当网页正在运行。如果我可以设置process.env.NODE\u env
专门用于webpack运行时,那就可以了。我不使用webpack,所以您能告诉我如何设置您所指的环境吗?Webpack实际上正在执行您的代码?这对您来说有点困难,因为您不习惯它:)。Webpack是一个捆绑工具。它遍历CommonJsrequire
语句来构建JavaScript文件树并输出结果包。我很感谢你的帮助。我一直在使用browserify,我以前也用过webpack。应该不难。我不明白的是,webpack本身将如何在捆绑过程中运行您的功能。Webpack不执行它绑定的代码。您可以在运行时在浏览器或服务器中执行代码,因此只有检查它是否在浏览器或服务器中运行才有意义,对吗?末尾关于NODE_ENV环境变量的标记看起来非常有价值,我担心我在某个明显的地方遗漏了它。我应该在哪里看到它?也许我没有看到它,因为我没有使用这些库中的任何一个?@BaldEagle,它列在NPM部分的React下载页面上:-我只是觉得现在很少有人读它了。这是答案的一部分:我还没有使用React。这一时刻即将到来。如果有帮助的话,我做了一些网络搜索,发现这很有趣:谢谢你的写作。如果你把它作为一个对象传递给DefinePlugin
,你最终会重写整个NODE\u ENV
。相反:“process.env.NODE_env”:JSON.stringify(…),“process.env.APP_env”:…
这不起作用,在我的单元测试NODE_env
是'test'
,我使用nyc
+ava
。