2015-08-26 12 views
9

React içinde izomorfik rendering kullanmaya çalışıyorum, bu yüzden statik HTML'leri uygulamamın belgeleri olarak verebiliyorum.Komut dizimin Webpack tarafından işlenip işlenmediğini tespit edebilir miyim?

Sorun şu ki, yalnızca istemcide çalışan belirli bir bileşenim var, çünkü window. Çözüm açıktır: Sunucuda işlemek için değil. Evet, sunucu üzerinde işlem yapamıyorum, ancak yine de, webpack paketime dahil edilmesine ihtiyacım var, böylece istemci üzerinde oluşturabiliyorum. webpack donatılacak zaman

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

Ama isServer() da true ve webpack çalışırken ben normalde çalışmak istiyorum: Sorun sunucuda render benim bileşeni engelleyen kodu olmasıdır.

webpack'un çalıştığını nasıl anlarım?

böyle bir şey arıyorum:

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

Şimdi müvekkilim yalnızca bileşeni normalde eğer isServer() ve !isWebpack() hale getirebilir.

Teşekkürler!

DÜZENLEME

Bu benim kurmaya çalışıyorum bileşenidir:

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; 

Beni rahatsız eden webpack paket LiveSchemaEditor.js içeriğini içerdiğini ama yine de istemci üzerinde I AM IN THE SERVER süre yazdırır . Bu mantıklı değil. eklentileri altında webpack config

+0

Düğüm-işini kontrol etmek ister misiniz? 'function isNode() {return process && typeof process.env === 'object' && Object.keys (process.env).uzunluğu; } 'Tarayıcıda, '0' döndürüyor, ancak düğümde çalışıyor,> 0 olacak. Veya sadece şunlara bakın: https://nodejs.org/docs/latest/api/process.html#process .version – m59

+0

@ m59, teşekkürler, ancak sunucu oluştururken de bu geri dönecektir. Sadece web paketi çalışıyorsa, doğru dönen bir şeye ihtiyacım var. Webpack çalışırken, özellikle process.env.NODE_ENV 'yi ayarlayabilirsem, bu hile yapardı. –

+0

Webpack kullanmıyorum, bu yüzden bana atıfta bulunduğunuz durumun nasıl kurulacağını gösterebilir misiniz? Webpack aslında kodunuzu yürütüyor mu? – m59

cevap

16

koyun bu: aldığımızda

new webpack.DefinePlugin({ 
    'process.env': { 
     NODE_ENV: JSON.stringify('production'), 
     APP_ENV: JSON.stringify('browser') 
    } 
}), 

bir tarayıcıda veya olmasın bu şekilde çalıştırıyorsanız olmadığını kontrol edebilirsiniz:

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

Bu ortam değişkenleri olsun Çünkü Yapı sırasında değiştirilen Webpack, yalnızca sunucu olan kaynakları içermez. Basit, doğrudan bir karşılaştırmayla, bu tür şeyleri her zaman kolay bir şekilde yapmalısınız. Uglify tüm ölü kodları kaldıracaktır.

Daha önce bir işlev kullandıysanız ve yapı derleme sırasında değerlendirilmediğinden, Webpack nelerin atlanabileceğini bilmeyi bilmiyordu.

(NODE_ENV daima birçok kütüphaneler de dahil olmak üzere bu yana, üretim modunda production ayarlı optimizasyonlar için kullanmak tepki edilmelidir -Değişken.)

+0

Sonunda NODE_ENV ortam değişkeni hakkında yapılan bu etiket çok değerli görünüyor. Korkarım ki bir yerlerde bunu kaçırdım. Onu nerede görmeliydim? Belki de onu görmedim, çünkü bu kütüphanelerden hiçbirini kullanmıyorum. – BaldEagle

+0

@BaldEagle, Reamp'in NPM bölümündeki indirmeler sayfasında listelenmiştir: https://facebook.github.io/react/downloads.html#npm - Ben sadece birkaç kişi daha okumayı düşünüyorum. – Ambroos

+0

Yanıtın bir parçası: Henüz React kullanmıyorum. O zaman geliyor. Bu yardımcı olur, bazı web arama yaptım ve bu ilginç buldum: [link] (http://www.hacksparrow.com/running-express-js-in-production-mode.html) Yazdığınız için teşekkürler. – BaldEagle

4

Ayrıca bu yapabileceğini - Ben

typeof __webpack_require__ === 'function' 

Bunu tahmin etmek her an değişebilir, bu yüzden dikkatli kullanın. :/

İlgili konular