Làm cách nào để bật / tắt 'chế độ phát triển' của ReactJS?


120

Đã bắt đầu sử dụng tính năng xác thực prop của ReactJS , như các tài liệu cho biết chỉ hoạt động ở 'chế độ phát triển' vì lý do hiệu suất.

React dường như đang xác thực các thuộc tính của một thành phần cụ thể mà tôi đã chú thích, nhưng tôi không nhớ đã bật 'chế độ phát triển' một cách rõ ràng.

Tôi đã thử tìm kiếm cách kích hoạt / chuyển đổi chế độ phát triển, nhưng không gặp may.


lời giải thích ngắn gọn tuyệt vời process.envdành cho người dùng webpack: stackoverflow.com/questions/37311972/…
ptim

Câu trả lời:


129

Câu trả lời khác giả sử bạn đang sử dụng các tệp được tạo sẵn bên ngoài từ react, và trong khi đúng thì đó không phải là cách mà hầu hết mọi người sẽ hoặc nên sử dụng React dưới dạng một gói. Hơn nữa, tại thời điểm này, hầu hết mọi thư viện và gói React cũng dựa trên cùng một quy ước để tắt các trình trợ giúp thời gian của nhà phát triển trong quá trình sản xuất. Chỉ cần sử dụng phản ứng được thu nhỏ cũng sẽ để lại tất cả những tối ưu hóa tiềm năng đó.

Cuối cùng, điều kỳ diệu đến với việc nhúng các tham chiếu đến React process.env.NODE_ENVtrong toàn bộ codebase; chúng hoạt động như một nút chuyển đổi tính năng.

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

Ở trên là mẫu phổ biến nhất và các thư viện khác cũng làm theo. Vì vậy, để "vô hiệu hóa" các kiểm tra này, chúng ta cần chuyển NODE_ENVsang"production"

Cách thích hợp để tắt "chế độ nhà phát triển" là thông qua gói bạn chọn.

webpack

Sử dụng DefinePlugintrong cấu hình gói web của bạn như sau:

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

Duyệt qua

Sử dụng biến đổi Envify và chạy bước xây dựng trình duyệt của bạn với NODE_ENV=production( "set NODE_ENV=production"trên Windows)

Kết quả

Điều này sẽ tạo ra các gói đầu ra có tất cả các trường hợp được process.env.NODE_ENVthay thế bằng chuỗi ký tự:"production"

Tặng kem

Khi giảm thiểu mã đã chuyển đổi, bạn có thể tận dụng "Loại bỏ mã chết". DCE là khi trình thu nhỏ đủ thông minh để nhận ra rằng: luôn"production" !== "production" là sai và vì vậy sẽ chỉ xóa bất kỳ mã nào trong khối if giúp bạn tiết kiệm byte.


1
Trên tài liệu phản ứng cũng giải thích facebook.github.io/react/docs/…
asotog

1
Bạn có thực sự cần JSON.stringify ('production') ở đó không? Hay chỉ 'sản xuất' là đủ?
Vlad Nicula

4
@VladNicula nó cần phải là '"production"'tức là. tăng gấp đôi trích dẫn, stringify nào đó cho bạn
tu-hoảng loạn

1
Bạn cũng có thể sử dụng JSON.stringify(process.env.NODE_ENV)để nó có thể được bật tắt NODE_ENV=production webpack ...trên dòng lệnh. Thêm vào tiền thưởng của mã rõ ràng =)
Henry Blyth

2
Chỉ cần phát hiện ra rằng đây DefinePluginsử dụng có thể được thay thế bằngnew webpack.EnvironmentPlugin(['NODE_ENV'])
Henry Blyth

50

Vâng, nó không thực sự được ghi chép đầy đủ, nhưng trên trang tải xuống ReactJS nó nói về các chế độ phát triển và sản xuất:

Chúng tôi cung cấp hai phiên bản React: một phiên bản không nén để phát triển và một phiên bản rút gọn để sản xuất. Phiên bản phát triển bao gồm các cảnh báo bổ sung về các lỗi thường gặp, trong khi phiên bản sản xuất bao gồm các tính năng tối ưu hóa hiệu suất bổ sung và loại bỏ tất cả các thông báo lỗi.

Về cơ bản, phiên bản chưa hợp nhất của React là chế độ "phát triển" và phiên bản thu nhỏ của React là chế độ "sản xuất".

Để ở chế độ "sản xuất", chỉ cần bao gồm phiên bản thu nhỏ react-0.9.0.min.js


2
Nếu gói của bạn thu nhỏ, tôi không nghĩ rằng nó sẽ xóa gỡ lỗi. Bạn cần đưa phiên bản React rút gọn vào bản dựng sản xuất của mình - bản được bao gồm trong bản phân phối React - nó thực sự là mã khác với phiên bản chưa được hợp nhất, theo những gì tôi hiểu.
Edward M Smith

17
Nếu bạn đang xây dựng npmtrực tiếp từ gói phản ứng, thì hãy sử dụng cái gì đó như envify để đặt NODE_ENV = 'production'để thực hiện các kiểm tra tương tự. @EdwardMSmith Hãy cho tôi biết bạn muốn xem thông tin đó ở đâu và tôi có thể thêm thông tin đó (hoặc bạn có thể gửi PR)!
Sophie Alpert

2
@BenAlpert - Tôi sẽ nói một trang trong Hướng dẫn hoặc Mẹo phác thảo việc triển khai sản xuất. Tôi sẽ xem xét và xem những gì tôi có thể đưa ra. Tôi chưa thực sự thực hiện triển khai sản xuất, vì vậy nó có thể cần một số bản sửa đổi. Tôi sẽ gửi một bài PR.
Edward M Smith

1
Tôi chỉ muốn nói thêm rằng phiên bản addon dường như không được bật chế độ phát triển, ngay cả phiên bản chưa được hoàn thiện.
KallDrexx

8
Tôi không nghĩ rằng đây là câu trả lời tốt nhất vì một số người xây dựng phản ứng của họ bằng Browserify và câu trả lời tận dụng NODE_ENVsẽ xuất hiện ở trên cùng.
Bjorn

16

Tôi đã đăng bài này ở nơi khác, nhưng thành thật mà nói, đây sẽ là một nơi tốt hơn.

Giả sử bạn cài đặt React 15.0.1 với npm import react from 'react'hoặc react = require('react')sẽ chạy ./mode_modules/react/lib/React.jsđó là nguồn thô của React.

Tài liệu React đề xuất bạn sử dụng ./mode_modules/react/dist/react.jsđể phát triển và react.min.jssản xuất.

Nếu bạn giảm thiểu /lib/React.jshoặc /dist/react.jscho sản xuất, React sẽ hiển thị một thông báo cảnh báo rằng bạn đã giảm thiểu mã phi sản xuất:

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 hoạt động tương tự. Redux hiển thị thông báo cảnh báo. Tôi tin rằng react-dom cũng vậy.

Vì vậy, bạn rõ ràng được khuyến khích sử dụng phiên bản sản xuất từ /dist.

Tuy nhiên, nếu bạn rút gọn các /distphiên bản, UglifyJsPlugin của webpack sẽ phàn nàn.

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

Bạn không thể tránh thông báo này vì UglifyJsPlugin chỉ có thể loại trừ các khối webpack chứ không phải các tệp riêng lẻ.

Tôi tự mình sử dụng cả /distphiên bản phát triển và sản xuất .

  • Webpack có ít việc phải làm hơn và kết thúc sớm hơn một chút. (YRMV)
  • Tài liệu React nói /dist/react.min.jslà được tối ưu hóa cho quá trình sản xuất. Tôi không đọc được bằng chứng nào cho thấy 'process.env': { NODE_ENV: JSON.stringify(IS_PRODUCTION ? 'production' : 'development') }cộng với uglify làm tốt công việc như '/ dist / react.min.js`. Tôi không đọc bằng chứng nào mà bạn nhận được cùng một mã kết quả.
  • Tôi nhận được 1 thông báo cảnh báo từ uglify thay vì 3 từ hệ sinh thái react / redux.

Bạn có thể yêu cầu webpack sử dụng các /distphiên bản với:

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
Nếu chạy từ webpack cli: const IS_PRODUCTION = process.argv.indexOf ('- p')! == -1;
Greg

2
Đây không phải là giải pháp được khuyến nghị (nguồn: Tôi làm việc trên React). Các giải pháp chính xác được ghi lại tại đây: reactjs.org/docs/… . Nếu chúng không phù hợp với bạn, hãy gửi sự cố trong React repo và chúng tôi sẽ cố gắng giúp bạn.
Dan Abramov

4

Đối với bản dựng dựa trên webpack, tôi đã từng thiết lập webpack.config.js riêng biệt cho DEV và PROD. Đối với sản phẩm, giải quyết bí danh như bên dưới

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

Bạn có thể tìm thấy một trong những hoạt động từ đây


1
Đây không phải là giải pháp được khuyến nghị (nguồn: Tôi làm việc trên React). Các giải pháp chính xác được ghi lại tại đây: reactjs.org/docs/… . Nếu chúng không phù hợp với bạn, hãy gửi sự cố trong React repo và chúng tôi sẽ cố gắng giúp bạn.
Dan Abramov

1

Nếu bạn đang làm việc từ một cái gì đó giống như hướng dẫn ReactJS.NET / Webpack này , bạn không thể sử dụng process.env để bật / tắt chế độ phát triển React theo như tôi có thể nói. Mẫu này liên kết trực tiếp đến react.js (xem Index.cshtml ), vì vậy bạn chỉ cần chọn .min.js hoặc biến thể không được rút gọn bằng cách thay đổi URL.

Tôi không chắc tại sao lại như vậy, bởi vì webpack.config.js của mẫu có một nhận xét dường như ngụ ý rằng externals: { react: 'React' }sẽ thực hiện công việc, nhưng sau đó tiếp tục và bao gồm phản ứng trực tiếp vào trang.


Nếu tôi đoán đúng, bạn đang nói rằng nếu bạn gói và rút gọn bằng ReactJS.Net, nó sẽ không có lợi cho việc thu nhỏ tệp phát triển react.js. Đối với điều đó trong khi gói sử dụng kiểm tra #IF DEBUG, người ta phải thay đổi rõ ràng URL thành tệp sản xuất của react.js được cung cấp từ trang tải xuống của Facebook. Tương tự trường hợp với react-dom và Redux. Tôi nói đúng chứ?
Faisal Mq

@FaisalMushtaq Đó là một phần của nó; tùy thuộc vào cách bạn bao gồm react.js, bạn có thể phải chuyển sang phiên bản rút gọn một cách rõ ràng. Nhưng điều tôi thực sự muốn nói là có thể React được thiết lập theo cách mà cách "chính thức" để bật chế độ phát triển sẽ không hoạt động.
Roman Starkov

0

Đối với chỉ người dùng v4 Webpack:

Chỉ định mode: productionmode: developmenttrong cấu hình Webpack của bạn sẽ xác định process.env.NODE_ENVbằng DefinePlugin theo mặc định. Không cần mã bổ sung!

webpack.prod.js (lấy từ tài liệu)

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

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

Và trong JS của chúng tôi:

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

Tài liệu Webpack: https://webpack.js.org/guides/production/#specify-the-mode


0

Tôi sử dụng quy trình xây dựng thủ công chạy qua Webpack, vì vậy đối với tôi đó là một quy trình gồm hai bước:

  1. Đặt biến môi trường từ package.json bằng cách sử dụng gói 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. Thay đổi tệp webpack.config.js để sử dụng biến môi trường (được chuyển cho React để xác định xem chúng ta đang ở chế độ phát triển hay sản xuất) và tắt tính năng thu nhỏ gói đã tạo nếu chúng ta đang ở chế độ phát triển để chúng ta có thể thấy tên thực của các thành phần của chúng tôi. Chúng ta cần phải sử dụng webpack của tối ưu hóa tài sản trong chúng tôi webpack.config.js tập tin này:

    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, nút v10.16.14

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.