检测生产与开发在运行时发生反应

pfh*_*yes 56 javascript reactjs

是否有可能在运行时检测当前版本的React是开发还是生产?我想做这样的事情:

if (React.isDevelopment) {
  // Development thing
} else {
  // Real thing
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*lsh 93

最好用你的构建工具模仿Node的做事方式 - webpack,browserify - 通过公开process.env.NODE_ENV.通常,您将它设置为prod中的"production"和dev中的"development"(或undefined).

所以你的代码变成:

if (!process.env.NODE_ENV || process.env.NODE_ENV === 'development') {
    // dev code
} else {
    // production code
}
Run Code Online (Sandbox Code Playgroud)

有关如何设置它,请参阅envify在webpack中传递依赖于环境的变量

  • 您需要使用像webpack这样的构建工具. (5认同)
  • 客户端上的“进程未定义”。 (3认同)
  • 添加到@Joseph238 的评论 - 使用 create-react-app 时,将为您定义`process.env.NODE_ENV`,您可以在应用程序的任何位置访问它。[详情请参阅 React 文档](https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables)。 (3认同)
  • 如果您使用create-react-app,则在开发模式下,“ process.env.NODE_ENV”将为“开发”。 (2认同)

Jam*_*mes 14

我使用了一个帮助文件(在 Typescript 中):

import process from "process";

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

export default function isDev(): boolean
{
    return development;
}
Run Code Online (Sandbox Code Playgroud)

然后在其他地方我像这样使用它:

import isDev from "./helpers/DevDetect";

if (isDev())
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 更懒的方法: `export const isDev = () => !process.env.NODE_ENV || process.env.NODE_ENV === '开发';` (5认同)

Fel*_*aro 7

import.meta.env应该就是你所需要的!

import.meta对象将上下文特定的元数据公开给 JavaScript 模块,更多信息请参见此处

在我看来,这与较新的 esmodules 导入/导出语法一致,因此是 JS(和 Typescript)中读取环境变量的最新标准。

但是,如果import.meta不可用,那么环境变量应该可以使用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,
}

Run Code Online (Sandbox Code Playgroud)

这意味着你应该能够做类似的事情

 import.meta.env.MODE;
 // or process.env.MODE;
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


Max*_*oll 5

我想从 index.html 访问它,并希望有一个不涉及弹出 webpack 或使用其他模块配置它的解决方案,我想出了这个。

来源是上面 David 的回答以及在 html 文件中使用环境变量的 create-react-app 文档

if ( ! '%NODE_ENV%' || '%NODE_ENV%' === 'development') {
  // dev code
} else {
  // production code    
}
Run Code Online (Sandbox Code Playgroud)