我可以检测到我的脚本是否正在被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_ENV
variables应该始终在生产模式下设置为production
,因为包括React在内的许多库都将其用于优化。)
你也可以这样做 –
typeof __webpack_require__ === 'function'
我猜这可能会随时改变,所以谨慎使用。 :/