Commencé à utiliser fonctionnalité de validation de ReactJS, qui, selon la documentation, ne fonctionne qu'en mode de 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 d'avoir explicitement activé le "mode de développement".
J'ai essayé de chercher comment déclencher/basculer le mode de développement, mais je n'ai pas eu de chance.
L'autre réponse suppose que vous utilisez des fichiers prédéfinis externes provenant de react, et bien que correct, ce n'est pas ce que la plupart des gens vont faire ou devrait consommer React comme un paquet. De plus, à ce stade, la plupart des bibliothèques et packages React reposent également sur et reposent sur la même convention pour désactiver les assistants de développement pendant la production. Le simple fait d’utiliser l’agenda minimisé laissera toutes ces optimisations potentielles sur la table.
En fin de compte, la magie consiste à intégrer dans React des références à process.env.NODE_ENV
Dans l'ensemble de la base de code; ceux-ci agissent comme une fonctionnalité bascule.
if (process.env.NODE_ENV !== "production")
// do propType checks
Le modèle ci-dessus est le modèle le plus répandu et d’autres bibliothèques le suivent également. Donc, pour "désactiver" ces vérifications, nous devons basculer NODE_ENV
En "production"
Le moyen approprié pour désactiver le "mode dev" consiste à choisir votre bundler.
Utilisez le DefinePlugin
dans la configuration de votre webpack comme suit:
new webpack.DefinePlugin({
"process.env": {
NODE_ENV: JSON.stringify("production")
}
})
Utilisez la transformation Envify et exécutez votre étape de construction de browserify avec NODE_ENV=production
("set NODE_ENV=production"
Sous Windows).
Cela produira des ensembles de sortie dans lesquels toutes les instances de process.env.NODE_ENV
Seront remplacées par le littéral de chaîne: "production"
Lorsque vous réduisez le code transformé, vous pouvez tirer parti de "Dead Code Elimination". DCE est lorsque le minificateur est assez intelligent pour se rendre compte que: "production" !== "production"
Est toujours faux et supprime simplement le code du bloc if vous sauver des octets.
Oui, ce n’est pas vraiment bien documenté, mais sur le ReactJS page de téléchargement , il est question de modes de développement et de production:
Nous fournissons deux versions de React: une version non compressée pour le développement et une version réduite pour la production. La version de développement inclut des avertissements supplémentaires sur les erreurs courantes, tandis que la version de production inclut des optimisations de performances supplémentaires et supprime tous les messages d'erreur.
Fondamentalement, la version non complétée du React est le mode "développement") et la version simplifiée du React est le mode "production".
Pour être en mode "production", incluez simplement la version simplifiée react-0.9.0.min.js
J'ai posté ceci ailleurs mais, franchement, ici serait un meilleur endroit.
En supposant que vous installiez React 15.0.1 avec npm, import react from 'react'
Ou react = require('react')
exécutera ./mode_modules/react/lib/React.js
, Qui est la source brute de React.
Les documents React vous suggèrent d'utiliser ./mode_modules/react/dist/react.js
Pour le développement et react.min.js
Pour la production.
Si vous minimisez /lib/React.js
Ou /dist/react.js
Pour la production, React affiche 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 crois que react-dom aussi.
Vous êtes donc clairement encouragé à utiliser la version de production de /dist
.
Cependant, si vous réduisez les versions /dist
, 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 fragments de Webpack, pas des fichiers individuels.
J'utilise les versions développement et production /dist
Moi-même.
/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 fasse un aussi bon travail que '/ dist/react.min.js`. Je n'ai lu aucune preuve que vous obteniez le même code résultant.Webpack peut utiliser les versions /dist
Avec:
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'))
}
}
Pour la construction basée sur Webpack, j'avais l'habitude de configurer webpack.config.js pour DEV et PROD. Pour Prod, résolvez l'alias comme ci-dessous
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')
}
Vous pouvez trouver le travail de ici
Si vous travaillez à partir de quelque chose comme ceci tutoriel de ReactJS.NET/Webpack , vous ne pouvez pas utiliser process.env pour passer React activé/désactivé aussi loin que possible) 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 trop pourquoi, car le fichier Webpack.config.js de l'exemple comporte un commentaire qui semble impliquer le externals: { react: 'React' }
ferait le travail, mais passerait ensuite à autre et réagirait directement dans la page.
Pour uniquement utilisateurs de Webpack v4:
En précisant mode: production
et mode: development
dans votre configuration Webpack définira process.env.NODE_ENV
en utilisant le DefinePlugin par défaut. Aucun code supplémentaire nécessaire!
webpack.prod.js (tiré de la documentation)
const merge = require('webpack-merge');
const common = require('./webpack.common.js');
module.exports = merge(common, {
mode: 'production',
});
Et dans notre JS:
console.log(process.env.NODE_ENV) // --> 'development' or 'production'
Documents Webpack: https://webpack.js.org/guides/production/#specify-the-mode