2015-08-26 10 views
9

Sto cercando di utilizzare il rendering isomorfo in React in modo da poter generare HTML statici come documentazione per la mia applicazione.Posso rilevare se il mio script è stato elaborato da Webpack?

Il problema è che ho un componente particolare che gira solo sul client, perché fa riferimento a window. La soluzione è ovvia: non renderlo sul server. Sì, non posso renderlo sul server, ma ancora, ho bisogno che sia incluso nel mio pacchetto webpack così posso renderlo sul client. Il problema è che, il codice che impedisce la mia componente dal rendering sul server è:

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

Ma isServer() è anche true quando webpack è bundling, e voglio farlo funzionare normalmente mentre webpack è in esecuzione.

Quindi, come si rileva che webpack è in esecuzione?

Sto cercando qualcosa di simile:

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

ora posso rendere la mia componente client-only normalmente se isServer() e !isWebpack().

Grazie!

EDIT

Questo è il componente che sto cercando di costruire:

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; 

Quello che mi rode è che il fascio webpack include il contenuto del LiveSchemaEditor.js ma esso stampa ancora I AM IN THE SERVER mentre sul client . Questo non ha senso.

+0

Verificare se qualcosa funziona come nodo? 'function isNode() {return process && typeof process.env === 'object' && Object.keys (process.env).lunghezza; } 'Nel browser, che restituisce' 0', ma in esecuzione nel nodo, sarà> 0. Oppure cerca solo questo: https://nodejs.org/docs/latest/api/process.html#process .versione – m59

+0

@ m59, grazie, ma ciò restituirà true durante il rendering del server. Ho bisogno di qualcosa che ritorni vero solo se webpack è in esecuzione. Se potessi impostare 'process.env.NODE_ENV' specificatamente per quando webpack è in esecuzione, ciò farebbe il trucco. –

+0

Non utilizzo webpack, quindi potresti mostrarmi come impostare la circostanza a cui ti riferisci? Webpack sta effettivamente eseguendo il tuo codice? – m59

risposta

16

mettere questo nella configurazione webpack sotto plugins:

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

Con che si può verificare se si sta eseguendo in un browser o non in questo modo:

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

Poiché queste variabili d'ambiente ottengono sostituito durante la compilazione, Webpack non includerà le risorse che sono solo server. Dovresti sempre fare questo genere di cose in modo semplice, con un confronto semplice e diretto. Uglify rimuoverà tutto il codice morto.

Poiché è stata utilizzata una funzione in precedenza e la funzione non viene valutata durante la compilazione, Webpack non è stato in grado di sapere che cosa potrebbe saltare.

(Il NODE_ENV -variable dovrebbe sempre essere impostato su production in modalità di produzione, dal momento che molte biblioteche comprese Reagire usarlo per ottimizzazioni.)

+0

Questo tag alla fine della variabile d'ambiente NODE_ENV sembra così prezioso temo di averlo perso in qualche modo ovvio. Dove dovrei averlo visto? Forse non l'ho visto perché non mi capita di usare nessuna di quelle librerie? – BaldEagle

+0

@BaldEagle, è elencato nella pagina dei download di React nella sezione NPM: https://facebook.github.io/react/downloads.html#npm - Penso che poche persone lo leggano più. – Ambroos

+0

Questa è la parte della risposta: non sto ancora utilizzando React. Quel tempo sta arrivando. Nel caso in cui aiuta, ho fatto alcune ricerche sul web e ho trovato questo interessante: [link] (http://www.hacksparrow.com/running-express-js-in-production-mode.html) Grazie per aver scritto. – BaldEagle

4

Si potrebbe anche fare questo -

typeof __webpack_require__ === 'function' 

Sono supponendo che questo potrebbe cambiare in qualsiasi momento, quindi usare con cautela. :/

Problemi correlati