J'ai commencé à utiliser la fonction de validation des accessoires de ReactJS , qui, comme le disent les documents, ne fonctionne qu'en `` mode développement '' pour des raisons de performances.
React semble valider les propriétés d'un composant particulier que j'ai annoté, mais je ne me souviens pas avoir explicitement activé le «mode développement».
J'ai essayé de chercher comment déclencher / activer le mode de développement, mais je n'ai pas eu de chance.
process.env
pour les utilisateurs de Webpack: stackoverflow.com/questions/37311972/…Réponses:
L'autre réponse suppose que vous utilisez des fichiers externes pré-construits de react, et bien que cela soit correct, ce n'est pas ainsi que la plupart des gens vont ou devraient consommer React en tant que package. De plus, à ce stade, la plupart des bibliothèques et packages React reposent également sur la même convention pour désactiver les assistants de temps de développement pendant la production. Le simple fait d'utiliser la réaction minifiée laissera également toutes ces optimisations potentielles sur la table.
En fin de compte, la magie se résume à l'incorporation de références à React dans
process.env.NODE_ENV
toute la base de code; ceux-ci agissent comme une bascule de fonctionnalité.Ce qui précède est le modèle le plus courant, et d'autres bibliothèques le suivent également. Donc, pour "désactiver" ces vérifications, nous devons basculer
NODE_ENV
vers"production"
La bonne façon de désactiver le "mode dev" est d'utiliser le bundler de votre choix.
Webpack
Utilisez le
DefinePlugin
dans votre configuration Webpack comme ceci:Naviguer
Utilisez la transformation Envify et exécutez votre étape de génération browserify avec
NODE_ENV=production
("set NODE_ENV=production"
sous Windows)Résultat
Cela produira des bundles de sortie dont toutes les instances de seront
process.env.NODE_ENV
remplacées par la chaîne littérale:"production"
Prime
Lors de la réduction du code transformé, vous pouvez profiter de "Dead Code Elimination". DCE est lorsque le minificateur est assez intelligent pour se rendre compte que:
"production" !== "production"
est toujours faux et supprimera donc tout code dans le bloc if vous économisant des octets.la source
'"production"'
ie. guillemets doubles, stringify fait ça pour vousJSON.stringify(process.env.NODE_ENV)
pour qu'il puisse être basculé viaNODE_ENV=production webpack ...
sur la ligne de commande. Bonus de code explicite ajouté =)DefinePlugin
utilisation peut être remplacée parnew webpack.EnvironmentPlugin(['NODE_ENV'])
Oui, ce n'est pas vraiment bien documenté, mais sur la page de téléchargement de ReactJS, il parle des modes de développement et de production:
Fondamentalement, la version non réduite de React est le mode "développement", et la version réduite de React est le mode "production".
Pour être en mode "production", il suffit d'inclure la version minifiée
react-0.9.0.min.js
la source
npm
directement à partir du package react, utilisez quelque chose comme envify pour définirNODE_ENV = 'production'
les mêmes vérifications. @EdwardMSmith Faites-moi savoir où vous auriez voulu voir cette information et je peux l'ajouter (ou vous pouvez simplement soumettre un PR)!NODE_ENV
devrait être présente en haut.J'ai posté ceci ailleurs mais, franchement, ici serait un meilleur endroit.
En supposant que vous installez React 15.0.1 avec npm,
import react from 'react'
oureact = require('react')
que vous exécuterez./mode_modules/react/lib/React.js
la source brute de React.La documentation React vous suggère d'utiliser
./mode_modules/react/dist/react.js
pour le développement etreact.min.js
pour la production.Si vous minimisez
/lib/React.js
ou/dist/react.js
pour la production, React affichera un message d'avertissement indiquant que vous avez minifié le code de non-production: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 se comportent de la même manière. Redux affiche un message d'avertissement. Je pense que react-dom aussi.
Vous êtes donc clairement encouragé à utiliser la version de production de
/dist
.Cependant, si vous réduisez les
/dist
versions, UglifyJsPlugin de webpack se plaindra.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
Vous ne pouvez pas éviter ce message car UglifyJsPlugin ne peut exclure que des blocs Webpack, pas des fichiers individuels.
J'utilise
/dist
moi-même les versions de développement et de production ./dist/react.min.js
est optimisé pour la production. Je n'ai lu aucune preuve que'process.env': { NODE_ENV: JSON.stringify(IS_PRODUCTION ? 'production' : 'development') }
plus uglify fait un aussi bon travail que «/ dist / react.min.js». Je n'ai lu aucune preuve que vous obtenez le même code résultant.Vous pouvez faire en sorte que webpack utilise les
/dist
versions avec:la source
Pour la construction basée sur webpack, j'avais l'habitude de configurer webpack.config.js séparé pour DEV et PROD. Pour Prod, résolvez l'alias comme ci-dessous
Vous pouvez trouver celui qui fonctionne à partir d' ici
la source
Si vous travaillez à partir de quelque chose comme ce tutoriel ReactJS.NET / Webpack , vous ne pouvez pas utiliser process.env pour activer / désactiver le mode de développement React pour autant que je sache. Cet exemple renvoie directement à react.js (voir Index.cshtml ), il vous suffit donc de choisir .min.js ou la variante non minifiée en modifiant l'URL.
Je ne sais pas pourquoi c'est le cas, car le webpack.config.js de l'exemple a un commentaire qui semble impliquer
externals: { react: 'React' }
qu'il ferait le travail, mais continue et inclut réagir directement dans la page.la source
Pour les utilisateurs de Webpack v4 uniquement :
Spécifier
mode: production
etmode: development
dans votre configuration Webpack définiraprocess.env.NODE_ENV
à l'aide du DefinePlugin par défaut. Aucun code supplémentaire nécessaire!webpack.prod.js (extrait de la documentation)
Et dans notre JS:
Webpack Docs: https://webpack.js.org/guides/production/#specify-the-mode
la source
J'utilise un processus de construction manuel qui passe par Webpack, donc c'était un processus en deux étapes pour moi:
Définissez la variable d'environnement de package.json à l'aide du package 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" }
Modifiez le fichier webpack.config.js pour utiliser la variable d'environnement (qui est transmise à React pour déterminer si nous sommes en mode développement ou production), et désactivez la minimisation du bundle produit si nous sommes en mode développement afin que nous puissions voir le les noms réels de nos composants. Nous devons utiliser la propriété d' optimisation de webpack dans notre fichier webpack.config.js pour cela:
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, nœud v10.16.14
la source