In ce tutoriel, nous allons commencer avec une nouvelle React app et passer à la mise en œuvre native de mobile en utilisant Capacitor. Vous pouvez également ajouter Capgo Navigation Native et Transitions pour un sentiment de mobile natif, et utiliser tailwind-capacitor pour les zones de sécurité.
Capacitor vous permet de convertir facilement votre application web React en une application mobile native sans modifications importantes ou apprentissage d'une nouvelle compétence comme React Native.
Avec juste quelques étapes simples, la plupart des applications React peuvent être transformées en applications mobiles.
Ce tutoriel vous guidera tout au long du processus, en commençant par une nouvelle application React et en incorporant ensuite Capacitor pour passer dans le domaine des applications mobiles natives. Vous pouvez également utiliser Capgo Navigation Native, Transitions et tailwind-capacitor pour les zones de sécurité.
À propos de Capacitor
CapacitorJS est un changement de jeu ! Vous pouvez l'intégrer facilement dans tout projet web, et il enveloppera votre application dans une vue web native, générant le projet Xcode et Android Studio natif pour vous. De plus, ses plugins fournissent accès aux fonctionnalités de dispositif natif comme la caméra via un pont JS.
Avec Capacitor, vous obtenez une application mobile native fantastique sans aucune configuration compliquée ou courbe d'apprentissage raide. Sa API et sa fonctionnalité épurée font de lui un plaisir à intégrer dans votre projet. Faites-moi confiance, vous serez impressionné par la facilité avec laquelle vous pouvez obtenir une application native complète avec Capacitor !
Préparation de votre application React
Alors que plusieurs méthodes existent pour lancer des applications React, allons pour la plus simple dans ce tutoriel qui fournit une application React vierge :
npx create-react-app my-app
Pour créer une application mobile native, nous avons besoin d'un export de notre projet. Par conséquent, ajoutons un script simple à notre package.json qui peut être utilisé pour construire et exporter le projet React :
{
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
}
}
Vous pouvez maintenant exécuter npm run build sans vous soucier de rien, et vous devriez être en mesure de voir un dossier frais
Capacitor
Adding Capacitor to Your React App
Ce dossier sera utilisé par sync __CAPGO_KEEP_0__
Tout d'abord, nous pouvons installer le Capacitor CLI Comme une dépendance de développement, installez ensuite le Capacitor dans notre projet. Lors de la configuration, vous pouvez appuyer sur "Entrée" pour accepter les valeurs par défaut pour le nom et l'ID de l'ensemble.
Ensuite, nous devons installer le package de base et les packages pertinents pour les plateformes iOS et Android.
Enfin, nous pouvons ajouter les plateformes, et Capacitor créera des dossiers pour chaque plateforme à la racine de notre projet.
# Install the Capacitor CLI locally
npm install -D @capacitor/cli
# Initialize Capacitor in your React project
npx cap init
# Install the required packages
npm install @capacitor/core @capacitor/ios @capacitor/android
# Add the native platforms
npx cap add ios
npx cap add android
À ce stade, vous devriez pouvoir observer de nouvelles ios et android dossiers dans votre projet React.
Ces sont des projets natives réels !
Pour accéder au projet Android ultérieurement, vous devez installer Android StudioPour iOS, vous avez besoin d'un Mac et devriez installer Xcode.
Trouvez également un fichier capacitor.config.ts file in your project, which contains some fundamental Capacitor settings utilized during the sync. The only thing you need to pay attention to is the webDircontext
doit pointer vers le résultat de votre commande de build. Actuellement, il est inexact. capacitor.config.json __CAPGO_KEEP_0__.config.json le fichier:
{
"appId": "com.example.app",
"appName": "my-app",
"webDir": "out",
"bundledWebRuntime": false
}
Vous pouvez essayer de l'exécuter en exécutant les commandes suivantes :
npm run build
npx cap sync
La première commande npm run build construira simplement votre projet React et exporter la construction statique.
Alors que la deuxième commande npx cap sync syncra toutes les web code dans les bons endroits des plateformes natives afin qu'elles puissent être affichées dans une application.
De plus, la commande de synchronisation pourrait mettre à jour les plateformes natives et installer des plugins, donc lorsque vous installez un nouveau Capacitor plugins il est temps de relancer npx cap sync sans même vous en rendre compte, vous êtes maintenant effectivement terminé, alors voyons donc l'application sur un appareil !
Construire et déployer des applications natives
Pour développer des applications iOS, vous devez avoir
les plateformes natives et les plugins nécessaires pour les applications iOS Xcode installé, et pour les applications Android, vous devez avoir Android Studio installé. De plus, si vous prévoyez distribuer votre application sur l'app store, vous devez vous inscrire au programme Apple Developer pour iOS et au Google Play Console pour Android.
Si vous êtes nouveau dans le développement mobile natif, vous pouvez utiliser le Capacitor CLI pour ouvrir facilement les projets natifs :
npx cap open ios
npx cap open android
Une fois que vous avez configuré vos projets natifs, déployer votre application sur un appareil connecté est facile. Dans Android Studio, vous n'avez qu'à attendre que tout soit prêt, et vous pouvez déployer votre application sur un appareil connecté sans modifier les paramètres. Voici un exemple :

Dans Xcode, vous devez configurer votre compte de signature pour déployer votre application sur un appareil réel au lieu du simulateur. Si vous n'avez pas déjà fait cela, Xcode vous guide à travers le processus (mais encore une fois, vous devez être inscrit au programme de développement). Une fois cela fait, vous pouvez simplement appuyer sur la touche de lecture pour exécuter l'application sur votre appareil connecté, que vous pouvez sélectionner en haut. Voici un exemple :

Félicitations ! Vous avez réussi à déployer votre application web React sur un appareil mobile. Voici un exemple :
Attendez, il y a aussi une façon plus rapide de faire cela pendant le développement…
Capacitor Live Reload
À ce stade, vous êtes probablement habitué à avoir la mise à jour en temps réel avec tous les frameworks modernes, et la bonne nouvelle est que vous pouvez avoir la même fonctionnalité sur un appareil mobile avec un minimum d'efforts !
Activer l'accès à votre application localement hébergée avec mise à jour en temps réel sur votre réseau en ayant l'application Capacitor charger le contenu à partir de l'URL spécifique.
La première étape consiste à déterminer votre adresse IP locale. Si vous utilisez un Mac, vous pouvez trouver cela en exécutant la commande suivante dans le terminal :
ipconfig getifaddr en0
Sur Windows, exécutez :
ipconfig
Recherchez ensuite l'adresse IPv4.
On peut instruire Capacitor à charger l'application directement depuis le serveur en ajoutant une autre entrée à notre capacitor.config.ts fichier :
import { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
appId: 'com.example.app',
appName: 'my-app',
webDir: 'out',
bundledWebRuntime: false,
server: {
url: 'http://192.168.x.xx:3000',
cleartext: true
}
};
export default config;
Assurez-vous d'utiliser le bon IP et le bon port, j'ai utilisé le port React par défaut dans cet exemple.
Maintenant, nous pouvons appliquer ces modifications en les copiant vers notre projet natif :
npx cap copy
Le copy commande est similaire à sync, mais elle ne copiera que les modifications apportées au dossier web et à la configuration, sans mettre à jour le projet natif. Vous pouvez maintenant déployer votre application une fois de plus à l'aide d'Android Studio ou Xcode. Après cela, si vous modifiez quelque chose dans votre application React,
l'application se rechargera automatiquement et affichera les modifications ! Vous pouvez maintenant déployer votre application une fois de plus à l'aide d'Android Studio ou Xcode. Après cela, si vous modifiez quelque chose dans votre application React, l'application se rechargera automatiquement et affichera les modifications.
Prenez en compte que si vous installez de nouveaux plugins comme la caméra, il est toujours nécessaire de reconstruire votre projet natif. C'est parce que les fichiers natifs sont modifiés, et cela ne peut pas être fait en temps réel.
Notez que vous devez utiliser l'adresse IP et le port corrects dans votre configuration. Le bloc code ci-dessus montre le port React par défaut à des fins de démonstration.
Utilisation des plugins Capacitor
Examinons maintenant comment utiliser un plugin Capacitor en action, que nous avons mentionné quelques fois avant. Pour cela, nous pouvons installer un plugin relativement simple en exécutant :
npm i @capacitor/share
Ce plugin n'a rien de particulier, mais il ouvre quand même le dialogue de partage natif ! Pour cela, nous n'avons plus besoin que d'importer le package et d'appeler la fonction de notre application. Modifions le src/App.js share() comme suit : Comme mentionné précédemment, lors de l'installation de nouveaux plugins, nous devons effectuer une opération de synchronisation et puis redéployer l'application sur notre appareil. Pour cela, exécutez la commande suivante : function from our app. Let’s change the
import React from 'react';
import { Share } from '@capacitor/share';
function App() {
const share = async () => {
await Share.share({
title: 'Open Youtube',
text: 'Check new video on youtube',
url: 'https://www.youtube.com',
dialogTitle: 'Share with friends'
});
};
return (
<div>
<h1>Welcome to React and Capacitor!</h1>
<p>
<h2>Cool channel</h2>
<button onClick={() => share()}>Share now!</button>
</p>
</div>
);
}
export default App;
src/App.js
npx cap sync
After avoir cliqué sur le bouton, vous pouvez voir le dialogue de partage natif en action !
Ensuite, vous pouvez rendre l'application plus native sur iOS et Android avec la navigation et les transitions Capgo et résoudre les problèmes de mise en page iOS courants qui entraînent un débordement horizontal ou des zones de sécurité coupées.
UI natif avec la navigation et les transitions Capgo Native
J'ai travaillé pendant des années avec Ionic pour créer des applications cross-platform, mais l'intégration avec React est hacky et rarement justifiée lorsque vous avez déjà Tailwind CSS.
Pour un sentiment de mobilité natif dans une application React + Capacitor, utilisez les plugins Capgo au lieu des kits UI web uniquement comme Konsta UI :
- @capgo/capacitor-native-navigation — barre de navigation natif, barre de Liquid Glass sur iOS, et un style de barre de tab flou sur Android. Votre routeur React conserve l'état de la route ; le plugin gère le chrome natif.
- @capgo/capacitor-transitions Les transitions de page Ionic et la prise en charge de la swipe-back sur l'iPhone dans la couche WebView, sans adopter l'interface utilisateur Ionic.
Installez les deux :
bun add @capgo/capacitor-native-navigation @capgo/capacitor-transitions
bunx cap sync
Configurez la navigation native avec le mode d'insertion CSS pour que le contenu web respecte les barres natives :
import { NativeNavigation } from '@capgo/capacitor-native-navigation';
await NativeNavigation.configure({
contentInsetMode: 'css',
animationDuration: 360,
glass: {
effect: 'liquidGlass',
},
});
Affichez une barre de tab en verre liquide (l'iPhone utilise la mise en page système ; Android utilise un fond de couche WebView flou) :
await NativeNavigation.setTabbar({
selectedId: 'home',
labelVisibilityMode: 'labeled',
icons: true,
colors: { dynamic: true },
tabs: [
{ id: 'home', title: 'Home', icon: { svg: '...' } },
{ id: 'settings', title: 'Settings', icon: { svg: '...' } },
],
});
await NativeNavigation.addListener('tabSelect', ({ id }) => {
navigate(`/${id}`);
});
Ajoutez des transitions de page natives dans votre coquille d'application :
import { useEffect, useRef } from 'react';
import { useNavigate } from 'react-router-dom';
import '@capgo/capacitor-transitions';
import { initTransitions, setDirection, setupRouterOutlet } from '@capgo/capacitor-transitions/react';
initTransitions({ platform: 'auto' });
export function AppShell() {
const navigate = useNavigate();
const outletRef = useRef<HTMLElement>(null);
useEffect(() => {
if (outletRef.current) {
setupRouterOutlet(outletRef.current, { platform: 'auto', swipeGesture: 'auto' });
}
}, []);
const openSettings = () => {
setDirection('forward');
navigate('/settings');
};
return <cap-router-outlet ref={outletRef}>{/* routes */}</cap-router-outlet>;
}
Enveloppez les pages routées dans cap-router-outlet, cap-pageet cap-contentet appelez setDirection('forward') ou setDirection('back') Avant de naviguer. N'ajoutez pas de titres ou de pieds de page web lorsque la navigation native gère ces surfaces.
Consultez les guides complets : Utilisation de @capgo/capacitor-native-navigation et En utilisant @capgo/capacitor-transitions.
Aires de sécurité avec Tailwind
Pour les aires de sécurité des appareils dans Tailwind CSS, utilisez @capgo/tailwind-capacitor publié sous tailwind-capacitor sur npm. safe-areas Il fournit des utilitaires et d'autres plugins de Tailwind compatibles avec Capacitor:
bun add -D tailwind-capacitor
Dans src/index.css:
@import 'tailwindcss';
@plugin "@capgo/tailwind-capacitor/platform";
@plugin "@capgo/tailwind-capacitor/safe-areas";
Utilisez des utilitaires comme pt-safe, pb-safe, et px-safe au lieu de les répandre env(safe-area-inset-*) par votre propre main. Le projet est actuellement développé — si quelque chose manque pour votre setup React, ouvre un PR sur GitHub.
Fixer les problèmes de mise en page iOS (Vueport, Zone de sécurité, et Débordement horizontal)
Si le contenu semble coupé, décalé ou scrollable horizontalement sur iOS, ajouter plus overflow-x: hidden ou ajuster la balise de vueport seule ne résout généralement pas le problème. Travaille à travers ces vérifications dans l'ordre.
Assurez-vous que la balise meta de vueport est appliquée correctement
Ajoutez la balise meta de vueport dans index.html à l'intérieur <head>:
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
Gérez la zone de sécurité iOS à partir d'un seul wrapper racine
Créez une coquille d'application unique et appliquez la mise en page de la zone de sécurité là-bas — et non dans plusieurs composants imbriqués :
html,
body,
#root {
width: 100%;
min-height: 100%;
margin: 0;
padding: 0;
overflow-x: hidden;
}
* {
box-sizing: border-box;
}
.app-shell {
min-height: 100dvh;
width: 100%;
padding-top: env(safe-area-inset-top);
padding-right: env(safe-area-inset-right);
padding-bottom: env(safe-area-inset-bottom);
padding-left: env(safe-area-inset-left);
}
Enveloppez tout le contenu de la page à l'intérieur .app-shellLe doublonnement de la mise en page de la zone de sécurité dans les en-têtes, les modaux et les enveloppes de mise en page fait souvent que l'interface utilisateur semble coupée ou trop grande.
Avec @capgo/tailwind-capacitorVous pouvez exprimer la même marge avec des utilitaires comme pt-safe pb-safe px-safe sur cette seule coquille.
Définissez Capacitor iOS contentInset sur never premier
Dans capacitor.config.tspréférez l'insérer natif désactivé et laissez CSS (ou la navigation native) contentInsetMode: 'css'se charger de la zone de sécurité :
const config: CapacitorConfig = {
appId: 'com.example.myapp',
appName: 'my-app',
webDir: 'dist',
ios: {
contentInset: 'never',
},
};
Mélanger les marges automatiques de contenu de Capacitor avec les marges CSS est une cause fréquente de double espace. env(safe-area-inset-*) pour
Trouvez l'élément qui déborde vraiment
Le coupable habituel est un élément utilisant 100vw, Tailwind w-screen, une largeur de pixels fixe, ou une large min-width.
Dans l'Inspecteur Web de Safari, exécutez :
[...document.querySelectorAll('*')]
.filter(el => el.scrollWidth > document.documentElement.clientWidth)
.map(el => ({
el,
tag: el.tagName,
class: el.className,
scrollWidth: el.scrollWidth,
clientWidth: document.documentElement.clientWidth,
}));
Avec Tailwind, remplacez w-screen par w-full lorsque possible. De nombreux problèmes de débordement horizontal proviennent de 100vw / w-screen, de la duplication de la marge de sécurité, ou d'un conteneur à largeur fixe — et non de la balise meta de la vue portée elle-même.
Conclusion
Capacitor est une excellente option pour créer des applications natives basées sur un projet web existant, offrant une façon simple de partager code et de maintenir une interface utilisateur cohérente.
Et avec l'ajout de CapgoVous pouvez même ajouter des mises à jour en direct à votre application, vous assurant que vos utilisateurs aient toujours accès aux dernières fonctionnalités et corrections de bogues.
Si vous souhaitez apprendre à ajouter Capgo à votre application React, consultez l'article suivant :
Continuez à partir de Construire des applications mobiles avec React et Capacitor
Si vous utilisez Construire des applications mobiles avec React et Capacitor pour planifier l'automatisation de CI/CD, connectez-l’à Capgo CI/CD pour le flux de travail du produit dans Capgo CI/CD, Capgo Builds natifs pour le flux de travail du produit dans Capgo Builds natifs, Intégrations Capgo pour le flux de travail du produit dans Capgo Intégrations, Intégration CI/CD contexte : Page/zone : Capgo Builder / produit de construction native dans la cloud. Rôle : Étiquette de navigation ou élément de menu court. Clé de message `native_build_feature_ci_cd` (Native Build Feature Ci Cd). GitHub Actions Integration GitHub Actions Intégration