ค้นหาเว็บไซต์

javascript - การตรวจจับ React เวอร์ชัน production กับ development ในขณะรันไทม์


สามารถตรวจสอบได้หรือไม่ว่ารุ่นปัจจุบันของ React เป็นรุ่นสำหรับการพัฒนาหรือรุ่นสำหรับการผลิตในขณะที่โปรแกรมกำลังทำงาน? ฉันอยากทำบางอย่างเช่นนี้:

if (React.isDevelopment) {
  // Development thing
} else {
  // Real thing
}

คำตอบ #1

สิ่งนี้ทำได้ดีที่สุดโดยการเลียนแบบวิธีการของ Node ในการทำสิ่งต่าง ๆ ด้วยเครื่องมือสร้างของคุณ - webpack, browserify - โดยการเปิดเผย process.env.NODE_ENV โดยทั่วไปคุณจะตั้งค่าเป็น "production" ในสภาพแวดล้อมการผลิต และ "development" (หรือไม่กำหนดค่า) ในสภาพแวดล้อมการพัฒนา

ดังนั้นโค้ดของคุณจะกลายเป็น:

if (!process.env.NODE_ENV || process.env.NODE_ENV === 'development') {
    // dev code
} else {
    // production code
}

สำหรับวิธีการตั้งค่า ดูที่ envify หรือ การส่งตัวแปรที่ขึ้นกับสภาพแวดล้อมใน webpack

คำตอบ #2

ฉันใช้ไฟล์ช่วยเหลือ (ใน Typescript):

import process from "process";

const development: boolean = !process.env.NODE_ENV || process.env.NODE_ENV === 'development';

export default function isDev(): boolean
{
    return development;
}

แล้วที่อื่นฉันใช้มันแบบนี้:

import isDev from "./helpers/DevDetect";

if (isDev())
{
    ...
}

คำตอบ #3

`import.meta.env` ก็น่าจะเพียงพอแล้ว!

วัตถุ import.meta เปิดเผยเมตาดาต้าที่เฉพาะเจาะจงตามบริบทแก่โมดูล JavaScript เพิ่มเติมที่นี่

ตามที่ฉันเห็น สิ่งนี้สอดคล้องกับไวยากรณ์การนำเข้า/ส่งออกแบบ esmodules ใหม่ และดังนั้นจึงเป็นมาตรฐานล่าสุดในการอ่านตัวแปรสภาพแวดล้อมใน JS (และ Typescript)

อย่างไรก็ตาม หาก import.meta ไม่สามารถใช้งานได้ ตัวแปร env ควรจะสามารถเข้าถึงได้ใน process.env (วิธีมาตรฐานดี ๆ แบบ commonJS เก่า)

console.log(import.meta.env) // ...or process.env

/* dev */
{
  "MODE": "development",
  "DEV": true,
  "PROD": false,

}
/* prod */
{
  "MODE": "production",
  "DEV": false,
  "PROD": true,
}

นี่หมายความว่าคุณควรจะสามารถทำสิ่งต่างๆ เช่น

 import.meta.env.MODE;
 // or process.env.MODE;

OBS: ค่าภายในวัตถุ env จะแตกต่างกันขึ้นอยู่กับเครื่องมือสร้างที่คุณใช้ในการรันแอปของคุณ

// create-react-app
{
  "NODE_ENV": "development",
  "PUBLIC_URL": "",
  "FAST_REFRESH": true
}

// vite-app
{
  "BASE_URL": "/",
  "MODE": "development",
  "DEV": true,
  "PROD": false,
  "SSR": false
}

// I haven't tested but I'm sure nextJS has it's own env setup

บทความที่เกี่ยวข้อง