์ด ๊ฐ์ด๋๋ Vue.js ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฒด๊ณ์ ์ผ๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
- ๊ฐ๋ฐ์ ํน์ ํ์์ด ์ฝ๊ฒ ์ดํดํ๊ณ ์ฐพ์ ์ ์์ต๋๋ค.
- IDE๊ฐ ์ฝ๊ฒ ์ฝ๋๋ฅผ ํด์ํ๊ณ ๋์์ ์ค ์ ์์ต๋๋ค.
- ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์๋ ๋น๋ ํด์ ์ฌ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ฝ๊ฒ ์บ์ฑ์ด ๊ฐ๋ฅํ๊ณ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
์ด ๊ฐ์ด๋๋ De voorhoede๊ฐ ์์ฑํ RiotJS ์คํ์ผ ๊ฐ์ด๋์์ ์๊ฐ์ ์ป์์ต๋๋ค.
- ๋ชจ๋ ๊ธฐ๋ฐ ๊ฐ๋ฐ
- Vue ์ปดํฌ๋ํธ ์ด๋ฆ
- ์ปดํฌ๋ํธ ํํ์์ ๋จ์ํ๊ฒ ์ฌ์ฉํ๊ธฐ
- ์ปดํฌ๋ํธ props๋ฅผ ์์ ์๋ฃํ์ผ๋ก ์ฌ์ฉํ๊ธฐ
- ์ปดํฌ๋ํธ props๋ฅผ ์ ์ฌ์ฉํ๊ธฐ
this
๋ฅผcomponent
์ ์ง์ ํ๊ธฐ- ์ปดํฌ๋ํธ ๊ตฌ์กฐ
- ์ปดํฌ๋ํธ ์ด๋ฒคํธ ์ด๋ฆ
this.$parent
ํผํ๊ธฐthis.$refs
๋ฅผ ์ฃผ์ํ์ฌ ์ฌ์ฉํ๊ธฐ- ๋ฒ์ ์คํ์ผ์ ์ปดํฌ๋ํธ ์ด๋ฆ ์ฌ์ฉํ๊ธฐ
- ์ปดํฌ๋ํธ API๋ฅผ ๋ฌธ์ํ ํ๊ธฐ
- ์ปดํฌ๋ํธ ์์ ์ถ๊ฐํ๊ธฐ
- ์ปดํฌ๋ํธ ํ์ผ์ Lintํ๊ธฐ
ํญ์ ํ ๊ฐ์ง ์ผ์ ์ ์ํํ๋ ์์ ๋ชจ๋๋ค๋ก ๋น์ ์ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ชจ๋์ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ ๋ฆฝ์ ์ธ ํ ๋ถ๋ถ ์ ๋๋ค. ์ฌ๊ธฐ์ Vue.js๋ ๋ทฐ-๋ก์ง ๋ชจ๋์ ์์ฑํ ์ ์๋๋ก ํน๋ณํ ๋์์ธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
์์ ๋ชจ๋์ ๋ฐฐ์ฐ๊ณ , ์ดํดํ๊ณ , ์ ์งํ๊ณ , ์ฌ์ฌ์ฉ๊ณผ ๋๋ฒ๊ทธํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค. ๋น์ ์ด ๋ค๋ฅธ ๊ฐ๋ฐ์์ ํ์ ํ๋ ๊ฒฝ์ฐ์๋์.
๊ฐ Vue ์ปดํฌ๋ํธ(๋ชจ๋๊ณผ ๊ฐ์ต๋๋ค)๋ FIRST์ฌ์ผ ํฉ๋๋ค: Focused (๋จ์ผ ์ฑ ์ ์์น), Independent(๋ ๋ฆฝ์ ์ธ), Reusable(์ฌ์ฌ์ฉ ๊ฐ๋ฅํ), Small(์์), Testable(ํ ์คํธ ๊ฐ๋ฅํ).
์ปดํฌ๋ํธ๊ฐ ๋๋ฌด ๋ง๊ฑฐ๋ ๋๋ฌด ์ปค์ง๋ฉด ํ ๊ฐ์ง ์ผ์ ํ๋ ์์ ์ปดํฌ๋ํธ๋ก ๋๋ ์ ๊ตฌ์ฑํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ฐ ์ปดํฌ๋ํธ ํ์ผ์ 100๋ผ์ธ ๋ฏธ๋ง์ผ๋ก ์ ์งํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ํ, Vue ์ปดํฌ๋ํธ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํ๋์ง ํ์ธํ์ธ์. ์๋ฅผ ๋ค๋ฉด ๋ ๋ฆฝ ์คํ์ด ๊ฐ๋ฅํ ๋ฐ๋ชจ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค.
๊ฐ ์ปดํฌ๋ํธ์ ์ด๋ฆ์ ๋ค์๊ณผ ๊ฐ์์ผํฉ๋๋ค.
- ์๋ฏธ์๋: ์ง๋์น๊ฒ ์ถ์์ ์ด๊ฑฐ๋ ๊ตฌ์ฒด์ ์ด๋ฉด ์๋ฉ๋๋ค.
- ์งง์: 2~3๋จ์ด์ฌ์ผ ํฉ๋๋ค.
- ๋ฐ์ ๊ฐ๋ฅํ: ์ฐ๋ฆฌ๋ ์ปดํฌ๋ํธ์ ๋ํด ์ด์ผ๊ธฐํ ์ ์์ด์ผํฉ๋๋ค.
๋ํ, Vue ์ปดํฌ๋ํธ ์ด๋ฆ์ ๋ค์๊ณผ ๊ฐ์์ผํฉ๋๋ค.
- ์ฌ์ฉ์ ์ ์ ์๋ฆฌ๋จผํธ ์คํ์ ์ค์ํด์ผ ํฉ๋๋ค: ํ์ดํ(-)์ ํฌํจํ๊ณ , ์์ฝ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฉ๋๋ค.
app-
๋ค์์คํ์ด์ค: ๋งค์ฐ ์ผ๋ฐ์ ์ด๊ณ ํ ๋จ์ด๋ผ๋ฉด ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์ฝ๊ฒ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ด๋ฆ์ ์ปดํฌ๋ํธ๋ผ๋ฆฌ ํต์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋์ ์ปดํฌ๋ํธ ์ด๋ฆ์ ์งง๊ณ , ์๋ฏธ์์ผ๋ฉด์ ๋ฐ์ ํ ์ ์์ด์ผํฉ๋๋ค.
<!-- ๊ถ์ฅํฉ๋๋ค -->
<app-header></app-header>
<user-list></user-list>
<range-slider></range-slider>
<!-- ํผํ์ธ์! -->
<btn-group></btn-group> <!-- ์งง์ง๋ง ๋ฐ์ํ ์ ์์ต๋๋ค. `button-group`์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. -->
<ui-slider></ui-slider> <!-- ๋ชจ๋ ์ปดํฌ๋ํธ๋ UI ์๋ฆฌ๋จผํธ์ด๊ธฐ ๋๋ฌธ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. -->
<slider></slider> <!-- ์ฌ์ฉ์ ์ ์ ์๋ฆฌ๋จผํธ ์คํ์ ์ค์ํ์ง ์์์ต๋๋ค. -->
Vue.js์ ์ธ๋ผ์ธ ํํ์์ 100% ์๋ฐ์คํฌ๋ฆฝํธ์ ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋งค์ฐ ๊ฐ๋ ฅํ์ง๋ง ์๋ชป ์ฌ์ฉํ๋ฉด ๋งค์ฐ ๋ณต์กํด์ง ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํํ์์ ๋จ์ํ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ๋ณต์กํ ์ธ๋ผ์ธ ํํ์์ ์ฝ๊ธฐ ์ด๋ ต์ต๋๋ค.
- ์ธ๋ผ์ธ ํํ์์ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ค๋ณต ์ฝ๋๊ฐ ์๊ธธ ์ ์์ต๋๋ค.
- IDE๋ ๋๋ถ๋ถ ํํ์ ๋ฌธ๋ฒ์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ IDE์์ ์๋์์ฑ ํน์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ ์ ์์ต๋๋ค.
๋ง์ฝ ํํ์์ด ๋๋ฌด ๋ณต์กํ๋ค๋ฉด methods ํน์ computed ์์ฑ์ผ๋ก ์ฎ๊ธฐ์ธ์!
<!-- ๊ถ์ฅํฉ๋๋ค -->
<template>
<h1>
{{ `${year}-${month}` }}
</h1>
</template>
<script type="text/javascript">
export default {
computed: {
month() {
return this.twoDigits((new Date()).getUTCMonth() + 1);
},
year() {
return (new Date()).getUTCFullYear();
}
},
methods: {
twoDigits(num) {
return ('0' + num).slice(-2);
}
},
};
</script>
<!-- ํผํ์ธ์! -->
<template>
<h1>
{{ `${(new Date()).getUTCFullYear()}-${('0' + ((new Date()).getUTCMonth()+1)).slice(-2)}` }}
</h1>
</template>
Vue.js๋ ๋ค์ํ ์์ฑ์ ํตํด ๋ณต์กํ JavaScript ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ์ ์์ง๋ง ์ปดํฌ๋ํธ ์ต์ ์ ๊ฐ๋ฅํ ์์ ์๋ฃํ์ผ๋ก ์ ์งํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฆ, JavaScript ์์ ๊ฐ (string, number, boolean) ๋ฐ ํจ์๋ง์ ์ฌ์ฉํ๊ณ ๋ณต์กํ Object๋ ํผํ๋๊ฒ ์ข์ต๋๋ค.
- ๊ฐ๋ณ์ ์ผ๋ก
prop
์์ฑ์ ์ฌ์ฉํจ์ผ๋ก์จ ์ปดํฌ๋ํธ๋ ๋ช ํํ API๋ฅผ ๊ฐ์ง๋๋ค. - ์์ ์๋ฃํ๊ณผ ํจ์๋ง์
props
๊ฐ์ผ๋ก ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ API๊ฐ ๋ค์ดํฐ๋ธ HTML(5) ์๋ฆฌ๋จผํธ์ API์ ์ ์ฌํด์ง๋๋ค. - ๊ฐ๋ณ์ ์ผ๋ก
prop
์์ฑ์ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ปดํฌ๋ํธ ์ธ์คํด์ค๋ก ์ ๋ฌ๋๋ ๋ด์ฉ์ ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค. - ๋ณต์กํ Object๋ฅผ ์ ๋ฌํ ๋ ์ ๋ฌํ Object์ ์์ฑ๊ณผ ๋ฉ์๋๊ฐ ์ค์ ๋ก ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋๋์ง ๋ถ๋ช ํ์ง ์์ต๋๋ค. ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๊ธฐ๊ฐ ์ด๋ ค์์ง๊ณ ์ฝ๋๊ฐ ๋๋ฌ์ ์ง ์ ์์ต๋๋ค.
์์ ์๋ฃํ ํน์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ props
์ปดํฌ๋ํธ ์์ฑ์ ์ฌ์ฉํ์ธ์.
<!-- ๊ถ์ฅํฉ๋๋ค -->
<range-slider
:values="[10, 20]"
min="0"
max="100"
step="5"
:on-slide="updateInputs"
:on-end="updateResults">
</range-slider>
<!-- ํผํ์ธ์! -->
<range-slider :config="complexConfigObject"></range-slider>
Vue.js์์๋ ์ปดํฌ๋ํธ props๊ฐ ๋น์ ์ API ์ ๋๋ค. ๊ฐ๋ ฅํ๊ณ ์์ธก๊ฐ๋ฅํ API๋ฅผ ๋ง๋ค๋ฉด ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ปดํฌ๋ํธ props๋ ์ฌ์ฉ์ ์ ์ HTML ์ดํธ๋ฆฌ๋ทฐํธ์ ์ํด ์ ๋ฌ๋ฉ๋๋ค. ์ด๋ฌํ ์ดํธ๋ฆฌ๋ทฐํธ์ ๊ฐ์ Vue.js ์ผ๋ฐ ๋ฌธ์์ด(:attr="value"
๋๋ v-bind:attr="value"
)์ด๊ฑฐ๋ ๋๋ฝ๋ฉ๋๋ค. ๋น์ ์ ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ์ฌ ๋น์ ์ ์ปดํฌ๋ํธ props๋ฅผ ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ปดํฌ๋ํธ props๋ฅผ ์ ์ฌ์ฉํ๋ฉด ๋น์ ์ ์ปดํฌ๋ํธ๋ ํญ์ ์๋ํ ๊ฒ ์ ๋๋ค(๋ฐฉ์ด์ ํ๋ก๊ทธ๋๋ฐ). ๋์ค์ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๋น์ ์ด ์๊ฐํ์ง ๋ชปํ ๋ฐฉ๋ฒ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ๋ง์ฐฌ๊ฐ์ง ์ ๋๋ค.
- props์ ๊ธฐ๋ณธ ๊ฐ์ ์ฌ์ฉํ์ธ์.
- ๊ฐ์ validate ํ๊ธฐ์ํด
type
์ต์ ์ ์ฌ์ฉํ์ธ์. [1*] - ์ค๋ณต๋
props
๊ฐ ์๋์ง ํ์ธํ์ธ์.
<template>
<input type="range" v-model="value" :max="max" :min="min">
</template>
<script type="text/javascript">
export default {
props: {
max: {
type: Number, // [1*] 'max' prop์ Number๋ก๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
default() { return 10; },
},
min: {
type: Number,
default() { return 0; },
},
value: {
type: Number,
default() { return 4; },
},
},
};
</script>
Vue.js ์ปดํฌ๋ํธ ์๋ฆฌ๋จผํธ์ ์ปจํ
์คํธ ๋ด์์ this
๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค์ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋ค๋ฅธ ์ปจํ
์คํธ์์ ๊ทธ๊ฒ์ ์ฐธ์กฐํ ํ์๊ฐ ์์ ๋ this
๋ฅผ component
๋ก์จ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
๋ค๋ฅธ ๋ง๋กํ๋ฉด ๋์ด์ const self = this;
์ ๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง ๋ง์ธ์. Vue ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ํฉ๋๋ค.
this
๋ฅผcomponent
๋ผ๋ ๋ณ์์ ์ง์ ๋จ์ผ๋ก์จ ๊ฐ๋ฐ์์๊ฒ ๋ณ์๊ฐ ์ฌ์ฉ๋๋ ๊ณณ๋ง๋ค ์ปดํฌ๋ํธ ์ธ์คํด์ค์ ๋ฐ์ธ๋ฉ๋์๋ค๋ ๊ฒ์ ์๋ ค์ค๋๋ค.
<script type="text/javascript">
export default {
methods: {
hello() {
return 'hello';
},
printHello() {
console.log(this.hello());
},
},
};
</script>
<!-- ํผํ์ธ์! -->
<script type="text/javascript">
export default {
methods: {
hello() {
return 'hello';
},
printHello() {
const self = this; // ๋ถํ์ํฉ๋๋ค.
console.log(self.hello());
},
},
};
</script>
์๊ฐ์ ์์๋ฅผ ๋ฐ๋ผ ์ปดํฌ๋ํธ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด๋ณด์ธ์. ์ด๋ป๊ฒ ํ๋์?
๋ฅผ ์ฐธ๊ณ ํ์ธ์.
- ์ปดํฌ๋ํธ๋ฅผ ๋ช
ํํ๊ณ ๊ทธ๋ฃนํํ์ฌ
export
ํ๋ฉด ๊ฐ๋ฐ์๊ฐ ์ฝ๊ฒ ํ์ค์ ์ธ ์ฝ๋์ ๋ํด์ ์ดํดํ๊ณ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. - ์์ฑ, ๋ฐ์ดํฐ, ๊ณ์ฐ๋ ์์ฑ, ๊ฐ์์ ๋ฐ ๋ฉ์๋๋ฅผ ์ํ๋ฒณ์์ผ๋ก ํ์ํ๋ฉด ์ฝ๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
- ๋ค์๋งํด, ๊ทธ๋ฃนํํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ๋ ์ฝ๊ฒ ์ฝ์ ์ ์์ต๋๋ค. (name; extends; props; data์ computed; components; watch์ method; ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋ ๋ฑ)
name
์์ฑ์ ์ฌ์ฉํ์ธ์. vue devtools๊ณผ ๊ทธ ์์ฑ์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ/ํ ์คํธ๊ฐ ๋ ์ฌ์์ง๋๋ค.- BEM ๋๋ rscss์ ๊ฐ์ CSS ๋ค์ด๋ฐ ๊ท์น์ ์ฌ์ฉํ์ธ์. - ์์ธํ ๋ณด๊ธฐ
- Vue.js ์์ฑ์(Evan You)๊ฐ ๊ถ์ฅํ๋ ํ ํ๋ฆฟ ์คํฌ๋ฆฝํธ ์คํ์ผ์ธ .vue ํ์ผ์ ์ฌ์ฉํ์ญ์์ค.
์๋ ์ปดํฌ๋ํธ ๊ตฌ์กฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
<template lang="html">
<div class="Ranger__Wrapper">
<!-- ... -->
</div>
</template>
<script type="text/javascript">
export default {
// ์ด๋ฆ ์ ๋ ๊ฒ์ ์์ง๋ง์ธ์
name: 'RangeSlider',
// compose new components
extends: {},
// ์ปดํฌ๋ํธ ์ดํธ๋ฆฌ๋ทฐํธ ๊ทธ๋ฃน
props: {
bar: {}, // ์ํ๋ฒณ์์ผ๋ก ์ ๋ ฌํฉ๋๋ค
foo: {},
fooBar: {},
},
// ์ปดํฌ๋ํธ ๋ณ์ ๊ทธ๋ฃน
data() {},
computed: {},
// ์ปดํฌ๋ํธ๊ฐ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
components: {},
// ์ปดํฌ๋ํธ ๋ฉ์๋ ๊ทธ๋ฃน
watch: {},
methods: {},
// ์ปดํฌ๋ํธ ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋ ๊ทธ๋ฃน
beforeCreate() {},
mounted() {},
};
</script>
<style scoped>
.Ranger__Wrapper { /* ... */ }
</style>
Vue.js๋ ๋ชจ๋ Vue ํธ๋ค๋ฌ ํจ์๋ฅผ ์ ๊ณตํ๋ฉฐ ํํ์์ ViewModel์ ์๊ฒฉํ๊ฒ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค. ๊ฐ ์ปดํฌ๋ํธ ์ด๋ฒคํธ๋ ๊ฐ๋ฐ ๋์ค ๋ฌธ์ ๋ฅผ ํผํ ์์๋ ์ข์ ๋ค์ด๋ฐ ์คํ์ผ์ ๋ฐ๋ผ์ผํฉ๋๋ค. ์๋ **์ ๊ทธ๋ ๊ฒ ํ๋์?**๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
- ๊ฐ๋ฐ์๊ฐ ์ด๋ฒคํธ ์ด๋ฆ์ ์์ ๋กญ๊ฒ ์์ฑํ ๊ฒฝ์ฐ ํผ๋์ ๋ฐ์์ํฌ ์ ์์ต๋๋ค.
- ์ด๋ฒคํธ ์ด๋ฆ์ ์์ ๋กญ๊ฒ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ DOM ํ ํ๋ฆฟ์ ๋น ํธํ์ฑ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ด๋ฒคํธ ์ด๋ฆ์
kebab-cased
์ฌ์ผ ํฉ๋๋ค(ํ์ดํ์ผ๋ก ๊ตฌ๋ถ). - ํน๋ณํ ์ด๋ฒคํธ ์ด๋ฆ์
upload-success
,upload-error
๋๋dropzone-upload-success
,dropzone-upload-error
(๋ง์ฝ ๋ฒ์๊ฐ ์ง์ ๋ ์ ๋์ด๊ฐ ํ์ํ๋ค๋ฉด)์ ๊ฐ์ด ์ธ๋ถ ์ธ๊ณ์ ๊ด์ฌ์ ๊ฐ์ง ์ ์๋ ์ปดํฌ๋ํธ์ ํน๋ณํ ๋์์ ๋ํด ์คํ๋์ผ ํฉ๋๋ค. - ์ด๋ฒคํธ๋ ๋ถ์ ์ฌ์ ํํ(e.g. client-api-load)์ด๊ฑฐ๋ ๋ช ์ฌ(e.g. drive-upload-success)์์ ๋์ฌ๋ก ๋๋์ผ ํฉ๋๋ค. (์ถ์ฒ)
Vue.js๋ ๋ถ๋ชจ ์ปจํ
์คํธ์ ์ ๊ทผ ํ ์ ์๋ ์ค์ฒฉ ์ปดํฌ๋ํธ๋ฅผ ์ง์ํฉ๋๋ค. ํ์ง๋ง Vue ์ปดํฌ๋ํธ ์ธ๋ถ์ ์ปจํ
์คํธ์ ์ ๊ทผํ๋ฉด ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ฐ๋ฐ์ FIRST ๊ท์น์ ์๋ฐํ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ this.$parent
๋ฅผ ์ฌ์ฉ์ ํผํด์ผํฉ๋๋ค.
- Vue ์ปดํฌ๋ํธ๋ ๋ค๋ฅธ ๋ชจ๋ ์ปดํฌ๋ํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํด์ผํฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ถ๋ชจ์ ์ ๊ทผํด์ผํ ๊ฒฝ์ฐ ์ด ๊ท์น์ ๋ฌด๋์ง๊ฒ ๋ฉ๋๋ค.
- ์ปดํฌ๋ํธ๊ฐ ๋ถ๋ชจ์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ดํธ๋ฆฌ๋ทฐํธ/ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ์์ ์์ ์ปดํฌ๋ํธ๋ก ๊ฐ์ ์ ๋ฌํฉ๋๋ค.
- ์ดํธ๋ฆฌ๋ทฐํธ ํํ์์์ ์ฝ๋ฐฑ์ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ ์๋ ๋ฉ์๋๋ฅผ ์์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ์ญ์์ค.
- ์์ ์ปดํฌ๋ํธ์์ ์ด๋ฒคํธ๋ฅผ
emit
ํ์ฌ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํต๋๋ค.
Vue.js๋ ์ปดํฌ๋ํธ๊ฐ ref
์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ํตํด ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ๊ธฐ๋ณธ HTML ์๋ฆฌ๋จผํธ์ ์ ๊ทผ ํ ์ ์๋๋ก ์ง์ํฉ๋๋ค. ์ด ์ดํธ๋ฆฌ๋ทฐํธ๋ this.$refs
๋ฅผ ํตํด ์ปดํฌ๋ํธ ๋๋ DOM ์๋ฆฌ๋จผํธ์ ์ ๊ทผ ํ ์ ์๊ฒ ํด์ค๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ this.$refs
๋ฅผ ํตํด ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ ๊ทผํ๋ ๊ฒ์ ํผํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์๋ชป๋ ์ปดํฌ๋ํธ API๋ฅผ ํผํ๊ธฐ ์ํด์ ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผํฉ๋๋ค.
- Vue ์ปดํฌ๋ํธ๋ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํด์ผํฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ํ์ํ ๋ชจ๋ ์ ๊ทผ์ ์ง์ํ์ง ์์ผ๋ฉด ์๋ชป ์ค๊ณ/๊ตฌํ๋ ๊ฒ ์ ๋๋ค.
- ๋๋ถ๋ถ์ ์ปดํฌ๋ํธ๋ ํ๋กํผํฐ์ ์ด๋ฒคํธ๊ฐ ์ถฉ๋ถํด์ผํฉ๋๋ค.
- ์ข์ ์ปดํฌ๋ํธ API๋ฅผ ์์ฑํฉ๋๋ค.
- ํญ์ ์ปดํฌ๋ํธ์ ๋ชฉ์ ์ ๋ฒ์ด๋์ง ์๋๋ก ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
- ํน์ ํ ์ฝ๋(์: ํน์ ๋๋ฐ์ด์ค์ ๊ดํ ์ฝ๋)๋ฅผ ์ฐ์ง ๋ง์ญ์์ค. ์ผ๋ฐ์ ์ธ ์ปดํฌ๋ํธ ๋ด์ ํน์ ํ ์ฝ๋๋ฅผ ์์ฑํด์ผํ๋ ๊ฒฝ์ฐ ํด๋น API๊ฐ ์ถฉ๋ถํ ์ผ๋ฐ์ ์ธ ๊ฒ์ด ์๋๊ฑฐ๋ ์ ์ปดํฌ๋ํธ๊ฐ ํ์ํ ์๋ ์์์ ์๋ฏธํฉ๋๋ค.
props
๋ฅผ ๋ชจ๋ ๊ฒ์ฌํ์ฌ ๋์น ๋ถ๋ถ์ด ์๋์ง ํ์ธํ์ธ์. ๋ง์ฝ ๋์น ๋ถ๋ถ์ด ์๋ค๋ฉด ์ด์๋ฅผ ๋ง๋ค๊ฑฐ๋ ์ง์ ์ปดํฌ๋ํธ๋ฅผ ์์ ํ์ธ์.- ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ํ์ธํ์ธ์. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๋ ์์์์ ๋ถ๋ชจ๋ก์ ํต์ (์ด๋ฒคํธ)ํ๋ ๊ฒ์ด ํ์ํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๊ทธ ์ด์ ๋ ๋ถ๋ชจ์์ ์์์ผ๋ก์ ํต์ (
props
์ฌ์ฉ)๋ง ๊ธฐ์ตํ๊ธฐ ๋๋ฌธ์ ๋๋ค. props
๋ ์๋๋ก, ์ด๋ฒคํธ๋ ์๋ก! ์ข์ API์ ๋ถ๋ฆฌ๊ฐ ํ์ํ ๋ ๋น์ ์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ํ์ธ์.props
์ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ํ๋ค๊ณref
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๋ ๊ฒฝ์ฐ ์ปดํฌ๋ํธ์this.$refs
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. (์๋ ์์ ๋ฅผ ์ฐธ๊ณ ํ์ธ์)- ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด๋ ๋๋ ํฐ๋ธ๋ก ์กฐ์ํ ์ ์๋ ๊ฒฝ์ฐ DOM ์๋ฆฌ๋จผํธ์ ์ ๊ทผํ๊ธฐ ์ํด
jQuery
,document.getElement*
,document.queryElement
๋ฅผ ์ฌ์ฉํ๋ ๋์this.$refs
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค.
<!-- ์ข์์, ref๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋ฉ๋๋ค -->
<range :max="max"
:min="min"
@current-value="currentValue"
:step="1"></range>
<!-- this.$refs๋ฅผ ์ฌ์ฉํ๋ ์ข์ ์์ ์
๋๋ค -->
<modal ref="basicModal">
<h4>Basic Modal</h4>
<button class="primary" @click="$refs.basicModal.close()">Close</button>
</modal>
<button @click="$refs.basicModal.open()">Open modal</button>
<!-- Modal ์ปดํฌ๋ํธ -->
<template>
<div v-show="active">
<!-- ... -->
</div>
</template>
<script>
export default {
// ...
data() {
return {
active: false,
};
},
methods: {
open() {
this.active = true;
},
hide() {
this.active = false;
},
},
// ...
};
</script>
<!-- `emit`์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค๋ฉด ํผํ์ธ์! -->
<template>
<range :max="max"
:min="min"
ref="range"
:step="1"></range>
</template>
<script>
export default {
// ...
methods: {
getRangeCurrentValue() {
return this.$refs.range.currentValue;
},
},
// ...
};
</script>
Vue.js ์ปดํฌ๋ํธ ์๋ฆฌ๋จผํธ๋ ๋ฒ์ ์คํ์ผ์ ๋ฃจํธ๋ก ์ ์ฌ์ฉ ๋ ์ ์๋ ์ฌ์ฉ์ ์ง์ ์๋ฆฌ๋จผํธ์ ๋๋ค. ๋ํ ์ปดํฌ๋ํธ ์ด๋ฆ์ CSS ํด๋์ค ๋ค์์คํ์ด์ค๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ปดํฌ๋ํธ์ ๋ฒ์ ์คํ์ผ์ ์ ์ฉํ๋ฉด ์ปดํฌ๋ํธ ์ธ๋ถ์ ์คํ์ผ์ด ์ ์ฉ๋์ง ์์ผ๋ฏ๋ก ์์ธก ๊ฐ๋ฅ์ฑ์ด ํฅ์๋ฉ๋๋ค.
- Vue.js ์ปดํฌ๋ํธ์ ์คํ์ผ์ ๋ฃจํธ ์ด๋ฆ๋ฅผ ๋ชจ๋ ๋๋ ํ ๋ฆฌ์ ๋์ผํ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๊ฐ ์ดํดํ๊ธฐ ์ข ๋ ์ฝ์ต๋๋ค.
BEM ๋ฐ OOCSS์ ๊ธฐ๋ฐํ ๋ค์์คํ์ด์ค ์ ๋์ด๋ก ์ปดํฌ๋ํธ ์ด๋ฆ์ ์ฌ์ฉํ๊ณ style
์ scoped
์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ฉํ์ธ์.
scoped
๋ฅผ ์ฌ์ฉํ๋ฉด Vue ์ปดํ์ผ๋ฌ๋ <style>
์ด ๊ฐ์ง ๋ชจ๋ ํด๋์ค์ ํน์ ์๋ช
์ ์ถ๊ฐํฉ๋๋ค. ์ด ์๋ช
์ ๋ธ๋ผ์ฐ์ ๊ฐ(์ง์ํ๋ค๋ฉด) ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ฑํ๋ ๋ชจ๋ ํ๊ทธ์ ์ปดํฌ๋ํธ CSS๋ฅผ ์ ์ฉํ๊ณ CSS๊ฐ ๋์ถ๋์ง ์๋๋ก ๋์์ค๋๋ค.
<style scoped>
/* ๊ถ์ฅํฉ๋๋ค */
.MyExample { }
.MyExample li { }
.MyExample__item { }
/* ํผํ์ธ์! */
.My-Example { } /* ์ปดํฌ๋ํธ๋ ๋ชจ๋ ์ด๋ฆ์ผ๋ก scoped๊ฐ ์ง์ ๋์ง ์๊ณ BEM ๋ฌธ๋ฒ๊ณผ ์ผ์นํ์ง ์์ต๋๋ค. */
</style>
Vue.js ์ปดํฌ๋ํธ ์ธ์คํด์ค๋ ์ดํ๋ฆฌ์ผ์ด์
๋ด๋ถ์ ์ปดํฌ๋ํธ ์๋ฆฌ๋จผํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ง๋ญ๋๋ค. ์ธ์คํด์ค๋ ์ฌ์ฉ์ ์ ์ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ํตํด ๊ตฌ์ฑ๋ฉ๋๋ค. ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ ์ฌ์ฉ์ ์ง์ ์ดํธ๋ฆฌ๋ทฐํธ(์ปดํฌ๋ํธ์ API)๋ฅผ README.md
ํ์ผ์ ๋ฌธ์ํํด์ผํฉ๋๋ค.
- ๋ฌธ์๋ ๊ฐ๋ฐ์๊ฐ ์ฝ๋ ์ ์ฒด๋ฅผ ๊ฒํ ํ ํ์ ์์ด ์ปดํฌ๋ํธ์ ๋ํ ๊ฐ๋ตํ ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฌธ์๋ฅผ ๋ง๋ค๋ฉด ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ์ ๊ทผํ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ปดํฌ๋ํธ์ API๋ ์ฌ์ฉ์ ์ง์ ์ดํธ๋ฆฌ๋ทฐํธ์ ์งํฉ์ ํตํด ๊ตฌ์ฑ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ด๊ฒ๋ค์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ๋ (๋ค์ ๊ฐ๋ฐํ์ง ์์น ์๋) ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์๊ฒ ์ค์ํฉ๋๋ค.
- ๋ฌธ์๋ API๋ฅผ ํ์์ ๊ฐ์ถ๊ฒํ๊ณ ๊ฐ๋ฐ์์๊ฒ ์ปดํฌ๋ํธ์ ์ฝ๋๋ฅผ ์์ ํ ๋ ํ์ ํธํ์ฑ์ ์ ์งํ ์ ์๋๋ก ๋์ต๋๋ค.
README.md
๋ ๋จผ์ ์ฝ์ด์ผํ ๋ฌธ์๋ฅผ ์ํ ์ฌ์ค์ ํ์ค์ ์ธ ํ์ผ๋ช ์ ๋๋ค. ์ฝ๋ ์ ์ฅ์๋ฅผ ํธ์คํ ํ๋ ์๋น์ค(Github, Bitbucket, Gitlab ๋ฑ)๋ ์์ค ๋๋ ํ ๋ฆฌ๋ฅผ ํ์ํ ๋ README.md ํ์ผ์ ๋ด์ฉ์ ํ์ํฉ๋๋ค. ์ด๊ฒ์ ๋ชจ๋ ๋๋ ํ ๋ฆฌ์๋ ๋๊ฐ์ด ์ ์ฉ๋ฉ๋๋ค.
README.md
๋ฌธ์๋ฅผ ์ปดํฌ๋ํธ์ ๋ชจ๋ ๋๋ ํ ๋ฆฌ์ ์ถ๊ฐํ์ธ์.
range-slider/
โโโ range-slider.vue
โโโ range-slider.less
โโโ README.md
README.md
ํ์ผ์์ ๋ชจ๋์ ๊ธฐ๋ฅ ๋ฐ ์ฌ์ฉ๋ฒ์ ์ ์ผ์ธ์. Vue ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ API์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ง์ํ๋ ์ฌ์ฉ์ ์ ์ ์ดํธ๋ฆฌ๋ทฐํธ์ ๋ํด์ ์ค๋ช
ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ฒ์ ์ฌ๋ผ์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ผ์ด๋ ํธ๋ค์ ๋๋๊ทธํ์ฌ ์์๊ณผ ๋ ๊ฐ๋ด์ ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.
์ด ๋ชจ๋์ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง ๋ฐ ํฐ์น ์ง์์ ์ํด์ noUiSlider๋ฅผ ์ฌ์ฉํฉ๋๋ค.
<range-slider>
๋ ๋ค์๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ง์ํฉ๋๋ค :
์ดํธ๋ฆฌ๋ทฐํธ | ํ์ | ์ค๋ช |
---|---|---|
min |
Number | ๋ฒ์๊ฐ ์์๋๋ ๊ฐ (์ต์๊ฐ). |
max |
Number | ๋ฒ์๊ฐ ๋๋๋ ๊ฐ (์ต๋๊ฐ). |
values |
Number[] optional | ์์๊ณผ ๋๊ฐ์ ํฌํจํ๋ ๋ฐฐ์ด. ์) values="[10, 20]" . ๊ธฐ๋ณธ๊ฐ์ [opts.min, opts.max] ์
๋๋ค. |
step |
Number optional | ์ซ์๋ฅผ ์ฆ๊ฐ/๊ฐ์ ์ํฌ ๊ฐ. ๊ธฐ๋ณธ๊ฐ์ 1์ ๋๋ค. |
on-slide |
Function optional | ์ฌ์ฉ์๊ฐ ์์(HANDLE == 0 ) ๋๋ ๋(HANDLE == 1 )์ ํธ๋ค์ ์์นํ๋ฉด ํธ์ถ๋๋ ํจ์ํ๋๋ค. ์) on-slide={ updateInputs } , component.updateInputs = (values, HANDLE) => { const value = values[HANDLE]; } . |
on-end |
Function optional | ์ฌ์ฉ์๊ฐ ํธ๋ค ๋๋๊ทธ๋ฅผ ๋ฉ์ถ๋ฉด (values, HANDLE) ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค. |
์ฌ๋ผ์ด๋ ๋ชจ์์ ์ฌ์ฉ์ ์ ์ํ๋ ค๋ฉด noUiSlider ๋ฌธ์์ Styling ์น์ ์ ์ฐธ๊ณ ํ์ธ์.
index.html
ํ์ผ์ ์ถ๊ฐํ์ฌ ์ปดํฌ๋ํธ์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
- ์ปดํฌ๋ํธ ์์ ๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํจ์ ์ฆ๋ช ํฉ๋๋ค.
- ์ปดํฌ๋ํธ ์์ ๋ฅผ ์์ฑํ๋ฉด ๊ฐ๋ฐ์๊ฐ ๋ฌธ์ ๋๋ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ธฐ ์ ์ ์๋ ๋ชจ์ต์ ํ์ธ ํ ์ ์์ต๋๋ค.
- ์ปดํฌ๋ํธ ์์ ๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ์ค์ ์ ๋ณด์ฌ์ค๋๋ค.
Lint๋ ์ฝ๋ ์ผ๊ด์ฑ์ ๊ฐ์ ํ๊ณ ๊ตฌ๋ฌธ ์ค๋ฅ๋ฅผ ์ถ์ ํ๋ ๊ฒ์ ๋์์ค๋๋ค. .vue
ํ์ผ์ ํ๋ก์ ํธ์ eslint-plugin-html
์ ๋น์ ์ ํ๋ก์ ํธ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋ง์ฝ ์ฌ์ฉํ๊ธธ ์ํ๋ฉด ๋น์ ์ vue-cli
๋ฅผ ์ฌ์ฉํ์ฌ ESLint๊ฐ ํ์ฑํ๋ ํ๋ก์ ํธ๋ฅผ ์์ํ ์ ์์ต๋๋ค.
- ์ปดํฌ๋ํธ ํ์ผ์ Lintํ๋ฉด ๋ชจ๋ ๊ฐ๋ฐ์๊ฐ ๋์ผํ ์ฝ๋ ์คํ์ผ์ ์์ฑํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์ปดํฌ๋ํธ ํ์ผ์ Lintํ๋ฉด ๊ตฌ๋ฌธ ์ค๋ฅ๋ฅผ ๋น ๋ฅด๊ฒ ์์ ํ ์ ์์ต๋๋ค.
Lint๊ฐ *.vue
ํ์ผ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ์ถํ ์ ์๋๋ก ํ๋ ค๋ฉด ์คํฌ๋ฆฝํธ๋ฅผ ์ปดํฌ๋ํธ์ <script>
์์ ๋ฃ๊ณ ์ปดํฌ๋ํธ์ ํํ์์ ๋จ์ํ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค(Lint๊ฐ ํํ์์ ์ดํดํ์ง ๋ชปํฉ๋๋ค). ๊ทธ๋ฆฌ๊ณ Lint์ ๊ธ๋ก๋ฒ ๋ณ์ vue
์ ์ปดํฌ๋ํธ props
๋ฅผ ํ์ฉํ๋๋ก ์ค์ ํด์ผํฉ๋๋ค.
ESLint๋ ์ปดํฌ๋ํธ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ์ถํ๊ธฐ ์ํด์ ESLint HTML ํ๋ฌ๊ทธ์ธ์ด ํ์ํฉ๋๋ค.
.eslintrc
ํ์ผ์ ์์ฑํ์ฌ ESLint๋ฅผ ์ค์ ํ์ธ์. (IDE๋ ๊ทธ๊ฒ์ ํด์ํ ์ ์์ต๋๋ค)
{
"extends": "eslint:recommended",
"plugins": ["html"],
"env": {
"browser": true
},
"globals": {
"opts": true,
"vue": true
}
}
ESLint๋ฅผ ์คํํด๋ณด์ธ์.
eslint src/**/*.vue
JSHint์ --extra-ext
๋ฅผ ์ฌ์ฉํ์ฌ HTML์ ํ์ฑํ๊ณ --extract=auto
๋ฅผ ์ฌ์ฉํ์ฌ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ์ถํ ์ ์์ต๋๋ค.
0
.jshintrc
ํ์ผ์ ์์ฑํ์ฌ JSHint๋ฅผ ์ค์ ํ์ธ์. (IDE๋ ๊ทธ๊ฒ์ ํด์ํ ์ ์์ต๋๋ค)
{
"browser": true,
"predef": ["opts", "vue"]
}
JSHint๋ฅผ ์คํํด๋ณด์ธ์.
jshint --config modules/.jshintrc --extra-ext=html --extract=auto modules/
์ฐธ๊ณ : JSHint๋ vue
๋ฅผ ํ์ฅ์๋ก ์ฌ์ฉํ์ง ์๊ณ html
๋ง์ ์ฌ์ฉํฉ๋๋ค.
์ ์ฅ์๋ฅผ Forkํ๊ณ Pull Request๋ฅผ ๋ณด๋ด์ฃผ์๊ฑฐ๋ ์ด์๋ฅผ ์์ฑํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
- ํ๊ตญ์ด: Lee Sun-Hyoup github:kciter, facebook: sunhyoup.lee
- ๋ธ๋ผ์ง ํฌ๋ฅดํฌ๊ฐ์ด: Pablo Henrique Silva github:pablohpsilva, twitter: @PabloHPSilva
- ๋ฌ์์์ด: Mikhail Kuznetcov github:shershen08, twitter: @legkoletat