如何在反应 jsx 中有一个外部 JSON 配置文件

Posted

技术标签:

【中文标题】如何在反应 jsx 中有一个外部 JSON 配置文件【英文标题】:How to have a external JSON config file in react jsx 【发布时间】:2018-07-04 05:33:03 【问题描述】:

我想在基于 React 的项目中有一个外部配置文件 (JSON)。这是最终的结果,或者当我交付它(公共文件夹和 bundle.js)时,我的配置文件也应该给出。用户应该能够根据自己的意愿更改配置并使用我的应用程序。那是没有重新编译我的代码的人应该能够使用它。换句话说,配置文件不应该与我的应用程序捆绑在一起。

【问题讨论】:

你能举个例子吗?还有一个明确的问题? 您可能只想通过 AJAX 获取它。 我正在创建一个反应应用程序。我需要一些 url 来访问一些资源,这些应该存储在 JSON 格式的外部配置文件中。部署我的应用程序后,可以更改它们(网址)。所以用户应该能够改变它们。它不应该重新编译我的代码。 【参考方案1】:

这个问题有点模糊。我想我知道你在问什么。只要您打算使用 Webpack 或 Browserify,您就可以执行以下操作。它确实需要稍微不同的想法,而不是使用 JS 文件来掩盖它的纯 JSON 文件。

config.js:

let config = 
  option1: true,
  option2: false


module.exports = config;

然后从您的文件中使用配置,您可以执行类似于以下的操作。

app.js:

import React from 'react';
import ReactDOM from 'react-dom';
import config from './my/relative/config/path/config';
import MyOtherComponent from './components/my_component';

let component = (<MyOtherComponent config=config />);
ReactDOM.render(component, document.querySelector('mount'));

【讨论】:

因为您将 config.js 文件导入 app.js,所以配置文件不会保留在外部,而是会成为 bundle.js 的一部分?该问题明确要求“外部配置文件”。 @joedotnot 感谢您的回复。你是对的。下次我会尝试更仔细地阅读。【参考方案2】:

就像Joseph Fehrman 所说的,只考虑 JSON,使用 JS 对我有用。这就是我所做的。

我创建了一个名为 configurations.js 的 JS 文件,其中包含了我所需的配置

var configs = 
"aUrl": "https://localhost:9090/",
"bUrl": "https://localhost:9445/";

然后在index.html中我添加了它。

<body>
<div id='root'></div>
<script src="configurations.js"></script>
<script src="dist/bundle.js"></script></body>

然后在 webpack.config.js 我像这样将它添加到 externals 中。 (注意在configurations.js中,变量的名字是configs)。

externals: 
    config:  "configs", 

然后在我想要的任何地方,我都可以导入它并很好地使用它。这在我能够在部署后更改配置的情况下非常有效(即不必重新编译我的 bundle.js 保持不变的代码:-))。 下面给出了一个显示它是如何使用的示例。

import  Component  from 'react';
import axios from 'axios';
import Config from 'config';
/**
* @class GetProductAreas
* @extends Component
* @description Get ProductAreas
*/
class GetProductAreas extends Component 
    /**
    * @class GetProductAreas
    * @extends Component
    * @description get product areas
    */
    getproductAreas() 
        const url = Config.aUrl;
        return axios.get(url).then((response) => 
            return (response.data);
        ).catch((error) => 
            throw new Error(error);
        );
    


export default (new GetProductAreas());

【讨论】:

什么 webpack.config.js ?如果我们使用 create-react-app 则没有 webpack.config.js (或者它可能是隐藏的)。 cra案怎么办?【参考方案3】:

接受的答案可能有效。但是,为什么要搞得这么复杂呢?

步骤#1。 创建一个文件 Config.js,包含内容

var Configs = 
    prop1 = "abc",
    prop2 = "123"

步骤#2。通过脚本标签将文件加载到 index.html 中。

<div id='root'></div>
<script src="Config.js"></script>
<script src="dist/bundle.js"></script></body>

步骤#3。只需直接在任何 React 组件中访问设置。

class MyComponent extents Component 

    render() 
        //you can access it here if you want
        let myprop1 = window.Configs.prop1;

        return()
            <div>myprop2 is: window.Configs.prop2</div>       
        
    
 

步骤#4。利润?

不需要或不需要涉及 webpack、webpack-externals、webpack-config、import Config from 'config' 或任何其他 BS。

为什么有效?因为我们将 'Configs' 声明为 window 对象的一个​​ prop,并在全局范围内加载它。

【讨论】:

太棒了!我为这个问题看到的最简单的解决方案。未来观众的旁注:第 1 步中的var 很重要。 constlet 不起作用。 @m01010011 为什么会这样?我认为它在任何可以评估/执行 ES6 的地方都能正常工作。【参考方案4】:

上一个解决方案效果很好,以下是一些改进:

配置文件,在 /public 文件夹中:

config.js

var Configs = 
  var1: "value",
  var2: "value2"

在/public/index.html文件的头部添加脚本调用

<head>
....
<script src="config.js"></script>
....
</head>

最后,从代码中调用 var。效果很好!

import React from 'react'
.... 

const data = window.Configs.var1

有了这个解决方案,我可以拥有多个服务器而无需重新编译,而且很容易做到。

【讨论】:

你只是在 6 个月后重复我的回答? (看看我在 2019 年 3 月的回答)

以上是关于如何在反应 jsx 中有一个外部 JSON 配置文件的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 package.json 在 js 和 jsx 文件上运行 eslint

如何阅读反应语法

阻止异步提取在webpacked应用程序中完成

在反应中使用递归函数从平面数组创建 JSX 树

如何命名我的反应组件以容纳嵌套 JSON 中的元素?

在反应jsx中一次遍历一个数组