Saltar al contenido principal
Tutoría

Crear aplicaciones móviles con SvelteKit y Capacitor

Learn how to build a mobile app using SvelteKit, Capacitor, and enhance the Capgo Native Navigation, Transitions, and iOS layout best practices.

Créditos del artículo

Martin Donadieu

Escritor

Valeria

Revisor

Jordan

Editor

Building Mobile Apps with SvelteKit and Capacitor

En este tutorial, comenzaremos con una nueva SvelteKit app and transition to native mobile development using Capacitor. You can also add Capgo Native Navigation and Transitions for a native mobile feel, and use tailwind-capacitor for safe areas.

Capacitor allows you to easily convert your SvelteKit web application into a native mobile app without the need for significant modifications or learning a new skill like React Native.

Follow this step-by-step guide to transform your SvelteKit app into a mobile app using Capacitor, with optional Capgo Native Navigation, Transitions, and iOS layout guidance.

Sobre Capacitor

CapacitorJS es un cambio de juego. Puede integrarse de manera eficiente en cualquier proyecto web, envolviendo tu aplicación en una vista web nativa y generando proyectos de Xcode y Android Studio nativos para ti. Sus plugins proporcionan acceso a características de dispositivos nativos como la cámara a través de un puente de JavaScript.

Capacitor te permite crear una fantástica aplicación móvil nativa sin ninguna configuración complicada o curva de aprendizaje empinada. Su API y funcionalidad simplificada lo hacen fácil de integrar en tu proyecto. Te sorprenderá la simplicidad de lograr una aplicación nativa funcional completa con Capacitor!

Preparando tu aplicación SvelteKit

Para crear una nueva aplicación SvelteKit, ejecuta el siguiente comando:

npm create svelte@latest my-app
cd my-app
npm install
npm run build

Después de ejecutar el build comando, deberías ver un nuevo dist carpeta en la raíz de tu proyecto.

Este carpeta será utilizada por Capacitor más adelante, pero por ahora debemos configurarla correctamente.

Agregar Capacitor a tu aplicación SvelteKit

Para empaquetar cualquier aplicación web en un contenedor móvil nativo, debemos seguir unos pocos pasos inicialmente. Después de eso, es tan simple como ejecutar un solo sync comando.

Primero, instale el Capacitor CLI como dependencia de desarrollo y configúrelo dentro de su proyecto. Durante la configuración, puede pulsar ‘enter’ para aceptar los valores predeterminados para el nombre y el ID de paquete.

Segundo, instale el paquete básico y los paquetes relevantes para las plataformas iOS y Android.

Finalmente, agregue las plataformas, y Capacitor creará carpetas para cada plataforma en la raíz de su proyecto:

# Install the Capacitor CLI locally
npm install -D @capacitor/cli

# Initialize Capacitor in your SvelteKit 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

En este punto, debería ver nuevas ios y android carpetas en su proyecto de SvelteKit.

Estos son proyectos nativos reales!

Para acceder al proyecto de Android más adelante, debes instalar Android StudioPara iOS, necesitas un Mac y debes instalar Xcode.

Además, debes encontrar un capacitor.config.ts file in your project, which contains some basic Capacitor settings used during the sync. The only thing you need to pay attention to is the webDir, que debe apuntar a la resultante de tu comando de compilación. Actualmente, está incorrecto.

archivo y actualiza el capacitor.config.ts archivo y actualizar el webDir:

import { CapacitorConfig } from '@capacitor/cli'

const config: CapacitorConfig = {
  appId: 'com.example.app',
  appName: 'my-app',
  webDir: 'build',
}

export default config

Una vez que hemos actualizado nuestros Capacitor ajustes, vamos a cambiar nuestro proyecto de Sveltekit a una aplicación estática descargando el paquete de adaptador estático adecuado:

npm i -D @sveltejs/adapter-static

Después de instalar el paquete, necesitaremos alterar svelte.config.js archivo desde el adaptador automático a estático:

import adapter from '@sveltejs/adapter-static'
import { vitePreprocess } from '@sveltejs/kit/vite'

/** @type {import('@sveltejs/kit').Config} */
const config = {
// Consult https://kit.svelte.dev/docs/integrations#preprocessors
// for more information about preprocessors
  preprocess: vitePreprocess(),

  kit: {
    // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
    // If your environment is not supported or you settled on a specific environment, switch out the adapter.
    // See https://kit.svelte.dev/docs/adapters for more information about adapters.
    adapter: adapter({
      // default options are shown. On some platforms
      // these options are set automatically — see below
      pages: 'build',
      assets: 'build',
      fallback: null,
      precompress: false,
      strict: true
    })
  }
}

export default config

Con la svelte.config.js actualizado, necesitaremos agregar un prerender opción de pre-renderizado creando una +layout.js src/rutas y solo agregar la siguiente exportación a +layout.js:

export const prerender = true

Después de agregar y actualizar la +layout.js página, necesitaremos agregar nuestras plataformas móviles, reconstruir nuestro proyecto para crear el build folder

Puedes hacerlo ejecutando los siguientes comandos:

npm run build
npx cap sync

Puedes hacerlo ejecutando los siguientes comandos: npm run build Construirá su proyecto SvelteKit y copiará la compilación estática, mientras que el segundo comando npx cap sync sincronizará todas las páginas web code en los lugares adecuados de las plataformas nativas para que puedan ser mostradas en la aplicación.

synceará todos los web __CAPGO_KEEP_0__ en los lugares adecuados de las plataformas nativas para que puedan ser mostrados en una aplicación. plugins de Capacitores hora de correr npx cap sync de nuevo.

Sin darse cuenta, has completado el proceso, así que veamos la aplicación en un dispositivo!

Crear y Desplegar Aplicaciones Nativas

Para desarrollar aplicaciones iOS, necesitas tener Xcode instalado, y para aplicaciones Android, necesitas tener Android Studio instalado. Además, si planeas distribuir tu aplicación en la tienda de aplicaciones, necesitas inscribirte en el Programa de Desarrolladores de Apple para iOS y en el Console de Google Play para Android.

Si eres nuevo en el desarrollo de aplicaciones móviles nativas, puedes utilizar los Capacitor CLI para abrir fácilmente ambos proyectos nativos:

npx cap open ios
npx cap open android

Una vez que hayas configurado tus proyectos nativos, desplegar tu aplicación en un dispositivo conectado es fácil. En Android Studio, solo necesitas esperar a que todo esté listo, y puedes desplegar tu aplicación en un dispositivo conectado sin cambiar ninguna configuración. Aquí tienes un ejemplo:

android-studio-ejecutar

En Xcode, debes configurar tu cuenta de firma para desplegar tu aplicación en un dispositivo real en lugar de solo en el simulador. Si no lo has hecho antes, Xcode te guía a través del proceso (pero de nuevo, debes estar inscrito en el Programa de Desarrolladores). Después de eso, puedes simplemente pulsar play para ejecutar la aplicación en tu dispositivo conectado, que puedes seleccionar en la parte superior. Aquí tienes un ejemplo:

xcode-ejecutar

Felicidades! Has desplegado con éxito tu aplicación web de SvelteKit en un dispositivo móvil. Aquí tienes un ejemplo:

aplicación móvil de SvelteKit

Pero espera, hay una forma más rápida de hacer esto durante el desarrollo…

Capacitor Recarga en vivo

Hasta ahora, probablemente estás acostumbrado a tener recarga en vivo con todas las marcos modernas, y la buena noticia es que puedes tener la misma funcionalidad en un dispositivo móvil con un mínimo esfuerzo!

Habilita acceso a tu aplicación hospedada localmente con recarga en vivo on your network por tener la aplicación Capacitor cargar el contenido desde la URL específica.

El primer paso es determinar la dirección IP local. Si estás utilizando un Mac, puedes encontrar esto ejecutando el siguiente comando en la terminal:

ipconfig getifaddr en0

En Windows, ejecuta:

ipconfig

Luego busca la dirección IPv4.

Podemos instruir a Capacitor para que cargue la aplicación directamente desde el servidor agregando otra entrada a nuestro archivo: capacitor.config.ts file:

import { CapacitorConfig } from '@capacitor/cli';

const config: CapacitorConfig = {
  appId: 'com.example.app',
  appName: 'my-app',
  webDir: 'dist',
  bundledWebRuntime: false,
  server: {
    url: 'http://192.168.x.xx:3000',
    cleartext: true
  }
};

export default config;

la dirección IP y el puerto correctos como se muestra en el ejemplo anterior.como se muestra en el ejemplo anterior.

Ahora, podemos aplicar estos cambios copiándolos a nuestro proyecto nativo:

npx cap copy

The copy El comando es similar a sync, but it will only copiar los cambios realizados en la carpeta web y la configuración, sin actualizar el proyecto nativo.

Puedes desplegar tu aplicación una vez más a través de Android Studio o Xcode. Después de eso, si cambias algo en tu aplicación Svelte, la aplicación se recargará automáticamente y mostrará los cambios!

Tener en cuenta que si instales nuevos plugins como la cámara, todavía requiere una reconstrucción de tu proyecto nativo. Esto se debe a que los archivos nativos se han modificado, y no se puede hacer en tiempo real.

Ten en cuenta que debes utilizar la IP y el puerto correctos en tu configuración. El bloque code anterior muestra el puerto por defecto de SvelteKit para fines de demostración.

Usando Capacitor Plugins

Vamos a ver cómo utilizar un plugin Capacitor en acción, que mencionamos varias veces antes. Para hacer esto, podemos instalar un plugin simple ejecutando:

npm i @capacitor/share

No hay nada sofisticado en el Compartir pluginPero esto despliega el diálogo de compartir nativo! Para esto, ahora solo necesitamos importar el paquete y llamar a la share() función desde nuestra aplicación, así que cambiemos el src/rutas/index.svelte a esto:

<script>
  import { Share } from '@capacitor/share';

  async function share() {
    await Share.share({
      title: 'Open Youtube',
      text: 'Check new video on youtube',
      url: 'https://www.youtube.com',
      dialogTitle: 'Share with friends'
    });
  }
</script>

<h1>Welcome to SvelteKit and Capacitor!</h1>
<button on:click={share}>Share now!</button>

Como se mencionó anteriormente, cuando instalamos nuevos plugins, debemos realizar una operación de sincronización y luego volver a desplegar la aplicación en nuestro dispositivo. Para hacer esto, ejecute el siguiente comando:

npx cap sync

Después de pulsar el botón, puede ver el hermoso diálogo de compartir nativo en acción!

Ahora puede hacer que la aplicación se sienta más nativa en iOS y Android con la navegación y las transiciones de Capgo y solucione problemas de diseño comunes de iOS que causan desbordamiento horizontal o áreas de seguridad recortadas.

Interfaz de usuario que se siente nativa con Capgo Navegación y Transiciones Nativas

He trabajado durante años con Ionic para construir aplicaciones de múltiples plataformas, pero integrarlo con SvelteKit es engorroso y raramente vale la pena cuando ya tienes Tailwind CSS.

Para un sentir móvil nativo en una aplicación SvelteKit + Capacitor, utilice plugins Capgo en lugar de kits de interfaz de usuario web solo como Konsta UI:

  • @capgo/capacitor-navegación-nativa — barra de navegación nativa, Liquid Glass barra de pestañas en iOS, y un estilo de barra de pestañas difuminado en Android. Su router SvelteKit mantiene el estado de ruta; el plugin posee el navegador nativo.
  • @capgo/capacitor-transiciones Transiciones de página estilo Ionic y retroceso por swipe en iOS en el capa WebView, sin adoptar la interfaz de usuario de Ionic.

Instale ambos:

bun add @capgo/capacitor-native-navigation @capgo/capacitor-transitions
bunx cap sync

Configure la navegación nativa con el modo de inserción CSS para que el contenido web respete las barras nativas:

import { NativeNavigation } from '@capgo/capacitor-native-navigation';

await NativeNavigation.configure({
  contentInsetMode: 'css',
  animationDuration: 360,
  glass: {
    effect: 'liquidGlass',
  },
});

Render un tablero de Liquid Glass (iOS utiliza la renderización propia del sistema; Android utiliza un fondo de fondo de WebView desenfocado):

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 }) => {
  goto(`/${id}`);
});

Agregue transiciones de página nativas en su concha de aplicación:

<script>
  import { goto } from '$app/navigation';
  import { routerOutlet, page, setDirection } from '@capgo/capacitor-transitions/svelte';
  import '@capgo/capacitor-transitions';

  function openSettings() {
    setDirection('forward');
    goto('/settings');
  }
</script>

<cap-router-outlet use:routerOutlet>
  <cap-page use:page>
    <cap-content slot="content">
      <slot />
    </cap-content>
  </cap-page>
</cap-router-outlet>

Envuelva páginas de ruta en cap-router-outlet, cap-pagey cap-contenty llamar setDirection('forward') o setDirection('back') antes de navegar. No duplique encabezados o pie de página web cuando la navegación nativa controla esas superficies.

Ver los guías completas: Usando @capgo/capacitor-navegación nativa and Usando @capgo/capacitor-transiciones.

Usando @__CAPGO_KEEP_0__/__CAPGO_KEEP_1__-transiciones

Para áreas de seguridad de dispositivo en Tailwind CSS, utilice @capgo/tailwind-capacitor @__CAPGO_KEEP_0__/tailwind-__CAPGO_KEEP_1__ tailwind-capacitor (publicado como "on npm". Proporciona safe-areas utilidades y otras Capacitor-compatibles plugins de Tailwind:

bun add -D tailwind-capacitor

In src/app.css:

@import 'tailwindcss';
@plugin "@capgo/tailwind-capacitor/platform";
@plugin "@capgo/tailwind-capacitor/safe-areas";

Utilice utilidades como pt-safe, pb-safe, y px-safe en lugar de esparcirlos env(safe-area-inset-*) manualmente. El proyecto está activamente desarrollado — si algo falta para su configuración de SvelteKit, abre una PR en GitHub.

Solucionar problemas de diseño de iOS (Viewport, Área Segura y Desbordamiento Horizontal)

Si el contenido parece recortado, desplazado o desplazable horizontalmente en iOS, agregar más overflow-x: hidden o ajustar la etiqueta de viewport sola no suele solucionarlo. Pase por estos controles en orden.

Asegúrese de que la etiqueta meta de viewport se aplique correctamente

In src/app.html, establezca la etiqueta meta de viewport en <head>:

<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />

Administre el área segura de iOS desde un solo envoltorio raíz

Crear un solo concha de aplicación y aplicar allí el relleno de área segura, no en múltiples componentes anidados:

html,
body,
body {
  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);
}

Envuelve todo el contenido de la página dentro .app-shellEl relleno de área segura duplicado en encabezados, modales y envoltorios de diseño a menudo hace que la interfaz de usuario parezca recortada o demasiado grande.

Con @capgo/tailwind-capacitorpuede expresar el mismo relleno con utilidades como pt-safe pb-safe px-safe en esa sola concha.

Establezca Capacitor iOS contentInset en never first

En capacitor.config.ts, prefiera el diseño nativo deshabilitado y deja CSS (o la navegación nativa) contentInsetMode: 'css'Ocupa el área segura:

const config: CapacitorConfig = {
  appId: 'com.example.myapp',
  appName: 'my-app',
  webDir: 'build',
  ios: {
    contentInset: 'never',
  },
};

Mixing Capacitor’s automatic content inset con CSS env(safe-area-inset-*) Encuentra el elemento que está desbordando en realidad

El culpable habitual es un elemento que utiliza

El elemento sospechoso es un componente 100vw, Tailwind w-screenEn Safari Web Inspector, ejecuta: min-width.

Con Tailwind, reemplaza

[...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,
  }));

Con Tailwind, reemplaza w-screen con w-full cuando sea posible. Muchos problemas de rebosamiento horizontal provienen de 100vw / w-screenduplicado relleno de zona segura, o un contenedor de ancho fijo — no del meta etiqueta de viewport en sí.

Conclusiones

Capacitor es una excelente opción para crear aplicaciones nativas basadas en un proyecto web existente, ofreciendo una forma sencilla de compartir code y mantener una interfaz de usuario consistente.

Y con la adición de CapgoEs aún más sencillo agregar actualizaciones en vivo a tu aplicación, asegurando que tus usuarios siempre tengan acceso a las últimas características y correcciones de errores.

Si deseas aprender a agregar Capgo a tu aplicación SvelteKit, consulta el siguiente artículo.

Aprende a crear aplicaciones móviles más rápidas con Capgo. regístrate para una cuenta gratuita today.

Sigue adelante desde Crear aplicaciones móviles con SvelteKit y Capacitor

Si estás utilizando Building Mobile Apps with SvelteKit and Capacitor para planificar la automatización de CI/CD, conecta con Capgo CI/CD para el flujo de trabajo del producto en Capgo CI/CD, Capgo Compilaciones Nativas para el flujo de trabajo del producto en Capgo Construcciones Nativas Capgo Integrations para el flujo de trabajo del producto en Capgo Integraciones, Integración de CI/CD para el detalle de implementación en Integración de CI/CD, y GitHub Integración de Acciones para los detalles de implementación en GitHub Acciones de Integración.

Actualizaciones instantáneas para aplicaciones Capacitor

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

Últimas noticias de nuestro Blog

Capgo gives you the best insights you need to create a truly professional mobile app.