Começou a usar o recurso de validação de prop do ReactJS , que, como dizem os documentos, funciona apenas no 'modo de desenvolvimento' por motivos de desempenho.
React parece validar as propriedades de um componente específico que anotei, mas não me lembro de ativar explicitamente o 'modo de desenvolvimento'.
Tentei pesquisar como ativar / alternar o modo de desenvolvimento, mas não tive sorte.
process.env
usuários do webpack: stackoverflow.com/questions/37311972/…Respostas:
A outra resposta pressupõe que você esteja usando arquivos externos pré-criados do react, e, embora correto, não é assim que a maioria das pessoas está indo ou deve consumir o React como um pacote. Além disso, neste ponto, quase todas as bibliotecas e pacotes do React também contam com a mesma convenção para alternar entre auxiliares de desenvolvimento durante a produção. O simples uso da reação minificada deixará todas essas otimizações em potencial também.
Por fim, a mágica se resume a React incorporando referências a
process.env.NODE_ENV
toda a base de código; estes agem como um recurso de alternância.O acima é o padrão mais comum e outras bibliotecas também o seguem. Portanto, para "desativar" essas verificações, precisamos alternar
NODE_ENV
para"production"
A maneira correta de desativar o "modo dev" é através do bundler de sua escolha.
webpack
Use o
DefinePlugin
na sua configuração webpack da seguinte maneira:Browserify
Use a transformação Envify e execute a etapa de construção do browserify com
NODE_ENV=production
("set NODE_ENV=production"
no Windows)Resultado
Isso produzirá pacotes configuráveis de saída que tiveram todas as instâncias
process.env.NODE_ENV
substituídas pela string literal:"production"
Bônus
Ao minificar o código transformado, você pode aproveitar a "Eliminação de Código Morto". DCE é quando o minificador é inteligente o suficiente para perceber que:
"production" !== "production"
é sempre falso e, portanto, remove apenas qualquer código no bloco if, economizando bytes.fonte
'"production"'
ie. aspas duplas, stringify faz isso para vocêJSON.stringify(process.env.NODE_ENV)
para que ele possa ser alternadoNODE_ENV=production webpack ...
na linha de comando. Bônus adicional de código explícito =)DefinePlugin
uso pode ser substituído pornew webpack.EnvironmentPlugin(['NODE_ENV'])
Sim, não está muito bem documentado, mas na página de download do ReactJS , ele fala sobre os modos de desenvolvimento e produção:
Basicamente, a versão não compactada do React é o modo "desenvolvimento" e a versão minificada do React é o modo "produção".
Para estar no modo "produção", inclua a versão reduzida
react-0.9.0.min.js
fonte
npm
diretamente a partir do pacote react, use algo como envify para definirNODE_ENV = 'production'
as mesmas verificações. @EdwardMSmith Deixe-me saber onde você gostaria de ver essas informações e eu posso adicioná-las (ou você pode simplesmente enviar um PR)!NODE_ENV
deve ser usada deve estar presente no topo.Eu postei isso em outro lugar, mas, francamente, aqui seria um lugar melhor.
Supondo que você instale o React 15.0.1 com npm
import react from 'react'
oureact = require('react')
execute,./mode_modules/react/lib/React.js
que é a fonte bruta do React.Os documentos do React sugerem que você use
./mode_modules/react/dist/react.js
para desenvolvimento ereact.min.js
produção.Se você reduzir
/lib/React.js
ou/dist/react.js
produzir, o React exibirá uma mensagem de aviso de que você reduziu o código de não produção: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 comportam de maneira semelhante. Redux exibe uma mensagem de aviso. Eu acredito que a reação também.
Portanto, você é claramente incentivado a usar a versão de produção de
/dist
.No entanto, se você reduzir as
/dist
versões, o UglifyJsPlugin do webpack irá reclamar.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
Você não pode evitar esta mensagem porque o UglifyJsPlugin pode excluir apenas blocos da Webpack, não arquivos individuais.
Eu mesmo uso as versões de desenvolvimento e produção
/dist
./dist/react.min.js
estão otimizados para produção. Não li nenhuma prova de que o'process.env': { NODE_ENV: JSON.stringify(IS_PRODUCTION ? 'production' : 'development') }
plus uglify faça um trabalho tão bom quanto '/ dist / react.min.js`. Não li nenhuma prova de que você obtenha o mesmo código resultante.Você pode fazer com que o webpack use as
/dist
versões com:fonte
Para a compilação baseada no webpack, eu costumava configurar o webpack.config.js separado para DEV e PROD. Para Prod, resolva o alias como abaixo
Você pode encontrar o que está trabalhando aqui
fonte
Se você estiver trabalhando com algo como este tutorial do ReactJS.NET / Webpack , não poderá usar o process.env para ativar / desativar o modo de desenvolvimento do React, tanto quanto eu sei. Este exemplo vincula diretamente o react.js (consulte Index.cshtml ), portanto, basta escolher .min.js ou a variante não minificada alterando o URL.
Não sei por que esse é o caso, porque o webpack.config.js da amostra tem um comentário que parece implicar
externals: { react: 'React' }
que o trabalho seria feito, mas depois prossegue e inclui reagir diretamente na página.fonte
Apenas para usuários do Webpack v4:
A especificação
mode: production
emode: development
na configuração do Webpack definirá oprocess.env.NODE_ENV
uso do DefinePlugin por padrão. Não é necessário código adicional!webpack.prod.js (extraído de documentos)
E no nosso JS:
Documentos do Webpack: https://webpack.js.org/guides/production/#specify-the-mode
fonte
Eu uso um processo de criação manual que é executado no Webpack, portanto foi um processo de duas etapas para mim:
Defina a variável de ambiente do package.json usando o pacote 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" }
Altere o arquivo webpack.config.js para usar a variável de ambiente (que é passada para o React para determinar se estamos no modo de desenvolvimento ou produção) e desative a minimização do pacote produzido se estiver no modo de desenvolvimento para que possamos ver o nomes reais de nossos componentes. Precisamos usar a propriedade de otimização do webpack em nosso arquivo webpack.config.js para isso:
optimization: { nodeEnv: process.env.NODE_ENV, minimize: process.env.NODE_ENV === 'production' }
webpack v4.41.5, React v16.9.19, env-v7.0.0, nó v10.16.14
fonte