2017-03-07 3 views
0

Ich arbeite an einer App, die React als Client mit einer Rails-API als Server verwendet. Ich möchte den Client und den Server so getrennt wie möglich halten (momentan befinden sie sich in völlig verschiedenen Repositories). mit create reagieren-AppWie stelle ich eine React-App und eine Rails-API für Heroku bereit?

wurde die Reaktion Client erstellt, und zur Zeit ruft an eine API, um die Proxy-Option in der package.json Datei, etwa so:

"proxy": "http://localhost:3001/" 

Lokaler Host 3001 ist der Standort meine Rails API. Natürlich wird das in der Produktion nicht funktionieren.

Wie kann ich dies auf Heroku bereitstellen, während der Client weiterhin Zugriff auf den Server hat? Kann ich zwei verschiedene Heroku-Apps bereitstellen und die App-Proxy-Anforderungen des Clients an die Server-App senden? Oder muss ich den Client in mein Rails-Projekt aufnehmen und alles zusammen bereitstellen?

Antwort

0

Ich habe das schon mal gemacht. Ich fing an, wie du es in deiner Frage vorgeschlagen hast, indem ich die react-App erstellte und sie in mein rails-Projekt einbaute und die ganze Sache einsetzte. Das funktioniert ganz gut, aber ich wollte meine Back-End-API nicht jedes Mal neu bereitstellen, wenn ich meine Front-End-App bereitstellen möchte.

Also habe ich ein Modell namens FrontEndAppVersion in meiner Schiene App gemacht. Ich habe dieses Modell zwei Spalten:

  1. Version - Eine semantische Version Zeichenfolge, die Sie normalerweise
  2. aktiv sehen - ein boolean Wert, der angibt, ob es die aktive Version war (nur ein Datensatz zu einem Zeitpunkt aktiv sein könnte)

Ich hatte dann eine minimale Schienenansicht Render, die für die aktive FrontEndAppVersion suchen würde und würde mit den entsprechenden js und CSS-Dateien verknüpfen.

In meiner Reaktions-App habe ich Schluck verwendet, um die App zu packen und sie zur Cloud-Front zu schieben, wo meine Rails-App verlinkt ist. Zusätzlich zum Senden der reaktiven Dateien an die Cloud-Front hatte ich eine API-Anfrage an meine Rails-Backend-App, um sie darüber zu informieren, dass eine neue Version verfügbar war und sie zur aktiven Version gemacht wurde.

Dies könnte Overkill sein, aber es hat mir auch erlaubt, eine Version mit Leichtigkeit wiederherzustellen. Anstatt Heroku zurückzurollen, konnte ich nur die clientseitige App zurücksetzen, indem ich eine andere FrontEndAppVersion Aufzeichnung der aktiven einstelle.

So oder so, der Proxy muss geändert werden, wenn Sie es erstellen, und wenn beide Apps auf der gleichen Domäne sind, können Sie einfach / verwenden.

0

Ich habe eine andere Herangehensweise als Jimmy in der gleichen Sache.

Ich habe zwei Apps auf Heroku bereitgestellt: eine Rails-API und ein Create-React-App-Frontend. Ohne zu spezifisch zu werden, gibt es ein paar Schlüssel, um dies einzurichten.Zuerst in Ihren Schienen api, die cors.rb-Datei bearbeiten, so dass es Cross-Origin-Anfragen erlaubt:

Rails.application.config.middleware.insert_before 0, Rack::Cors do 
    allow do 
    origins 'localhost:3000', 'https://myapp.herokuapp.com' 

    resource '*', 
    headers: :any, 
    methods: [:get, :post, :put, :delete], 
    end 
end 

Da diese Datei schon sagt, meine Rails-Anwendung läuft nicht auf localhost:3000 lokal, habe ich es auf Port 8000 laufen anstelle von puma.rb Bearbeitung:

port  ENV.fetch("PORT") { 8000 } 

Create-reagieren-App läuft auf localhost:3000 lokal standardmäßig, so dass Sie Ihre Schienen api laufen auf jedem beliebigen Port einstellen, die Sie wollen, solange es anders ist als Front-End .

Ich habe dann eine Datei in meinem erstellen reagieren-Anwendung, die die API-URL enthält und am häufigsten verwendeten Endpunkte, die ich AppConstants.js nennen:

// let APIRoot = "http://localhost:8000"; 
let APIRoot = "https://my-rails-api.herokuapp.com"; 

export default { 
    APIEndpoints: { 
    LOGIN: APIRoot + "https://stackoverflow.com/users/login", 
    SIGNUP: APIRoot + "https://stackoverflow.com/users/create", 
    TODOS: APIRoot + "/todos", 
    ITEMS: APIRoot + "/items", 
    }, 
}; 

Jetzt ist Ihre Sie bearbeiten Abruf-/Ajax/XMLHttpRequest Anrufe, so dass die Die verwendete URL verweist auf diese Routen. Zum Beispiel holt mit:

fetch(AppConstants.TODOS, { 
    method: 'POST', 
    body: JSON.stringify(values) 
}) 
.then(response => response.text()) 
.then((body) => { 
    console.log(body); 
}); 

Diese App Konstanten Datei macht es einfach, zwischen einer lokalen api Wurzel und einer Produktions api Wurzel zu wechseln.

Stellen Sie Ihre Rails api wie gewohnt auf heroku ein, ein passendes Build Pack wird automatisch erkannt. Für Ihre Reactive-App empfehle ich die Verwendung von this buildpack, um einen Produktions-Build Ihrer create-react-App zu erstellen und die statischen Assets für Sie bereitzustellen.

Verwandte Themen