J'utilise react-native pour créer une application multiplateforme, mais je ne sais pas comment définir la variable d'environnement pour pouvoir avoir différentes constantes pour différents environnements.
Exemple:
development:
BASE_URL: '',
API_KEY: '',
staging:
BASE_URL: '',
API_KEY: '',
production:
BASE_URL: '',
API_KEY: '',
react-native
Damon Yuan
la source
la source
import {Platform} from 'react-native';
console.log(Platform);
Réponses:
Au lieu de coder en dur les constantes de votre application et d'activer l'environnement (j'expliquerai comment le faire dans un instant), je suggère d'utiliser la suggestion à douze facteurs de définir votre processus de construction
BASE_URL
et le vôtreAPI_KEY
.Pour savoir comment exposer votre environnement
react-native
, je suggère d'utiliser babel-plugin-transform-inline-environment-variables de Babel .Pour que cela fonctionne, vous devez télécharger le plugin, puis vous devrez configurer un
.babelrc
et cela devrait ressembler à ceci:Et donc, si vous transpilez votre code natif de réaction en exécutant
API_KEY=my-app-id react-native bundle
(ou start, run-ios ou run-android), tout ce que vous avez à faire est de faire ressembler votre code à ceci:Et puis Babel remplacera cela par:
J'espère que cela t'aides!
la source
process.env
estNODE_ENV
.process.env.API_KEY
... utilisez à laprocess.env['API_KEY']
placereact-native start --reset-cache
chaque fois que vous modifiez les variables d'environnement.La solution la plus simple (ni la meilleure ni l' idéale ) que j'ai trouvée était d'utiliser react-native-dotenv . Vous ajoutez simplement le préréglage "react-native-dotenv" à votre
.babelrc
fichier à la racine du projet comme ceci:Créez un
.env
fichier et ajoutez des propriétés:Puis dans votre projet (JS):
la source
base_url
pour les deuxstaging
etproduction
?.env
fichiers (par environnement) ou de réutiliser certaines de vos valeurs dans différents.env
fichiers, afin de ne pas les dupliquer, par exemple, entre la mise en scène et la production?.env
fichiers par environnement, disonsstaging
etproduction
.À mon avis, la meilleure option est d'utiliser react-native-config . Il prend en charge 12 facteurs .
J'ai trouvé ce package extrêmement utile. Vous pouvez définir plusieurs environnements, par exemple le développement, la mise en scène, la production.
Dans le cas d'Android, les variables sont également disponibles dans les classes Java, gradle, AndroidManifest.xml etc. Dans le cas d'iOS, les variables sont également disponibles dans les classes Obj-C, Info.plist.
Vous créez simplement des fichiers comme
.env.development
.env.staging
.env.production
Vous remplissez ces fichiers avec des clés, des valeurs telles que
puis utilisez-le simplement:
Si vous souhaitez utiliser différents environnements, vous définissez essentiellement la variable ENVFILE comme ceci:
ou pour assembler l'application pour la production (android dans mon cas):
la source
React native n'a pas le concept de variables globales. Il applique strictement la portée modulaire , afin de promouvoir la modularité et la réutilisabilité des composants.
Parfois, cependant, vous avez besoin que les composants soient conscients de leur environnement. Dans ce cas, il est très simple de définir un
Environment
module que les composants peuvent ensuite appeler pour obtenir des variables d'environnement, par exemple:environment.js
mon-composant.js
Cela crée un environnement singleton auquel vous pouvez accéder de n'importe où dans la portée de votre application. Vous devez explicitement
require(...)
le module de tous les composants qui utilisent des variables d'environnement, mais c'est une bonne chose.la source
getPlatform()
. J'ai créé un fichier comme celui-ci mais je ne peux pas terminer la logique ici dans React Nativestaging
ouproduction
même parce que cela dépend de votre environnement. Par exemple, si vous voulez différentes saveurs pour IOS vs Android, vous pouvez initialiser l' environnement en importer vosindex.ios.js
et desindex.android.js
fichiers et établir la plate - forme là - bas, par exempleEnvironment.initialize('android')
.env.js
fichier, assurez-vous de l'ignorer lors de l'archivage dans le référentiel et copiez les clés utilisées, avec des valeurs de chaîne vides, dans un autreenv.js.example
fichier que vous archivez afin que les autres puissent créer votre application plus facilement. Si vous archivez accidentellement des secrets de projet, envisagez de réécrire l'historique pour les supprimer non seulement de la source, mais aussi de son historique.J'ai utilisé le
__DEV__
polyfill intégré à react-native pour résoudre ce problème. Il est automatiquement défini surtrue
tant que vous ne créez pas de réaction native pour la production.Par exemple:
Alors juste
import {url} from '../vars'
et vous obtiendrez toujours le bon. Malheureusement, cela ne fonctionnera pas si vous voulez plus de deux environnements, mais c'est facile et n'implique pas l'ajout de dépendances supplémentaires à votre projet.la source
La méthode spécifique utilisée pour définir les variables d'environnement varie selon le service CI, l'approche de construction, la plate-forme et les outils que vous utilisez.
Si vous utilisez Buddybuild for CI pour créer une application et gérer des variables d'environnement , et que vous avez besoin d'accéder à la configuration à partir de JS, créez un
env.js.example
avec des clés (avec des valeurs de chaîne vides) pour l'enregistrement dans le contrôle de code source, et utilisez Buddybuild pour produire unenv.js
fichier au moment de la construction dans l'post-clone
étape, en masquant le contenu du fichier dans les journaux de construction, comme ceci:Astuce: Ne pas oublier d'ajouter
env.js
à.gitignore
si config et les secrets ne sont pas vérifiées dans le contrôle source accidentellement au cours du développement.Vous pouvez ensuite gérer la façon dont le fichier est écrit en utilisant les variables Buddybuild comme
BUDDYBUILD_VARIANTS
, par exemple, pour obtenir un meilleur contrôle sur la façon dont votre configuration est produite au moment de la construction.la source
env.js.example
pièce? disons que je veux lancer l'application dans mon environnement local. si monenv.js
fichier est dans gitignore etenv.js.example
est utilisé comme un aperçu, leenv.js.example
n'est pas une extension JS légitime, donc je suis juste un peu confus sur ce que vous entendez par cette partieenv.js.example
fichier se trouve dans la base de code en tant que document de référence, une source canonique de vérité sur les clés de configuration que l'application souhaite utiliser. Il décrit à la fois les clés nécessaires pour exécuter l'application, ainsi que le nom de fichier attendu une fois copié et renommé. Le modèle est courant dans les applications Ruby utilisant la gemme dotenv , d'où j'ai tiré le modèle.Je pense que quelque chose comme la bibliothèque suivante pourrait vous aider à résoudre le morceau manquant du puzzle, la fonction getPlatform ().
https://github.com/joeferraro/react-native-env
Le seul problème que je vois avec cela, c'est que c'est du code asynchrone. Il existe une demande d'extraction pour prendre en charge getSync. Vérifiez-le aussi.
https://github.com/joeferraro/react-native-env/pull/9
la source
J'ai créé un script de pré-construction pour le même problème car j'ai besoin de différents points de terminaison API pour les différents environnements
Et j'ai créé une personnalisation
npm run scripts
pour exécuter une exécution native de réaction.Mon package-json
Ensuite, dans mes composants de services, importez simplement le fichier généré automatiquement:
la source
Étape 1: Créez un composant séparé comme celui-ci Nom du composant: pagebase.js
Étape 2: À l'intérieur de ce code d'utilisation
Étape 3: Utilisez-le dans n'importe quel composant, pour l'utiliser, importez d'abord ce composant puis utilisez-le. Importez-le et utilisez-le:
la source
J'utilise
babel-plugin-transform-inline-environment-variables
.Ce que j'ai fait, c'est mettre un fichier de configuration dans S3 avec mes différents environnements.
CHAQUE fichier env:
Ensuite, j'ai ajouté un nouveau script dans mon
package.json
qui exécute un script pour le regroupementDans votre application, vous aurez probablement un fichier de configuration contenant:
qui sera remplacé par babel pour:
RAPPELEZ-VOUS que vous devez utiliser
process.env['STRING']
NOTprocess.env.STRING
ou il ne convertira pas correctement.la source
REMEMBER you have to use process.env['STRING'] NOT process.env.STRING or it won't convert properly.
Merci! C'est celui qui me fait trébucher !!![Source] D'après ce que j'ai trouvé, il semble que par défaut, il est uniquement possible de faire des configurations de production et de développement (pas de staging ou d'autres environnements) - est-ce exact?
À l'heure actuelle, j'utilise un fichier environment.js qui peut être utilisé pour détecter les canaux de publication de l'expo et modifier les variables renvoyées en fonction de cela, mais pour la construction, je dois mettre à jour la variable non- DEV retournée pour être soit de mise en scène, soit prod:
Alternatives
Quelqu'un a-t-il de l'expérience avec react-native-dotenv pour des projets construits avec expo? J'aimerais entendre vos pensées
https://github.com/zetachang/react-native-dotenv
la source
vous pouvez également avoir différents scripts d'environnement: production.env.sh development.env.sh production.env.sh
Et puis source-les au début du travail [qui est juste lié à un alias] afin que tout le fichier sh ait est exporté pour chaque variable env:
Et puis l'ajout de babel-plugin-transform-inline-environment-variables permettra d'y accéder dans le code:
la source
La réponse de @ chapinkapa est bonne. Une approche que j'ai adoptée depuis que Mobile Center ne prend pas en charge les variables d'environnement, consiste à exposer la configuration de construction via un module natif:
Sur Android:
ou sur ios:
Vous pouvez lire la configuration de construction de manière synchrone et décider en Javascript comment vous allez vous comporter.
la source
Il est possible d'accéder aux variables avec
process.env.blabla
au lieu deprocess.env['blabla']
. Je l'ai récemment fait fonctionner et commenté comment je l'ai fait sur un problème sur GitHub car j'avais des problèmes avec le cache en fonction de la réponse acceptée. Voici le problème.la source
Pour les dernières versions RN, vous pouvez utiliser ce module natif: https://github.com/luggit/react-native-config
la source