Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我是否可以检测Web包是否正在处理我的脚本?_Javascript_Node.js_Reactjs_Webpack - Fatal编程技术网

Javascript 我是否可以检测Web包是否正在处理我的脚本?

Javascript 我是否可以检测Web包是否正在处理我的脚本?,javascript,node.js,reactjs,webpack,Javascript,Node.js,Reactjs,Webpack,我正在尝试在React中使用同构渲染,以便可以输出静态HTMLs作为应用程序的文档 问题是我有一个只在客户机上运行的特定组件,因为它引用了window。解决方案很明显:不要在服务器上渲染它。是的,我无法在服务器上渲染它,但我仍然需要将它包含在我的网页包中,以便我可以在客户端渲染它。问题在于,阻止我的组件在服务器上呈现的代码是: function isServer() { return ! (typeof window != 'undefined' && window.do

我正在尝试在React中使用同构渲染,以便可以输出静态HTMLs作为应用程序的文档

问题是我有一个只在客户机上运行的特定组件,因为它引用了
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.js
global中。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是一个捆绑工具。它遍历CommonJs
require
语句来构建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