Chapter 2 of 12 ~12 min read
Project Setup & CLI
Side-by-side Cordova vs Capacitor — practical migration with working code.
CLI Commands — Side by Side
Cordova CLI
# Create project
ionic start myApp blank --type=angular --cordova
# Add platform
cordova platform add android
cordova platform add ios
# Build
cordova build android
cordova run android --device
# Add plugin
cordova plugin add cordova-plugin-camera
# Emulate
cordova emulate android Capacitor CLI
# Create project
ionic start myApp blank --type=angular
# Add platform (once)
npx cap add android
npx cap add ios
# Sync web → native after changes
npx cap sync
# Open in native IDE
npx cap open android # Android Studio
npx cap open ios # Xcode
# Live reload on device
ionic cap run android -l --externalconfig.xml → capacitor.config.ts
Cordova — config.xml
<?xml version="1.0"?>
<widget id="com.example.myapp" version="1.0.0">
<name>My App</name>
<description>My Cordova App</description>
<author email="dev@example.com">Dev</author>
<content src="index.html"/>
<preference name="StatusBarOverlaysWebView" value="false"/>
<preference name="ScrollEnabled" value="false"/>
<plugin name="cordova-plugin-camera" spec="^7.0.0"/>
<engine name="android" spec="^12.0.0"/>
</widget> Capacitor — capacitor.config.ts
import { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
appId: 'com.example.myapp',
appName: 'My App',
webDir: 'www', // or 'dist', 'build'
plugins: {
SplashScreen: {
launchShowDuration: 3000,
backgroundColor: '#ffffff',
},
StatusBar: {
style: 'dark',
},
},
};
export default config; Native project folder structure
my-app/
├── android/ ← permanent native Android project (commit to git!)
├── ios/ ← permanent native iOS project (commit to git!)
├── src/ ← your web code
├── www/ ← built web output (gitignore this)
└── capacitor.config.ts
Unlike Cordova's regenerated platforms/, these are permanent. You edit AndroidManifest.xml, build.gradle, and Info.plist directly.
The npx cap sync Workflow
Daily workflow
# 1. Build your web app
ionic build # outputs to www/
# 2. Sync web assets + installed plugins to native projects
npx cap sync # = cap copy + cap update
# 3. Open native IDE (only needed for native code changes)
npx cap open android
# OR — hot reload during development:
ionic cap run android -l --external
# Live-reloads JS changes without re-syncing!