최소 구성으로 시작 @ionic/react
소개
올해 초 Ionic 4가 출시되었습니다.
Ionic 4에서는 UI 컴포넌트가 WebComponents에서 다시 구현되어 React와 Vue에서도 Ionic을 사용할 수 있습니다.
그래서 React 버전의 @ionic/react을 빠르게 실행하고 싶습니다.
(버전 4.8.0-rc.0에서 동작 확인했습니다.)
@ionic/react를 사용하려면 Webpack에서 몇 가지 설정이 필요합니다.
Ionic CLI나 create-react-app를 이용하면 이들이 설정된 상태에서 @ionic/react를 이용할 수 있습니다.
(둘 다 내부적으로 react-scripts를 사용합니다.)
그러나 이러한 환경에서는 불필요한 패키지도 많이 도입되어 버릴 것입니다.
빌드 환경을 스스로 커스터마이즈하고 싶은 사람이나, 기존의 React 앱에 Ionic을 짜넣고 싶은 사람을 위해서, 최소 구성으로 @ionic/react가 움직이는 환경을 만들어 봅니다.
패키지 설치
다음과 같이 패키지를 초기화하고 필요한 패키지를 설치합니다.
$ npm init -y
$ npm i @ionic/react react react-dom react-router@4 react-router-dom@4
$ npm i -D @babel/core @babel/preset-react @svgr/webpack babel-loader css-loader style-loader url-loader webpack webpack-cli webpack-dev-server
Webpack 설정
다음과 같이 webpack.config.js
를 작성합니다.
webpack.config.jsconst path = require('path')
module.exports = {
module: {
rules: [
{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-react']
}
},
include: [
path.resolve(__dirname, 'src')
]
},
{
test: /\.css$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
importLoaders: 1
}
}
]
},
{
test: /\.svg$/,
use: [
'@svgr/webpack',
'url-loader'
]
}
]
},
entry: {
bundle: './src/index'
},
output: {
path: path.join(__dirname, 'public'),
filename: '[name].js'
},
devServer: {
historyApiFallback: true,
contentBase: path.join(__dirname, 'public')
},
mode: process.env.NODE_ENV || 'development'
}
앱 구현
이런 식으로 앱을 구현합니다.
설명을 단순화하기 위해 하나의 파일 만 간단한 것입니다.
React에 익숙한 사람이라면 일반 구성 요소 라이브러리로 사용할 수 있습니다.
src/index.jsimport '@ionic/core/css/core.css'
import '@ionic/core/css/ionic.bundle.css'
import React from 'react'
import { render } from 'react-dom'
import {
BrowserRouter as Router,
Route,
Switch
} from 'react-router-dom'
import {
IonApp,
IonContent,
IonFab,
IonFabButton,
IonHeader,
IonIcon,
IonItem,
IonList,
IonTitle,
IonToolbar
} from '@ionic/react'
import { add } from 'ionicons/icons'
const MainPage = () => {
const [items, setItems] = React.useState(['A', 'B', 'C'])
return <>
<IonContent>
<IonList>
{
items.map((item, i) => {
return <IonItem key={i}>{item}</IonItem>
})
}
</IonList>
</IonContent>
<IonFab vertical='bottom' horizontal='end' slot='fixed'>
<IonFabButton
onClick={() => {
const newItems = Array.from(items)
newItems.push('new item')
setItems(newItems)
}}
>
<IonIcon icon={add} />
</IonFabButton>
</IonFab>
</>
}
const App = () => {
return <Router>
<IonApp>
<IonHeader>
<IonToolbar>
<IonTitle>Hello @ionic/react</IonTitle>
</IonToolbar>
</IonHeader>
<Switch>
<Route path='/' component={MainPage} />
</Switch>
</IonApp>
</Router>
}
render(<App />, document.getElementById('content'))
HTML 파일은 이런 느낌입니다.
public/index.html<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width">
<title>@ionic/react minimum start</title>
</head>
<body>
<div id="content"/>
<script src="bundle.js"></script>
</body>
</html>
다음 명령으로 실행합니다.
$ npx webpack-dev-server
http://localhost-8080.com/에 액세스하면 다음과 같이 표시됩니다.
(Chrome 모바일 에뮬레이션의 화면입니다.)
결론
마지막으로, @ionic/react 를 알고 있는 범위에서 올바르게 움직이기 위한 포인트를 정리합니다.
다음과 같이 패키지를 초기화하고 필요한 패키지를 설치합니다.
$ npm init -y
$ npm i @ionic/react react react-dom react-router@4 react-router-dom@4
$ npm i -D @babel/core @babel/preset-react @svgr/webpack babel-loader css-loader style-loader url-loader webpack webpack-cli webpack-dev-server
Webpack 설정
다음과 같이 webpack.config.js
를 작성합니다.
webpack.config.jsconst path = require('path')
module.exports = {
module: {
rules: [
{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-react']
}
},
include: [
path.resolve(__dirname, 'src')
]
},
{
test: /\.css$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
importLoaders: 1
}
}
]
},
{
test: /\.svg$/,
use: [
'@svgr/webpack',
'url-loader'
]
}
]
},
entry: {
bundle: './src/index'
},
output: {
path: path.join(__dirname, 'public'),
filename: '[name].js'
},
devServer: {
historyApiFallback: true,
contentBase: path.join(__dirname, 'public')
},
mode: process.env.NODE_ENV || 'development'
}
앱 구현
이런 식으로 앱을 구현합니다.
설명을 단순화하기 위해 하나의 파일 만 간단한 것입니다.
React에 익숙한 사람이라면 일반 구성 요소 라이브러리로 사용할 수 있습니다.
src/index.jsimport '@ionic/core/css/core.css'
import '@ionic/core/css/ionic.bundle.css'
import React from 'react'
import { render } from 'react-dom'
import {
BrowserRouter as Router,
Route,
Switch
} from 'react-router-dom'
import {
IonApp,
IonContent,
IonFab,
IonFabButton,
IonHeader,
IonIcon,
IonItem,
IonList,
IonTitle,
IonToolbar
} from '@ionic/react'
import { add } from 'ionicons/icons'
const MainPage = () => {
const [items, setItems] = React.useState(['A', 'B', 'C'])
return <>
<IonContent>
<IonList>
{
items.map((item, i) => {
return <IonItem key={i}>{item}</IonItem>
})
}
</IonList>
</IonContent>
<IonFab vertical='bottom' horizontal='end' slot='fixed'>
<IonFabButton
onClick={() => {
const newItems = Array.from(items)
newItems.push('new item')
setItems(newItems)
}}
>
<IonIcon icon={add} />
</IonFabButton>
</IonFab>
</>
}
const App = () => {
return <Router>
<IonApp>
<IonHeader>
<IonToolbar>
<IonTitle>Hello @ionic/react</IonTitle>
</IonToolbar>
</IonHeader>
<Switch>
<Route path='/' component={MainPage} />
</Switch>
</IonApp>
</Router>
}
render(<App />, document.getElementById('content'))
HTML 파일은 이런 느낌입니다.
public/index.html<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width">
<title>@ionic/react minimum start</title>
</head>
<body>
<div id="content"/>
<script src="bundle.js"></script>
</body>
</html>
다음 명령으로 실행합니다.
$ npx webpack-dev-server
http://localhost-8080.com/에 액세스하면 다음과 같이 표시됩니다.
(Chrome 모바일 에뮬레이션의 화면입니다.)
결론
마지막으로, @ionic/react 를 알고 있는 범위에서 올바르게 움직이기 위한 포인트를 정리합니다.
const path = require('path')
module.exports = {
module: {
rules: [
{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-react']
}
},
include: [
path.resolve(__dirname, 'src')
]
},
{
test: /\.css$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
importLoaders: 1
}
}
]
},
{
test: /\.svg$/,
use: [
'@svgr/webpack',
'url-loader'
]
}
]
},
entry: {
bundle: './src/index'
},
output: {
path: path.join(__dirname, 'public'),
filename: '[name].js'
},
devServer: {
historyApiFallback: true,
contentBase: path.join(__dirname, 'public')
},
mode: process.env.NODE_ENV || 'development'
}
이런 식으로 앱을 구현합니다.
설명을 단순화하기 위해 하나의 파일 만 간단한 것입니다.
React에 익숙한 사람이라면 일반 구성 요소 라이브러리로 사용할 수 있습니다.
src/index.js
import '@ionic/core/css/core.css'
import '@ionic/core/css/ionic.bundle.css'
import React from 'react'
import { render } from 'react-dom'
import {
BrowserRouter as Router,
Route,
Switch
} from 'react-router-dom'
import {
IonApp,
IonContent,
IonFab,
IonFabButton,
IonHeader,
IonIcon,
IonItem,
IonList,
IonTitle,
IonToolbar
} from '@ionic/react'
import { add } from 'ionicons/icons'
const MainPage = () => {
const [items, setItems] = React.useState(['A', 'B', 'C'])
return <>
<IonContent>
<IonList>
{
items.map((item, i) => {
return <IonItem key={i}>{item}</IonItem>
})
}
</IonList>
</IonContent>
<IonFab vertical='bottom' horizontal='end' slot='fixed'>
<IonFabButton
onClick={() => {
const newItems = Array.from(items)
newItems.push('new item')
setItems(newItems)
}}
>
<IonIcon icon={add} />
</IonFabButton>
</IonFab>
</>
}
const App = () => {
return <Router>
<IonApp>
<IonHeader>
<IonToolbar>
<IonTitle>Hello @ionic/react</IonTitle>
</IonToolbar>
</IonHeader>
<Switch>
<Route path='/' component={MainPage} />
</Switch>
</IonApp>
</Router>
}
render(<App />, document.getElementById('content'))
HTML 파일은 이런 느낌입니다.
public/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width">
<title>@ionic/react minimum start</title>
</head>
<body>
<div id="content"/>
<script src="bundle.js"></script>
</body>
</html>
다음 명령으로 실행합니다.
$ npx webpack-dev-server
http://localhost-8080.com/에 액세스하면 다음과 같이 표시됩니다.
(Chrome 모바일 에뮬레이션의 화면입니다.)
결론
마지막으로, @ionic/react 를 알고 있는 범위에서 올바르게 움직이기 위한 포인트를 정리합니다.
@ionic/core/css/core.css
및 @ionic/core/css/ionic.bundle.css
불러오기style-loader
와 css-loader
를 사용했지만, 결과적으로 필요한 CSS를 읽으면 수단은 무엇이든 OK입니다 ionicons
의 SVG 파일을 올바르게로드IonIcon
작동에 필요 @svgr/webpack
및 url-loader
를 사용하면 가져온 SVG가 Data URI 형식으로 처리됩니다 file-loader
하지만 대체 가능하지만 모든 SVG 파일이 자산으로 내보내집니다 더 좋은 방법이 있으면 알려주세요.
Ionic은 원래 Angular를 기반으로 만들어졌습니다.
Ionic 4에서는 이 정도의 최소한의 React 프로그램으로 Ionic을 이용할 수 있게 되어 있어서 훌륭하네요.
참고 정보
Reference
이 문제에 관하여(최소 구성으로 시작 @ionic/react), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/_likr/items/0259014311631979a420텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)