我可以检测到我的脚本是否正在被Webpack处理?

我试图在React中使用同构渲染,所以我可以输出静态HTML作为我的应用程序的文档。

问题是我有一个特定的组件只能运行在客户端上,因为它引用了window 。 解决scheme是显而易见的:不要在服务器上呈现它。 是的,我不能在服务器上渲染它,但仍然需要将它包含在我的webpack包中,以便在客户端上呈现它。 问题是,防止我的组件在服务器上呈现的代码是:

 function isServer() { return ! (typeof window != 'undefined' && window.document); } 

isServer()webpack捆绑时也是true ,我希望它在webpack运行时正常工作。

那么,如何检测webpack正在运行?

我正在寻找这样的东西:

 function isWebpack() { // what do I put here? } 

现在,如果isServer()!isWebpack()正常,我可以正常渲染我的客户端组件。

谢谢!

编辑

这是我正在尝试构build的组件:

 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包包括webpack的内容,但它仍然打印I AM IN THE SERVER而在客户端上。 这没有意义。

把它放在你的webpackconfiguration下插件:

 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(); } 

由于这些环境variables在构build期间被replace,Webpack将不包含仅服务器的资源。 你应该总是以简单的方式做这些事情,做一个简单而直接的比较。 Uglify将删除所有的死代码。

既然你之前使用过一个函数,而且这个函数在构build过程中没有被评估,Webpack就不知道需要跳过的东西。

NODE_ENVvariables应该始终在生产模式下设置为production ,因为包括React在内的许多库都将其用于优化。)

你也可以这样做 –

 typeof __webpack_require__ === 'function' 

我猜这可能会随时改变,所以谨慎使用。 :/