Come attivare / disattivare la 'modalità di sviluppo' di ReactJS?


120

Ho iniziato a utilizzare la funzione di convalida delle prop di ReactJS , che come dicono i documenti funziona solo in "modalità di sviluppo" per motivi di prestazioni.

React sembra convalidare le proprietà di un particolare componente che ho annotato, ma non ricordo di aver attivato esplicitamente la "modalità di sviluppo".

Ho provato a cercare come attivare / attivare la modalità di sviluppo, ma non ho avuto fortuna.


grande spiegazione succinta process.envper gli utenti WebPack: stackoverflow.com/questions/37311972/...
PTIM

Risposte:


129

L'altra risposta presume che tu stia utilizzando file precostruiti esterni da React , e sebbene sia corretto non è così che la maggior parte delle persone sta per o dovrebbe consumare React come pacchetto. Inoltre, a questo punto la maggior parte delle librerie e dei pacchetti React si basa anche sulla stessa convenzione per disattivare gli helper del tempo di sviluppo durante la produzione. Il solo utilizzo della reazione minimizzata lascerà sul tavolo anche tutte quelle potenziali ottimizzazioni.

Alla fine la magia si riduce a React incorporando riferimenti a process.env.NODE_ENVtutta la base di codice; questi si comportano come un interruttore di funzionalità.

if (process.env.NODE_ENV !== "production")
  // do propType checks

Quello sopra è il modello più comune e anche altre librerie lo seguono. Quindi per "disabilitare" questi controlli dobbiamo passare NODE_ENVa"production"

Il modo corretto per disabilitare la "modalità dev" è tramite il tuo bundler preferito.

webpack

Usa la DefinePluginconfigurazione del tuo webpack in questo modo:

new webpack.DefinePlugin({
  "process.env.NODE_ENV": JSON.stringify("production")
})

Browserify

Usa la trasformazione Envify ed esegui il passaggio di compilazione browserify con NODE_ENV=production( "set NODE_ENV=production"su Windows)

Risultato

Questo produrrà bundle di output che hanno tutte le istanze di process.env.NODE_ENVsostituito con la stringa letterale:"production"

indennità

Quando si minimizza il codice trasformato è possibile trarre vantaggio da "Dead Code Elimination". DCE è quando il minifier è abbastanza intelligente da rendersi conto che: "production" !== "production"è sempre falso e quindi rimuoverà semplicemente qualsiasi codice nel blocco if salvandoti byte.


1
La documentazione su
React

1
Hai davvero bisogno di JSON.stringify ('production') lì? O basta solo la "produzione"?
Vlad Nicula

4
@VladNicula deve essere '"production"'ie. citato due volte, stringify lo fa per te
panico monastico

1
Puoi anche usarlo in JSON.stringify(process.env.NODE_ENV)modo che possa essere attivato tramite NODE_ENV=production webpack ...la riga di comando. Aggiunto bonus di codice esplicito =)
Henry Blyth

2
Ho appena scoperto che questo DefinePluginuso può essere sostituito connew webpack.EnvironmentPlugin(['NODE_ENV'])
Henry Blyth il

50

Sì, non è molto ben documentato, ma nella pagina di download di ReactJS parla delle modalità di sviluppo e produzione:

Forniamo due versioni di React: una versione non compressa per lo sviluppo e una versione ridotta per la produzione. La versione di sviluppo include avvisi aggiuntivi sugli errori comuni, mentre la versione di produzione include ottimizzazioni delle prestazioni aggiuntive e rimuove tutti i messaggi di errore.

Fondamentalmente, la versione non ridotta di React è la modalità "sviluppo" e la versione ridotta di React è la modalità "produzione".

Per essere in modalità "produzione", includi semplicemente la versione ridotta react-0.9.0.min.js


2
Se il tuo bundler minimizza, non credo che rimuoverà il debug. Devi includere la versione minimizzata di React nella tua build di produzione - quella inclusa nella distribuzione React - è in realtà un codice diverso dalla versione non minimizzata, da quello che ho capito.
Edward M Smith

17
Se stai npmcompilando direttamente dal pacchetto react, usa qualcosa come envify per impostare NODE_ENV = 'production'per fare gli stessi controlli. @EdwardMSmith Fammi sapere dove avresti voluto vedere quelle informazioni e posso aggiungerle (o puoi semplicemente inviare un PR)!
Sophie Alpert

2
@ BenAlpert - Direi una pagina in Guide o Suggerimenti che delinea la distribuzione della produzione. Darò un'occhiata e vedrò cosa riesco a trovare. Non ho effettivamente eseguito una distribuzione di produzione, quindi potrebbe essere necessario alcune revisioni. Presenterò un PR.
Edward M Smith

1
Volevo solo aggiungere che la versione dell'addon non sembra avere la modalità di sviluppo attivata, anche la versione non ridotta.
KallDrexx

8
Non penso che questa sia la risposta migliore in quanto alcune persone costruiscono la loro reazione con browserify e una risposta da utilizzare NODE_ENVdovrebbe essere presente in alto.
Bjorn

16

L'ho postato altrove ma, francamente, qui sarebbe un posto migliore.

Supponendo che tu installi React 15.0.1 con npm, import react from 'react'o react = require('react')verrà eseguito ./mode_modules/react/lib/React.jsche è la fonte grezza di React.

I documenti di React suggeriscono di utilizzare ./mode_modules/react/dist/react.jsper lo sviluppo e react.min.jsper la produzione.

Se dovessi minimizzare /lib/React.jso /dist/react.jsper la produzione, React mostrerà un messaggio di avviso che hai minimizzato il codice di non produzione:

Warning: It looks like you're using a minified copy of the development build of React. When deploying React apps to production, make sure to use the production build which skips development warnings and is faster. See fb.me/react-minification for more details.

React-dom, Redux, React-Redux si comportano in modo simile. Redux visualizza un messaggio di avviso. Credo che anche React-dom lo faccia.

Quindi sei chiaramente incoraggiato a utilizzare la versione di produzione da /dist.

Tuttavia, se riduci le /distversioni, UglifyJsPlugin di webpack si lamenterà.

WARNING in ../~/react/dist/react.js Critical dependencies: 4:478-485 This seems to be a pre-built javascript file. Though this is possible, it's not recommended. Try to require the original source to get better results. @ ../~/react/dist/react.js 4:478-4851

Non puoi evitare questo messaggio perché UglifyJsPlugin può escludere solo blocchi webpack, non singoli file.

Uso personalmente sia la versione di sviluppo che quella di produzione /dist.

  • Webpack ha meno lavoro da fare e finisce un po 'prima. (YRMV)
  • I documenti di React dicono che /dist/react.min.jsè ottimizzato per la produzione. Non ho letto alcuna prova che 'process.env': { NODE_ENV: JSON.stringify(IS_PRODUCTION ? 'production' : 'development') }plus uglify faccia un buon lavoro come '/ dist / react.min.js`. Non ho letto alcuna prova che ottieni lo stesso codice risultante.
  • Ricevo 1 messaggio di avviso da uglify invece di 3 dall'ecosistema react / redux.

Puoi fare in modo che webpack utilizzi le /distversioni con:

resolve: {
    alias: {
      'react$': path.join(__dirname, 'node_modules', 'react','dist',
        (IS_PRODUCTION ? 'react.min.js' : 'react.js')),
      'react-dom$': path.join(__dirname, 'node_modules', 'react-dom','dist',
        (IS_PRODUCTION ? 'react-dom.min.js' : 'react-dom.js')),
      'redux$': path.join(__dirname, 'node_modules', 'redux','dist',
        (IS_PRODUCTION ? 'redux.min.js' : 'redux.js')),
      'react-redux$': path.join(__dirname, 'node_modules', 'react-redux','dist',
        (IS_PRODUCTION ? 'react-redux.min.js' : 'react-redux.js'))
    }
  }

1
Se si esegue da webpack cli: const IS_PRODUCTION = process.argv.indexOf ('- p')! == -1;
Greg

2
Questa non è la soluzione consigliata (fonte: lavoro su React). Le soluzioni corrette sono documentate qui: reactjs.org/docs/… . Se non funzionano per te, segnala un problema nel repository React e proveremo ad aiutarti.
Dan Abramov

4

Per la compilazione basata su webpack, ho usato per impostare webpack.config.js separati per DEV e PROD. Per Prod, risolvi l'alias come di seguito

     alias: {
        'react$': path.join(__dirname, 'node_modules', 'react','dist','react.min.js'),
        'react-dom$': path.join(__dirname, 'node_modules', 'react-dom','dist','react-dom.min.js')
    }

Puoi trovare quello funzionante da qui


1
Questa non è la soluzione consigliata (fonte: lavoro su React). Le soluzioni corrette sono documentate qui: reactjs.org/docs/… . Se non funzionano per te, segnala un problema nel repository React e proveremo ad aiutarti.
Dan Abramov

1

Se stai lavorando da qualcosa di simile tutorial ReactJS.NET / Webpack , non puoi usare process.env per attivare / disattivare la modalità di sviluppo di React per quanto ne so. Questo esempio collega direttamente a react.js (vedi Index.cshtml ), quindi devi solo scegliere .min.js o la variante non minimizzata cambiando l'URL.

Non sono sicuro del motivo per cui è così, perché il webpack.config.js di esempio ha un commento che sembra implicare externals: { react: 'React' }che farebbe il lavoro, ma poi va avanti e include la reazione direttamente nella pagina.


Se ho indovinato, stai dicendo che se raggruppi e minimizzi usando ReactJS.Net, non trarrà vantaggio dalla minimizzazione del file di sviluppo react.js. Per questo durante il raggruppamento utilizzando i controlli #IF DEBUG, è necessario modificare esplicitamente l'URL nel file di produzione di react.js fornito dalla pagina dei download di Facebook. Simile il caso con react-dom e Redux. Ho ragione?
Faisal Mq

@FaisalMushtaq Questo è parte di esso; a seconda di come includi react.js potresti dover passare esplicitamente alla versione minimizzata. Ma quello che volevo veramente dire è che è possibile impostare React in modo tale che il modo "ufficiale" di attivare la modalità di sviluppo non funzioni.
Roman Starkov

0

Per solo gli utenti V4 Webpack:

La specifica mode: productione mode: developmentnella configurazione del Webpack verrà definita process.env.NODE_ENVutilizzando DefinePlugin per impostazione predefinita. Nessun codice aggiuntivo necessario!

webpack.prod.js (tratto da documenti)

const merge = require('webpack-merge');
const common = require('./webpack.common.js');

module.exports = merge(common, {
  mode: 'production',
});

E nel nostro JS:

console.log(process.env.NODE_ENV) // --> 'development' or 'production'

Documenti Webpack: https://webpack.js.org/guides/production/#specify-the-mode


0

Uso un processo di compilazione manuale che viene eseguito tramite Webpack, quindi per me è stato un processo in due fasi:

  1. Imposta la variabile d'ambiente da package.json usando il pacchetto cross-env:

    "scripts": { "build-dev": "cross-env NODE_ENV=development webpack --config webpack.config.js", "build-prod": "cross-env NODE_ENV=production webpack --config webpack.config.js" }

  2. Modificare il file webpack.config.js per utilizzare la variabile di ambiente (che viene trasmessa a React per determinare se siamo in modalità sviluppo o produzione) e disabilitare la riduzione a icona del pacchetto prodotto se siamo in modalità sviluppo in modo da poter vedere il nomi effettivi dei nostri componenti. Dobbiamo utilizzare la proprietà di ottimizzazione di webpack nel nostro file webpack.config.js per questo:

    optimization: { nodeEnv: process.env.NODE_ENV, minimize: process.env.NODE_ENV === 'production' }

webpack v4.41.5, React v16.9.19, cross-env v7.0.0, nodo v10.16.14

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.