วิธีจัดเก็บไฟล์ Configuration และอ่านโดยใช้ React


113

ฉันเป็นคนใหม่ใน react.js ฉันได้ใช้ส่วนประกอบหนึ่งที่ฉันกำลังดึงข้อมูลจากเซิร์ฟเวอร์และใช้มันเช่น

CallEnterprise:function(TenantId){


    fetchData('http://xxx.xxx.xx.xx:8090/Enterprises?TenantId='+TenantId+' &format=json').then(function(enterprises) 
    {
        EnterprisePerspectiveActions.getEnterprise(enterprises);
    }).catch(function()
    {
        alert("There was some issue in API Call please contact Admin");
        //ComponentAppDispatcher.handleViewAction({
        //    actionType: MetaItemConstants.RECEIVE_ERROR,
        //    error: 'There was a problem getting the enterprises'
        //});
    });
},

ฉันต้องการจัดเก็บ Url ในไฟล์คอนฟิกูเรชันดังนั้นเมื่อฉันปรับใช้สิ่งนี้บนเซิร์ฟเวอร์การทดสอบหรือในการผลิตฉันต้องเปลี่ยน url บนไฟล์ config ที่ไม่ใช่ในไฟล์ js แต่ฉันไม่รู้วิธีใช้ไฟล์คอนฟิกูเรชันใน react.js

ใครช่วยแนะนำฉันหน่อยได้ไหมว่าฉันจะบรรลุเป้าหมายนี้ได้อย่างไร


1
คุณใช้ webpack หรือเครื่องมือบางอย่างเพื่อรวบรวมโค้ด js หรือไม่?
Petr Bela

เป็นเรื่องปกติที่จะส่งค่านั้นตั้งค่าและอ่านจากตัวแปรสภาพแวดล้อมไปยังหน้าเว็บเป็นค่าส่วนกลางที่มีอยู่ใน JavaScript ของคุณ จากนั้นใช้เพื่อดึงข้อมูล
WiredPrairie

1
@PetrBela: ใช่ฉันใช้ webpack เพื่อสร้าง bundle.js แต่ฉันกำลังใช้ไฟล์คอนฟิกูเรชันเช่น web.config ใน. net
Dhaval Patel

คำตอบ:


132

ด้วย webpack คุณสามารถใส่การกำหนดค่าเฉพาะ env ลงในexternalsฟิลด์ได้webpack.config.js

externals: {
  'Config': JSON.stringify(process.env.NODE_ENV === 'production' ? {
    serverUrl: "https://myserver.com"
  } : {
    serverUrl: "http://localhost:8090"
  })
}

หากคุณต้องการจัดเก็บการกำหนดค่าในไฟล์ JSON แยกต่างหากก็เป็นไปได้เช่นกันคุณสามารถกำหนดให้ไฟล์นั้นและกำหนดให้กับConfig:

externals: {
  'Config': JSON.stringify(process.env.NODE_ENV === 'production' ? require('./config.prod.json') : require('./config.dev.json'))
}

จากนั้นในโมดูลของคุณคุณสามารถใช้ config:

var Config = require('Config')
fetchData(Config.serverUrl + '/Enterprises/...')

สำหรับการตอบสนอง:

import Config from 'Config';
axios.get(this.app_url, {
        'headers': Config.headers
        }).then(...);

ไม่แน่ใจว่าครอบคลุมกรณีการใช้งานของคุณหรือไม่ แต่มันก็ใช้ได้ดีสำหรับเรา


2
ยินดีต้อนรับ BTW เราได้เรียนรู้แล้วว่าการใช้ JSON เพื่อหลีกเลี่ยงข้อผิดพลาดทางไวยากรณ์จะดีกว่า ฉันได้อัปเดตรหัสตามนั้น
Petr Bela

2
ฉันไม่รู้ว่าต้องแยกวิเคราะห์ไฟล์ JSON เนื่องจากexternalsคาดว่าโค้ดจะได้รับการประเมินคุณจึงต้องสตริง JSON
Petr Bela

21
สิ่งนี้ไม่ได้ผลสำหรับฉันฉันได้รับข้อผิดพลาดนี้: [ข้อผิดพลาด: ไม่พบโมดูล 'Config'] เมื่อใช้ต้องใช้ ('Config')
amgohan

4
จะเกิดอะไรขึ้นถ้าฉันต้องการให้ webpack ไม่รวมไฟล์ config แยกไว้ใน output.bundle.js? ถ้าจะแยกออกจากบันเดิลฉันยังต้องการ ('Config') ได้ไหม ขอบคุณ
Barny

3
คุณทำสิ่งนี้ได้อย่างไร? ฉันทำตามที่แนะนำทุกประการและฉันได้รับ 'ไม่พบโมดูล' Config 'เหมือนกับ @amgohan
ceebreenk

78

หากคุณใช้ Create React App คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมโดยใช้ไฟล์. env เอกสารอยู่ที่นี่:

https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables

โดยทั่วไปทำสิ่งนี้ในไฟล์. env ที่รูทโปรเจ็กต์

REACT_APP_NOT_SECRET_CODE=abcdef

คุณสามารถเข้าถึงได้จากส่วนประกอบของคุณด้วยไฟล์

process.env.REACT_APP_NOT_SECRET_CODE

28
เพียงจำชื่อตัวแปรของคุณต้องขึ้นต้นด้วยREACT_APP_
Tomasz Madeyski

ฉันมีแอป ASP.NET Core ที่สร้างด้วยเทมเพลต React และทั้งหมดที่ฉันทำคือเพิ่มไฟล์ว่างในโฟลเดอร์ 'ClientApp' แล้วใส่REACT_APP_MYSETTING=valueเข้าไปจากนั้นอ้างถึงprocess.env.REACT_APP_MYSETTINGในรหัส JSX ของฉันและมันก็ใช้งานได้ ขอบคุณ!
นีโอ

.env ใช้ไม่ได้กับฉันเลยในโครงการ create-react-app
user8620575

3
คุณจะต้องรีสตาร์ทโครงการของคุณใน npm เมื่อคุณเพิ่ม. env ลงในไดเรกทอรีรากของคุณแล้ว
foyss

นี่ดูเหมือนเป็นการต่อต้านรูปแบบ จุดสิ้นสุดของ API ไม่ใช่ความลับที่ควรกำหนดไว้ในตัวแปรสภาพแวดล้อม เป็นส่วนหนึ่งของคำจำกัดความของแอป
Rob

2

คุณสามารถใช้แพ็คเกจ dotenv ได้ไม่ว่าคุณจะใช้การตั้งค่าใดก็ตาม ช่วยให้คุณสามารถสร้าง. env ในรูทโปรเจ็กต์ของคุณและระบุคีย์ของคุณเช่นนั้น

REACT_APP_SERVER_PORT=8000

ในไฟล์รายการแอปพลิเคชันของคุณคุณเพียงแค่เรียก dotenv (); ก่อนที่จะเข้าถึงคีย์เช่นนั้น

process.env.REACT_APP_SERVER_PORT

1
แม้ว่าฉันคิดว่าคุณต้องระบุคีย์ของคุณโดยเริ่มจากREACT_APP_
HenryM

1

ในกรณีที่คุณมีไฟล์ .properties หรือไฟล์. ini

จริงๆแล้วในกรณีที่คุณมีไฟล์ใด ๆ ที่มีคู่ค่าคีย์เช่นนี้:

someKey=someValue
someOtherKey=someOtherValue

คุณสามารถนำเข้าใน webpack โดยโมดูล npm ที่เรียกว่าproperties-reader

ฉันพบว่าสิ่งนี้มีประโยชน์มากเนื่องจากฉันกำลังรวม react กับ Java Spring framework ซึ่งมีไฟล์ application.properties อยู่แล้ว สิ่งนี้ช่วยให้ฉันเก็บ config ทั้งหมดไว้ด้วยกันในที่เดียว

  1. นำเข้าจากส่วนการอ้างอิงใน package.json

"properties-reader": "0.0.16"

  1. นำเข้าโมดูลนี้ไปยัง webpack.config.js ด้านบน

const PropertiesReader = require('properties-reader');

  1. อ่านไฟล์คุณสมบัติ

const appProperties = PropertiesReader('Path/to/your/properties.file')._properties;

  1. นำเข้าค่าคงที่นี้เป็น config

externals: { 'Config': JSON.stringify(appProperties) }

  1. ใช้เป็นวิธีเดียวกับที่กล่าวไว้ในคำตอบที่ยอมรับ

var Config = require('Config') fetchData(Config.serverUrl + '/Enterprises/...')


3
ขั้นตอนที่ 2 ของคุณเกี่ยวกับ webpack.config.js หากมีคนใช้ create-react-app จะไม่มีการกำหนดค่า webpack (หรือถูกซ่อนไว้) จะดำเนินการอย่างไรในกรณีนั้น?
joedotnot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.