- 스벨트는 빌드시, 모든 코드를 효율적인 javascript 로 변환
- 가상돔과 npm 의존성(코어 라이브러리)을 없애고 런타임(실행환경)에 코드를 해석하지 않는다.
컴파일러는 번역기다. 스벨트는 이런 컴파일 역할을 하여 효율적인 javascript 코드로 변환
가상돔을 사용하지 않는다. + react, vue 처럼 npm 의존성(vue, react, react-dom)이 존재하지 않는다.
"dependencies": {
"sirv-cli": "^0.4.4"
},
"devDependencies": {
"@rollup/plugin-commonjs": "^11.0.0",
"@rollup/plugin-node-resolve": "^7.0.0",
"rollup": "^1.20.0",
"rollup-plugin-livereload": "^1.0.0",
"rollup-plugin-svelte": "^5.0.3",
"rollup-plugin-terser": "^5.1.2",
"svelte": "^3.0.0"
}
svelte는 기본적으로 컴파일러이기 때문에, 런타임에 svelte 관련 라이브러리를 불러오거나 의존성이 존재하지 않음.
-> Virtual(가상) DOM이 없고, Runtime(런타임)에 로드할 프레임워크 또는 라이브러리가 없음을 의미
npx degit sveltejs/template my-svelte-project
cd my-svelte-project
npm i
npm run dev
src/example, public/build 폴더를 제외하면 초기 구성은 위 사진과 같다
// rollup.config.js input 에 시작점
import App from './App.svelte';
const app = new App({
target: document.querySelector('#app'),
props: {
name: 'world'
}
});
export default app;
// component format
<script>
// logic goes here
</script>
<style>
/* styles go here */
</style>
<!-- markup (zero or more items) goes here -->
<script>
let count = 0;
let count2 = 100;
const addCount = () => {
count2++
}
</script>
<button on:click={() => count += 1}>
{count}
</button>
<button on:click={addCount}>
{count2}
</button>
<style>
button {
background-color: #4287f5; /* Green */
border: none;
outline: none;
color: white;
padding: 8px;
text-align: center;
text-decoration: none;
font-size: 14px;
display: inline-block;
}
</style>
// props 관련
// PropsExample.svelte
<script>
export let name = null;
export let age = null;
export const readOnly = 'readOnly!!'; // const 로 선언하면 무조건 읽기 전용
</script>
<div>
<p>난 부모에게 값을 받았어요!</p>
<p>
name : {name} / age : {age}
</p>
<p>
readOnly : {readOnly}
</p>
<div>
<button on:click={() => name = '변경이름'}>변경</button>
</div>
</div>
let person = {
name : 'nameProp',
age : 100
}
<PropsExample name="{person.name}" age="{person.age}" readOnly="zzzz"/>