이번에 공모전 앱 프로젝트를 함께 참가하게되면서 Ionic 프레임워크를 접하게되었다.
HTML, CSS, JS를 IOS테마, Material Design 으로 각 네이티브 환경에 맞게 적용된다. React Native 와 비교하면 모바일 기기와 더불어 PWA, web, 자동차, 냉장고... 에서도 실행가능한 형태로 빌드가 가능하다.
정말 웹개발만하면되는데, 네이티브 API 를 사용하기 위해서 Capacitor 이나 Cordova 를 사용해서 SDK 권한을 얻어서 블루투스, 카메라, GPS 등의 기본기능도 사용가능하다.
직접 사용해보면서 PWA로 아이폰과 아이패드에서 다운받아봤는데 UX가 상당히 괜찮았다. 그냥 앱다운로드해서 사용하는 느낌이었다. 몇달전 웹브라우저가 모바일 푸시알림을 곧 지원한다는 소리에 PWA가 급부상하게 될거같은 의견이 분분했는데 직접 체감해보니, 어렵사리 앱스토어 올리고, 네이티브 앱개발하는 비용을 많이 줄 일 수 있을것이라 생각된다.
물론 크로스플랫폼의 어쩔수없는 성능차이는 존재하겠지만, 왠만한 앱정도면 커버되지 않을까 하는 생각이든다.
또한 온전히 css를 그대로 사용해서 스타일링이 가능하다는 점이 접근성이 좋고, 사실 써보니 util css도 너무나 잘 제공되어있어서 쓸일이 거의 색상,border,그림자 조정정도면 충분했었다.
Page Layout
크게는 Header, Content, Footer 세개가 있다.
그래서 문서에서는 아래 3가지 컴포넌트를 Page의 핵심 구성요소라고 한다.
<IonPage>
<IonHeader>
...
</IonHeader>
<IonContent>
...
</IonContent>
<IonFooter>
...
</IonFooter>
</IonPage>
Rotuer
라우터 설정시 "/" 경로는 직접적으로 라우팅하면안된다. "/hom" ->"/" 리다이렉트 하도록 사용해야됨. 이거 때문에 삽질 2시간은 했다... 왜 안되는지 설명은 안되어있다. 답답s..
라우터는 이미 내장되어있다.
최상위 컴포넌트는 <IonApp> 이고 <IonReactRouter>가 <BrouswerRouter> 를 매핑하고있다.
<IonRouterOutlet> 하위에 엔드포인트들을 정의해주면 된다.
const App: React.FC = () => (
<IonApp>
<IonReactRouter>
<IonRouterOutlet>
<Route exact path="/home" component={Home} />
<Route exact path="/todo" component={Todo} />
</IonRouterOutlet>
</IonReactRouter>
</IonApp>
);
아래와 같이 로그인 여부에 따라서 라우팅을 분기처리해줄 수 있도록 props를 내려줄 수 있는데, <IonReactRouter> 단계에서 분기처리 해주는 것도 좋은 방법이라고 생각한다.
<Route
exact
path="/dashboard"
render={(props) => {
return isAuthed ? <DashboardPage {...props} /> : <LoginPage />;
}}
/>
Ionic에서 라우팅은 선형라우팅을 사용한다. 여느 앱에서의 경험처럼 스택처럼 페이지를 push, pop 하면서 이전페이지로 돌아가고, 이전페이지의 상태는 유지되어있다. <IonRouterOutlet>에 Route를 정의해두었을때, 페이지마다의 상태를 유지 시키도록 해준다.
routerLink
<IonButton routerLink={"/todo"}>GO TO TODO Page</IonButton>
Tabs
라우팅을 버튼과 함께 사용하기도 하지만, 상단 혹은 하단 탭을 이용할 수 있습니다.
tab은 별도의 애니메이션을 지원하지 않습니다.
* 아래와 같이 탭 컴포넌트와, outlet 을 사용해서 구조를 변경해주면 됩니다.
<IonReactRouter>
<IonTabs>
<IonTabBar slot={"bottom"}>
<IonTabButton tab="home" href="/home">
<IonLabel>HOME</IonLabel>
</IonTabButton>
<IonTabButton tab="list" href="/list">
<IonLabel>TODO</IonLabel>
</IonTabButton>
</IonTabBar>
<IonRouterOutlet>
<Route exact path="/list" component={List} />
<Route exact path="/home" component={Home} />
<Redirect exact from={"/"} to={"/home"} />
</IonRouterOutlet>
</IonTabs>
</IonReactRouter>
로그인 상태에 따른 라우팅 분기처리
const App: React.FC = () => {
const [isLogin, setIsLogin] = useState(true);
return (
<IonApp>
{isLogin ? (
<IonReactRouter>
<IonTabs>
<IonTabBar slot={"bottom"}>
<IonTabButton tab="home" href="/home">
<IonIcon icon={home} />
<IonLabel>HOME</IonLabel>
</IonTabButton>
<IonTabButton tab="list" href="/list">
<IonIcon icon={list} />
<IonLabel>TODO</IonLabel>
</IonTabButton>
<IonTabButton tab="settings" href="/settings">
<IonIcon icon={settings} />
<IonLabel>settings</IonLabel>
</IonTabButton>
</IonTabBar>
<IonRouterOutlet>
<Route exact path="/list" component={List} />
<Route exact path="/home" component={Home} />
<Route exact path="/settings" component={Settings} />
<Redirect exact from={"/"} to={"/home"} />
</IonRouterOutlet>
</IonTabs>
</IonReactRouter>
) : (
<IonReactRouter>
<Route exact path="/home" component={Login} />
<Redirect exact from={"/"} to={"/home"} />
</IonReactRouter>
)}
</IonApp>
);
};
export default App;
다양한 컴포넌트 및 hooks
블로그에 포스팅하는게 따라는거에 그치지 못할 정도로 너무 간편하고, 예시가 잘 소개되어있다.
정말 아이오닉은 특히나, 웹앱을 구현하기 위한 컴포넌트와 hook 들을 사용해야 하기 때문에, 이해하는 것 외 일절 조금이라도 외운다는 생각은 버리는게 좋은거 같다.
Overview에서 필요한 항목 찾기
Introduction to Ionic | Ionic Documentation
Open-Source UI Toolkit to Create Your Own Mobile or Desktop Apps
ionicframework.com
Ionic React Doc
Ionic React | Ionic Documentation
Create an Ionic React App: Framework and Documentation
ionicframework.com
React PWA 설정 & Firebase Deploy
Progressive Web Apps in React | Ionic Documentation
Create Progressive Web Apps (PWA) in React - Ionic Framework
ionicframework.com
React PWA 각종 API 패키지 및 설정
Your First Ionic App: React | Ionic Documentation
React Apps | Build Your First Ionic Framework React Application
ionicframework.com
Compoents
UI Components | Ionic Documentation
UI Components | User Interface Application Building Components
ionicframework.com
'Archive' 카테고리의 다른 글
CRA없이 React Typescript 환경세팅하기 [1] (0) | 2022.07.18 |
---|---|
JS에서 2차원 배열 동적으로 만들 때 주의할 점 (0) | 2022.07.17 |
TS : 여러개의 파일을를 하나의 index.ts로 export 하기 (2) | 2022.07.15 |
CRA + Prettier + ESLint 적용하기 (0) | 2022.07.12 |
MVC 패턴과 Flux 패턴에 대한 고찰 (0) | 2022.07.10 |