import * as Vue from 'vue'
: 상대 경로가 없는 import ... node_modules 에 설치한 패키지에서 가지고 오는 방법* as
... 패키지의 내용을 전부 가져오도록 함npm i -D parcel
"dev": "parcel ./src/index.html"
... index.html 을 parcel 의 진입점으로 설정npm run dev
... 개발 서버로 오픈"build": "parcel build ./src/index.html"
... 배포용으로 결과물을 만들 때 ("main" 과 충돌 ... "main" 을 지워도 무방)src/
... 개발용 파일이 담긴 폴더dist/
... vue 를 js 로 변환한 브라우저 해석 / 배포용 파일이 담긴 폴더npm init -y
npm i -D webpack webpack-cli
... cli(command line interface / 터미널 동작 커맨드를 의미)"build": "webpack"
const path = require('path')
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, 'dist')
}
}
// entry: 어떤 파일로 진입해서 해석할 것인지
// output: 해석이 완료된 후에는 어디에 결과물을 반환할 것인지
// __dirname: 현재 webpack.config.js 의 경로 정보를 가지고 있는 node.js 의 전역 변수
loader
필요npm i -D vue-loader@next
(vue-loader 는 vue 2 버전)// ----- webpack.config.js -----
const { VueLoaderPlugin } = require('vue-loader')
module.exports = {
entry: '...',
output: {
...
},
module: {
rules: [
{
test: /\.vue$/, // .vue 로 끝나는 파일만 찾음
use: 'vue-loader'
}
]
},
plugins: {
new VueLoaderPlugin()
}
npm i -D @vue/compiler-sfc
... vue-loader 를 통해 로드한 후, vue 컴파일러가 필요함"build": "webpack --mode production"
... 제품화(난독화) 명령 (개발서버 오픈 x)npm i -D html-webpack-plugin
const HtmlPlugin = require('html-webpack-plugin')
...
plugins: [
new HtmlPlugin({
template: path.resolve(__dirname, 'src/index.html')
// webpack 이 해석해야하는 html 파일이 어디에 있는지?
})
]
clean: true
를 추가하면, 빌드할 때마다 dist 의 기존 파일을 제거하고 빌드하여 파일 섞임을 방지할 수 있다.npm i -D webpack-dev-server
... 개발 서버를 열기 위한 패키지"dev": "webpack-dev-server --mode development"
devServer: { port: 1234 }
와 같이 변경할 수 있다.npm i -D css-loader vue-style-loader
npm i -D sass sass-loader
npm i -D copy-webpack-plugin
npm i -D eslint eslint-plugin-vue
import
로 해당 컴포넌트를 불러오고, components
에 등록 후 사용하는 방식v-bind
로 전달 가능$attrs
객체를 통해 원하는 곳에 명시를 해주어야 함.inheritAttrs: false
를 통해 속성에 대한 상속을 받지 않을 수 있다.emits:
를 통해 컴포넌트에서 커스텀 이벤트를 등록$emit()
: 기본적으로 props 에서 받아온 상위 컴포넌트의 데이터는 하위 컴포넌트에서 수정이 불가함 ... emit 을 이용하여 상위 컴포넌트까지 수정이 가능해짐 / 자식에서 부모로 이벤트를 발생시킴<Hello
:message="msg"
@update="msg = $event" />
// ...
<input
:value="message"
@input="$emit('update', $event.target.value)" />
:is
keep-alive
를 통해서 이를 방지할 수 있음ref="hello"
, const h1El = this.$refs.hello
와 같이 바로 참조하여 사용할 수 있다.$refs
는 mounted()
라이프 사이클에서 사용할 수 있다. webpack 은 기본 세팅부터 패키지 설치, 설정을 해야할 게 많아서 프로젝트마다 언제 다 셋팅할까.. 라는 생각이 들었지만 github 에 default 세팅을 올려두고 프로젝트를 시작할 때마다 내려받아서 위에서 작업하면 되는 것이었다.
컴포넌트가 생길때마다 상위 컴포넌트 - 하위 컴포넌트 간의 데이터를 주고 받는 과정을 잘 학습해야겠다.