Como ativar / desativar o 'modo de desenvolvimento' do ReactJS?

120

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.

gdso
fonte
grande explicação sucinta dos process.envusuários do webpack: stackoverflow.com/questions/37311972/…
ptim

Respostas:

128

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_ENVtoda a base de código; estes agem como um recurso de alternância.

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

O acima é o padrão mais comum e outras bibliotecas também o seguem. Portanto, para "desativar" essas verificações, precisamos alternar NODE_ENVpara"production"

A maneira correta de desativar o "modo dev" é através do bundler de sua escolha.

webpack

Use o DefinePluginna sua configuração webpack da seguinte maneira:

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

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_ENVsubstituí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.

pânico monástico
fonte
1
Na documentação do
react
1
Você realmente precisa de JSON.stringify ('produção') lá? Ou apenas 'produção' é suficiente?
precisa saber é o seguinte
4
@VladNicula ele precisa ser '"production"'ie. aspas duplas, stringify faz isso para você
monástica-pânico
1
Você também pode usar JSON.stringify(process.env.NODE_ENV)para que ele possa ser alternado NODE_ENV=production webpack ...na linha de comando. Bônus adicional de código explícito =)
Henry Blyth
2
Acabei de descobrir que esse DefinePluginuso pode ser substituído pornew webpack.EnvironmentPlugin(['NODE_ENV'])
Henry Blyth
50

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:

Fornecemos duas versões do React: uma versão não compactada para desenvolvimento e uma versão reduzida para produção. A versão de desenvolvimento inclui avisos extras sobre erros comuns, enquanto a versão de produção inclui otimizações extras de desempenho e remove todas as mensagens de erro.

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

Edward M Smith
fonte
2
Se o seu bundler diminuir, acho que não removerá a depuração. Você precisa incluir a versão minificada do React em sua compilação de produção - a incluída na distribuição do React - na verdade, é um código diferente da versão não minificada, pelo que entendi.
Edward M Smith
17
Se você estiver construindo npmdiretamente a partir do pacote react, use algo como envify para definir NODE_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)!
Sophie Alpert
2
@ BenAlpert - eu diria uma página em Guias ou Dicas descrevendo a implantação da produção. Vou dar uma olhada e ver o que posso inventar. Na verdade, eu não fiz uma implantação de produção, por isso pode precisar de algumas revisões. Vou enviar um PR.
Edward M Smith
1
Eu só queria acrescentar que a versão addon não parece ter o modo de desenvolvimento ativado, mesmo a versão não minificada.
KallDrexx
8
Eu não acho que essa seja a melhor resposta, já que algumas pessoas reagem com o browserify e uma resposta que NODE_ENVdeve ser usada deve estar presente no topo.
Bjorn
16

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'ou react = require('react')execute, ./mode_modules/react/lib/React.jsque é a fonte bruta do React.

Os documentos do React sugerem que você use ./mode_modules/react/dist/react.jspara desenvolvimento e react.min.jsprodução.

Se você reduzir /lib/React.jsou /dist/react.jsproduzir, 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 /distversõ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.

  • O Webpack tem menos trabalho a fazer e termina um pouco antes. (YRMV)
  • Os documentos do React dizem que /dist/react.min.jsestã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.
  • Recebo 1 mensagem de aviso do uglify em vez de 3 do ecossistema react / redux.

Você pode fazer com que o webpack use as /distversões com:

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'))
    }
  }
JohnSz
fonte
1
Se estiver executando a partir do webpack cli: const IS_PRODUCTION = process.argv.indexOf ('- p')! == -1;
Greg
2
Esta não é a solução recomendada (fonte: eu trabalho no React). As soluções corretas estão documentadas aqui: reactjs.org/docs/… . Se eles não funcionarem, registre um problema no repositório do React e tentaremos ajudá-lo.
Dan Abramov
4

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

     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')
    }

Você pode encontrar o que está trabalhando aqui

Senthil
fonte
1
Esta não é a solução recomendada (fonte: eu trabalho no React). As soluções corretas estão documentadas aqui: reactjs.org/docs/… . Se eles não funcionarem, registre um problema no repositório do React e tentaremos ajudá-lo.
Dan Abramov
1

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.

Roman Starkov
fonte
Se eu entendi direito, você está dizendo que, se agrupar e minificar usando o ReactJS.Net, não beneficiará a minificação do arquivo de desenvolvimento react.js. Para isso, ao agrupar usando as verificações #IF DEBUG, é necessário alterar explicitamente a URL para o arquivo de produção do react.js fornecido na página de downloads do Facebook. Semelhante ao caso com react-dom e Redux. Estou certo?
Faisal Mq
@FaisalMushtaq Faz parte disso; dependendo de como você incluir o react.js, poderá ser necessário mudar explicitamente para a versão minificada. Mas o que eu realmente queria dizer é que é possível ter o React configurado de tal maneira que a maneira "oficial" de ativar o modo de desenvolvimento não funcione.
Roman Starkov 20/05
0

Apenas para usuários do Webpack v4:

A especificação mode: productione mode: developmentna configuração do Webpack definirá o process.env.NODE_ENVuso do DefinePlugin por padrão. Não é necessário código adicional!

webpack.prod.js (extraído de documentos)

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

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

E no nosso JS:

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

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

Joe
fonte
0

Eu uso um processo de criação manual que é executado no Webpack, portanto foi um processo de duas etapas para mim:

  1. 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" }

  2. 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

John Galt
fonte