Comencé a usar la función de validación de prop de ReactJS , que como dicen los documentos solo funciona en 'modo de desarrollo' por razones de rendimiento.
React parece estar validando las propiedades de un componente en particular que he anotado, pero no recuerdo haber activado explícitamente el 'modo de desarrollo'.
Intenté buscar cómo activar / alternar el modo de desarrollo, pero no he tenido suerte.
process.env
para usuarios de paquetes web: stackoverflow.com/questions/37311972/…Respuestas:
La otra respuesta asume que está utilizando archivos externos precompilados de React , y aunque es correcto, así no es como la mayoría de la gente va o debería consumir React como un paquete. Además, en este punto, la mayoría de las bibliotecas y paquetes de React también se basan en la misma convención para desactivar los ayudantes de tiempo de desarrollo durante la producción. El solo uso de la reacción minificada también dejará todas esas optimizaciones potenciales sobre la mesa.
En última instancia, la magia se reduce a que React incorpore referencias a
process.env.NODE_ENV
todo el código base; actúan como una función de alternancia.El anterior es el patrón más común y otras bibliotecas también lo siguen. Entonces, para "deshabilitar" estas comprobaciones, debemos cambiar
NODE_ENV
a"production"
La forma correcta de deshabilitar el "modo de desarrollo" es a través del paquete que elija.
paquete web
Use el
DefinePlugin
en la configuración de su paquete web así:Browserify
Use la transformación de Envify y ejecute su paso de compilación de browserify con
NODE_ENV=production
("set NODE_ENV=production"
en Windows)Resultado
Esto producirá paquetes de salida que tienen todas las instancias de
process.env.NODE_ENV
reemplazadas con el literal de cadena:"production"
Prima
Al minimizar el código transformado, puede aprovechar la "Eliminación de código muerto". DCE es cuando el minificador es lo suficientemente inteligente como para darse cuenta de que: siempre
"production" !== "production"
es falso y, por lo tanto, simplemente eliminará cualquier código en el bloque if que le ahorrará bytes.fuente
'"production"'
ie. citado doble, stringify hace eso por tiJSON.stringify(process.env.NODE_ENV)
para poder alternarlo a travésNODE_ENV=production webpack ...
de la línea de comandos. Bono adicional de código explícito =)DefinePlugin
uso se puede reemplazar connew webpack.EnvironmentPlugin(['NODE_ENV'])
Sí, no está muy bien documentado, pero en la página de descarga de ReactJS habla sobre los modos de desarrollo y producción:
Básicamente, la versión no minificada de React es el modo "desarrollo", y la versión minificada de React es el modo "producción".
Para estar en modo "producción", solo incluye la versión reducida
react-0.9.0.min.js
fuente
npm
compilando directamente desde el paquete react, use algo como envify para configurarNODE_ENV = 'production'
para hacer las mismas comprobaciones. @EdwardMSmith ¡Avíseme dónde le hubiera gustado ver esa información y puedo agregarla (o simplemente puede enviar un PR)!NODE_ENV
debería estar presente en la parte superior.Publiqué esto en otro lugar pero, francamente, este sería un lugar mejor.
Suponiendo que instale React 15.0.1 con npm,
import react from 'react'
oreact = require('react')
se ejecutará,./mode_modules/react/lib/React.js
que es la fuente sin procesar de React.Los documentos de React sugieren que se utilice
./mode_modules/react/dist/react.js
para desarrollo yreact.min.js
producción.Si minimiza
/lib/React.js
o/dist/react.js
para producción, React mostrará un mensaje de advertencia de que ha minimizado el código que no es de producción: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 comportan de manera similar. Redux muestra un mensaje de advertencia. Creo que react-dom también lo hace.
Por tanto, se le anima claramente a utilizar la versión de producción de
/dist
.Sin embargo, si minimiza las
/dist
versiones, UglifyJsPlugin de webpack se quejará.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
No puede evitar este mensaje porque UglifyJsPlugin solo puede excluir fragmentos de paquetes web, no archivos individuales.
Yo mismo utilizo las versiones de desarrollo y producción
/dist
./dist/react.min.js
está optimizado para la producción. No he leído ninguna prueba de que'process.env': { NODE_ENV: JSON.stringify(IS_PRODUCTION ? 'production' : 'development') }
plus uglify funcione tan bien como '/ dist / react.min.js`. No he leído ninguna prueba de que obtenga el mismo código resultante.Puede hacer que webpack use las
/dist
versiones con:fuente
Para la compilación basada en paquetes web, solía configurar webpack.config.js separados para DEV y PROD. Para Prod, resuelva el alias como se muestra a continuación
Puedes encontrar el que funciona desde aquí
fuente
Si está trabajando desde algo como este tutorial de ReactJS.NET / Webpack , no puede usar process.env para activar / desactivar el modo de desarrollo de React, hasta donde yo sé. Este ejemplo se vincula a react.js directamente (consulte Index.cshtml ), por lo que solo tiene que elegir .min.js o la variante no minimizada cambiando la URL.
No estoy seguro de por qué ese es el caso, porque el webpack.config.js de la muestra tiene un comentario que parece implicar
externals: { react: 'React' }
que haría el trabajo, pero luego sigue adelante e incluye reaccionar directamente en la página.fuente
Para única usuarios v4 webpack:
Especificar
mode: production
ymode: development
en su configuración de Webpack definirá elprocess.env.NODE_ENV
uso de DefinePlugin por defecto. ¡No se necesita código adicional!webpack.prod.js (tomado de documentos)
Y en nuestro JS:
Webpack Docs: https://webpack.js.org/guides/production/#specify-the-mode
fuente
Utilizo un proceso de compilación manual que se ejecuta a través de Webpack, por lo que fue un proceso de dos pasos para mí:
Establezca la variable de entorno de package.json usando el paquete 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" }
Cambie el archivo webpack.config.js para usar la variable de entorno (que se pasa a React para determinar si estamos en modo de desarrollo o producción), y deshabilite la minimización del paquete producido si estamos en modo de desarrollo para que podamos ver el nombres reales de nuestros componentes. Necesitamos usar la propiedad de optimización de webpack en nuestro archivo webpack.config.js para esto:
optimization: { nodeEnv: process.env.NODE_ENV, minimize: process.env.NODE_ENV === 'production' }
paquete web v4.41.5, React v16.9.19, cross-env v7.0.0, nodo v10.16.14
fuente