ReactJS '개발 모드'를 켜고 끄는 방법은 무엇입니까?


120

문서에서 성능상의 이유로 '개발 모드'에서만 작동 하는 ReactJS의 prop 유효성 검사 기능을 사용하여 시작 되었습니다.

React는 내가 주석을 달 았던 특정 구성 요소의 속성을 검증하는 것 같지만 명시 적으로 '개발 모드'를 켰던 기억이 없습니다.

개발 모드를 트리거 / 토글하는 방법을 검색했지만 운이 없었습니다.


의 큰 간결한 설명 process.env웹팩 사용자 : stackoverflow.com/questions/37311972/...
ptim

답변:


129

다른 대답은 React 에서 외부 미리 빌드 된 파일을 사용하고 있다고 가정하고 대부분의 사람들이 React를 패키지로 사용 하거나 소비 해야하는 방식은 맞지 않습니다 . 또한이 시점에서 대부분의 React 라이브러리와 패키지 동일한 규칙에 따라 프로덕션 중에 개발 시간 도우미를 해제합니다. 축소 된 반응을 사용하는 것만으로도 모든 잠재적 최적화가 테이블에 남게됩니다.

궁극적으로 마법은 process.env.NODE_ENV코드베이스 전체에 대한 참조를 포함하는 React로 귀결 됩니다. 이것은 기능 토글처럼 작동합니다.

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

위의 패턴이 가장 일반적인 패턴이며 다른 라이브러리도이 패턴을 따릅니다. 따라서 이러한 검사를 "비활성화"하려면 다음으로 전환 NODE_ENV해야합니다."production"

"개발 모드"를 비활성화하는 올바른 방법은 선택한 번 들러를 사용하는 것입니다.

웹팩

다음 DefinePlugin과 같이 webpack 구성에서 사용하십시오 .

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

Browserify

Envify 변환을 사용하고 NODE_ENV=production( "set NODE_ENV=production"Windows에서)로 browserify 빌드 단계를 실행하십시오.

결과

그러면 모든 인스턴스가 process.env.NODE_ENV문자열 리터럴로 대체 된 출력 번들이 생성됩니다 ."production"

보너스

변환 된 코드를 축소 할 때 "데드 코드 제거"를 활용할 수 있습니다. 다음 minifier 그 실현을 스마트 충분이 때 DCE는 "production" !== "production"것입니다 항상 거짓 그래서 당신이 바이트를 절약하는 경우 블록의 코드를 제거합니다.



1
정말 거기에 JSON.stringify ( 'production')이 필요합니까? 아니면 '생산'만으로 충분할까요?
Vlad Nicula

4
@VladNicula 그것은 '"production"'즉 필요합니다 . 인용 더블, 캐릭터 라인 화는 않는 당신을 위해
수도원 - 당황

1
명령 줄을 JSON.stringify(process.env.NODE_ENV)통해 토글 할 수 있도록 사용할 수도 있습니다 NODE_ENV=production webpack .... 명시 적 코드의 추가 보너스 =)
헨리 블라이스

2
단지이 사실을 발견 DefinePlugin사용을 교체 할 수 있습니다new webpack.EnvironmentPlugin(['NODE_ENV'])
헨리 블라이스

50

예, 문서화가 잘되어 있지는 않지만 ReactJS 다운로드 페이지에서 개발 및 생산 모드에 대해 이야기합니다.

우리는 React의 두 가지 버전을 제공합니다 : 개발을위한 압축되지 않은 버전과 생산을위한 축소 된 버전. 개발 버전에는 일반적인 실수에 대한 추가 경고가 포함되어있는 반면 프로덕션 버전에는 추가 성능 최적화가 포함되고 모든 오류 메시지가 제거됩니다.

기본적으로 React의 축소되지 않은 버전은 "개발"모드이고 React의 축소 된 버전은 "생산"모드입니다.

"프로덕션"모드에 있으려면 축소 된 버전 만 포함하십시오. react-0.9.0.min.js


2
경우 당신 들러 축소하고, 나는 그것을 디버깅을 제거합니다 생각하지 않습니다. React 배포판에 포함 된 프로덕션 빌드에 React의 축소 된 버전을 포함해야합니다. 실제로 제가 이해하는 것과는 축소되지 않은 버전과 다른 코드입니다.
Edward M Smith

17
npm반응 패키지에서 직접 빌드하는 경우 envify와 같은 soemthing을 사용 NODE_ENV = 'production'하여 동일한 검사를 수행 하도록 설정 하십시오. @EdwardMSmith 해당 정보를보고 싶었던 곳을 알려 주시면 추가 할 수 있습니다 (또는 PR을 제출할 수도 있습니다)!
Sophie Alpert

2
@BenAlpert-프로덕션 배포를 설명하는 가이드 또는 팁 아래에 페이지를 말합니다. 제가 무엇을 생각 해낼 수 있는지 살펴 보겠습니다. 실제로 프로덕션 배포를 수행 하지 않았 으므로 수정이 필요할 수 있습니다. PR을 제출하겠습니다.
Edward M Smith

1
나는 단지 이것을 추가하고 싶었습니다. 애드온 버전은 개발 모드가 켜져 있지 않은 것 같습니다.
KallDrexx

8
일부 사람들은 browserify로 반응을 만들고 사용하는 답변 NODE_ENV이 상단 에 있어야하기 때문에 이것이 최선의 답변이라고 생각하지 않습니다 .
Bjorn

16

나는 이것을 다른 곳에 게시했지만 솔직히 여기가 더 좋은 곳이 될 것입니다.

npm과 함께 React 15.0.1을 설치 import react from 'react'하거나 React의 원시 소스를 react = require('react')실행할 것이라고 가정합니다 ./mode_modules/react/lib/React.js.

React 문서는 ./mode_modules/react/dist/react.js개발 및 react.min.js프로덕션에 사용하도록 제안합니다 .

축소 /lib/React.js하거나/dist/react.js 이 아닌 생산 코드를 축소 된 적이 있다는 경고 메시지가 표시됩니다 반작용, 생산을 위해 :

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는 비슷하게 동작합니다. Redux는 경고 메시지를 표시합니다. 나는 react-dom도 그렇다고 믿는다.

따라서 프로덕션 버전을 사용하는 것이 좋습니다. /dist .

그러나 /dist버전을 축소하면 webpack의 UglifyJsPlugin이 불평합니다.

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

UglifyJsPlugin은 개별 파일이 아닌 웹팩 청크 만 제외 할 수 있으므로이 메시지를 피할 수 없습니다.

저는 개발 및 프로덕션 /dist버전을 모두 사용합니다 .

  • Webpack은 할 일이 적고 더 빨리 완료됩니다. (YRMV)
  • React 문서 /dist/react.min.js는 프로덕션에 최적화되어 있다고 말합니다 . 'process.env': { NODE_ENV: JSON.stringify(IS_PRODUCTION ? 'production' : 'development') }plus uglify가 '/dist/react.min.js'만큼 좋은 일을 한다는 증거를 읽지 못했습니다. 나는 당신이 동일한 결과 코드를 얻는 증거를 읽지 못했습니다.
  • react / redux 생태계에서 3 개가 아닌 uglify에서 1 개의 경고 메시지를받습니다.

webpack에서 다음 /dist버전을 사용할 수 있습니다 .

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

1
웹팩 cli에서 실행하는 경우 : const IS_PRODUCTION = process.argv.indexOf ( '-p')! == -1;
Greg

2
이것은 권장되는 솔루션이 아닙니다 (출처 : I work on React). 올바른 솔루션은 여기에 설명되어 있습니다 : reactjs.org/docs/… . 그들이 당신을 위해 작동하지 않는 경우 React repo에 문제를 제출하면 도움을 드릴 것입니다.
Dan Abramov

4

webpack 기반 빌드의 경우 DEV 및 PROD에 대해 별도의 webpack.config.js를 설정했습니다. Prod의 경우 아래와 같이 별칭을 해결하십시오.

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

여기 에서 작동하는 것을 찾을 수 있습니다.


1
이것은 권장되는 솔루션이 아닙니다 (출처 : I work on React). 올바른 솔루션은 여기에 설명되어 있습니다 : reactjs.org/docs/… . 그들이 당신을 위해 작동하지 않는 경우 React repo에 문제를 제출하면 도움을 드릴 것입니다.
Dan Abramov

1

ReactJS.NET / Webpack tutorial 과 같은 작업을하고 있다면 process.env를 사용하여 내가 알 수있는 한 React 개발 모드를 켜고 끌 수 없습니다. 이 샘플은 react.js에 직접 연결되므로 ( Index.cshtml 참조 ) URL을 변경하여 .min.js 또는 축소되지 않은 변형을 선택 하기 만하면됩니다 .

샘플의 webpack.config.js externals: { react: 'React' }에 작업을 수행 할 것임을 암시하는 주석이 있지만 계속 진행하여 페이지에 직접 반응을 포함 하기 때문에 그 이유를 잘 모르겠습니다 .


내가 옳다고 생각했다면 ReactJS.Net을 사용하여 번들링하고 축소하면 react.js 개발 파일 축소에 도움이되지 않는다고 말씀하시는 것입니다. 이를 위해 #IF DEBUG 검사를 사용하여 번들링하는 동안 Facebook 다운로드 페이지에서 제공하는 react.js의 프로덕션 파일로 URL을 명시 적으로 변경해야합니다. react-dom 및 Redux의 경우와 유사합니다. 내가 맞아?
Faisal Mq

@FaisalMushtaq 그것의 일부입니다; react.js를 포함하는 방법에 따라 최소화 된 버전으로 명시 적으로 전환해야 할 수 있습니다. 하지만 제가 정말로 말하고 싶었던 것은 개발 모드를 켜는 "공식적인"방식이 작동하지 않는 방식으로 React를 설정할 수 있다는 것입니다.
Roman Starkov

0

의 경우 에만 웹팩 V4 사용자 :

지정 mode: productionmode: development귀하의 웹팩 설정에서하는 것은 정의합니다 process.env.NODE_ENV기본적으로 DefinePlugin를 사용하여. 추가 코드가 필요하지 않습니다!

webpack.prod.js (문서에서 가져옴)

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

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

그리고 JS에서 :

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

Webpack 문서 : https://webpack.js.org/guides/production/#specify-the-mode


0

Webpack을 통해 실행되는 수동 빌드 프로세스를 사용하므로 2 단계 프로세스였습니다.

  1. cross-env 패키지를 사용하여 package.json에서 환경 변수를 설정합니다.

    "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. webpack.config.js 파일을 변경하여 환경 변수 (개발 모드인지 프로덕션 모드인지 확인하기 위해 React로 전달됨)를 사용하고 개발 모드에있는 경우 생성 된 번들 최소화를 비활성화하여 구성 요소의 실제 이름. 이를 위해 webpack.config.js 파일 에서 webpack의 최적화 속성 을 사용해야 합니다.

    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, 노드 v10.16.14

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.