如何在 React Webpack 应用程序中为不同环境参数化变量?
How to parameterize variables in a React Webpack app for different environments?
我正在开发由 create-react-app
创建的 React 网络应用程序,我正准备部署它。
问题是,对于开发,应用程序在我的开发环境 (localhost:{api-port}) 上使用 api 实例 运行 但对于已部署的应用程序,这个应指向服务器 api 实例 (api.myapp.com).
目前主机只是我的网络组件中的一个变量:
const hostname = 'localhost:9876'
我计划使用 webpack 生成将由生产前端提供的静态文件,我想继续使用 create-react-app
设置的 npm start
进行开发。
设置我的项目的正确方法是什么,以便可以根据我是 运行 开发服务器还是生产环境自动将主机设置为正确的值?
您可以通过多种方式实现这一目标。其中一种解决方案是使用 webpacks 的 DefinePlugin
。在 webpack 配置的插件部分,你可以添加如下内容:
new webpack.DefinePlugin({
API_HOST: process.env.NODE_ENV === 'production'
? JSON.stringify('localhost:8080')
: JSON.stringify('api.com')
}),
这会创建一个全局变量 API_HOST
,在您的代码库中随处可用,您可以使用它。您可以在此处 https://webpack.js.org/plugins/define-plugin/
阅读有关 DefinePlugin
的更多信息
一个常见的解决方案是像这样检查 process.env.NODE_ENV
:
const hostname = process.env.NODE_ENV === "development" ? "localhost:9876" : "localhost:6789";
您可能需要使用 DefinePlugin
强制环境变量出现在您的 Webpack 配置文件中,如下所示:
plugins: [
new webpack.DefinePlugin({
"process.env": {
NODE_ENV:JSON.stringify(process.env.NODE_ENV || "development")
}
})
]
另一种解决方案可能是使用 config 包并提供您的主机名字符串作为配置参数。 config 将根据当前 NODE_ENV 从文件继承配置。它将首先使用 default.json 文件中的配置,然后使用 development.json 或 production.json 覆盖它,具体取决于您的环境。
请注意,您需要使用 CopyWebpackPlugin 将配置文件复制到输出目录才能正常工作。
当您向 api 服务器发出任何请求时,您可以使用相对路径,而不是为您的应用程序调用完整的 url。
为了您的开发,您可以将代理 属性 添加到您的 package.json 文件:
{
...
"proxy": {
"/api/*": {
"target" :"http://localhost:9876"
}
}
}
所以无论何时你发出任何前缀为 /api
的请求都将被重定向到 http://localhost:9876/api
这只是在开发中,但如果你发出前缀为 /api
的请求则在生产中它不会被重定向,它会正常服务,因为代理只在 create-react-app
.
附带的开发服务器中可用
我正在开发由 create-react-app
创建的 React 网络应用程序,我正准备部署它。
问题是,对于开发,应用程序在我的开发环境 (localhost:{api-port}) 上使用 api 实例 运行 但对于已部署的应用程序,这个应指向服务器 api 实例 (api.myapp.com).
目前主机只是我的网络组件中的一个变量:
const hostname = 'localhost:9876'
我计划使用 webpack 生成将由生产前端提供的静态文件,我想继续使用 create-react-app
设置的 npm start
进行开发。
设置我的项目的正确方法是什么,以便可以根据我是 运行 开发服务器还是生产环境自动将主机设置为正确的值?
您可以通过多种方式实现这一目标。其中一种解决方案是使用 webpacks 的 DefinePlugin
。在 webpack 配置的插件部分,你可以添加如下内容:
new webpack.DefinePlugin({
API_HOST: process.env.NODE_ENV === 'production'
? JSON.stringify('localhost:8080')
: JSON.stringify('api.com')
}),
这会创建一个全局变量 API_HOST
,在您的代码库中随处可用,您可以使用它。您可以在此处 https://webpack.js.org/plugins/define-plugin/
DefinePlugin
的更多信息
一个常见的解决方案是像这样检查 process.env.NODE_ENV
:
const hostname = process.env.NODE_ENV === "development" ? "localhost:9876" : "localhost:6789";
您可能需要使用 DefinePlugin
强制环境变量出现在您的 Webpack 配置文件中,如下所示:
plugins: [
new webpack.DefinePlugin({
"process.env": {
NODE_ENV:JSON.stringify(process.env.NODE_ENV || "development")
}
})
]
另一种解决方案可能是使用 config 包并提供您的主机名字符串作为配置参数。 config 将根据当前 NODE_ENV 从文件继承配置。它将首先使用 default.json 文件中的配置,然后使用 development.json 或 production.json 覆盖它,具体取决于您的环境。
请注意,您需要使用 CopyWebpackPlugin 将配置文件复制到输出目录才能正常工作。
当您向 api 服务器发出任何请求时,您可以使用相对路径,而不是为您的应用程序调用完整的 url。
为了您的开发,您可以将代理 属性 添加到您的 package.json 文件:
{
...
"proxy": {
"/api/*": {
"target" :"http://localhost:9876"
}
}
}
所以无论何时你发出任何前缀为 /api
的请求都将被重定向到 http://localhost:9876/api
这只是在开发中,但如果你发出前缀为 /api
的请求则在生产中它不会被重定向,它会正常服务,因为代理只在 create-react-app
.