🕵️ Vue/Cli 를 사용하여 vue.config.js 세팅을 하게되어 속성의 기능과 옵션을 숙지하기 위해 글을 쓰게 되었다. 주로 쓰는 속성을 업로드하고 추후 추가적인 기능이나 시간이 난다면 속성을 더 업데이트 할 예정이다.
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true
})
Type
: string
Default
: '/'
module.exports = defineConfig({
...
publicPath: '/my-app/', // default '/'
...
})
Vue CLI 프로젝트에서 애플리케이션이 배포될 기본 경로를 설정하는 데 사용된다. 이 속성은 애플리케이션의 모든 정적 자원에 대한 기본 URL을 지정한다. 기본적으로 /
로 설정되어 있지만, 애플리케이션이 서브 디렉토리에 배포될 경우 이 값을 변경해야 한다.
ex ) https://example.com/my-app/
에 배포될 경우 publicPath
를 /my-app/
으로 설정해야 한다.
Type
: boolean
| Array<string | RegExp>
Default
: false
특정 종속성을 Babel을 사용하여 트랜스파일링하도록 지정하는 데 사용된다.
이는 주로 ES6+ 코드를 포함하는 외부 라이브러리나 모듈을 호환성 문제 없이 사용하기 위해 필요하다. 기본적으로 node_modules
폴더 내의 파일들은 Babel의 트랜스파일링 대상에서 제외되지만, transpileDependencies
에 명시된 종속성은 예외로 처리된다.
위 📄기본 vue.config.js
에서는 true
로만 되어있는데 저 상태는 transpileDependencies
옵션이 활성화 되었음을 나타내고 실제로 사용할 때 배열로 명시한다.
module.exports = defineConfig({
...
transpileDependencies: [
'some-dependency',
'another-dependency'
],
...
})
Type
: Object
module.exports = defineConfig({
...
devServer: {
...
}
...
})
hot 설정
Hot Module Replacement(또는 HMR)는 webpack에서 제공하는 가장 유용한 기능 중 하나이다.
모든 종류의 모듈을 전체 새로 고침 없이 런타임에 업데이트할 수 있다.
devServer: {
...
+ hot: true,
...
},
Vue CLI에서의 진입점
Vue CLI 프로젝트에서는 기본적으로 src/main.js
또는 main.ts
파일이 진입점으로 설정된다. Vue CLI는 내부적으로 Webpack을 사용하여 이 파일을 진입점으로 설정하고 번들링한다.
수동으로 진입점을 설정하려면 직접 경로를 설정해도 된다.
entry: {
app: './src/index.js',
},
🕵️ HMR의 기능
맨처음에 그냥 true
, false
로만 설정을 하니 직접 어떤기능인지 정확하게 와닿지가 않았다.
기존 프로젝트에서 true
, false
로 실행한 결과
true
일 때 해당 코드의 관련된 부분만 바로 업데이트만 되었고
false
일 때는 새로고침이 되었다.
Type
: string
| Object
프론트엔드 앱과 백엔드 API 서버가 동일한 호스트에서 실행되지 않는 경우 개발 중에 API 요청을 API 서버로 프록시해야 하고 devServer.proxy
의 옵션을 통해 구성할 수 있다.
module.exports = {
devServer: {
proxy: 'http://localhost:4000'
}
}
이렇게 하면 개발 서버는 알 수 없는 요청(정적 파일과 일치하지 않는 요청)을 프록시로 처리하게 된다.
⚠️ 설정이 위와 같이 문자열로 설정된 경우에 발생할 수 있다. 문자열로 설정된 경우, Webpack Dev Server는 XHR(XMLHttpRequest) 요청만 프록시한다. 즉, 브라우저에서 직접 API URL을 열려고 하면 프록시가 작동하지 않을 수 있다. 대신 Postman과 같은 API 도구를 사용하여 API 요청을 테스트해야 한다.
🕵️ CORS에러가 뜨거나 작동하지 않을 경우
path: options
쌍이 있는 객체를 사용할 수도 있다.
module.exports = {
devServer: {
proxy: {
'/api/foo': {
target: 'https://example_foo.com',
changeOrigin: true
},
'/api/bar': {
target: 'https://example_bar.com',
changeOrigin: true
},
...
}
}
}
changeOrigin
속성을 사용하면 브라우저에서도 정상적으로 프록시가 작동한다. 프록시 요청의 Host
헤더를 대상 서버의 호스트로 변경하여 CORS
문제를 해결하는 데 도움이 된다.
예를 들어 getFooList
라는 함수로 데이터를 갖고오는 예시이다.
export const getFooList = () => {
return axios.get('/api/foo/list')
};
proxy
의 키값인 '/api/foo'
로 시작하므로 /api/foo
경로로 들어오는 요청은 target
인 https://example_foo.com
로 프록시된다. 두번째 /api/bar
도 마찬가지
CSS 모듈은 CSS 파일을 로컬 스코프로 제한하여 클래스 이름 충돌을 방지하는 기술이다.
이를 통해 각 컴포넌트의 스타일이 고유하게 유지되며, 전역 네임스페이스 오염을 방지할 수 있다.
주요 특징
기본적으로 간단하게 scoped
를 사용해도 되지만 해당 하위 컴포넌트는 독립적이지 않으므로 같은 클래스를 쓴다면 적용이 된다.
1. Vue 컴포넌트에서 CSS 모듈 바로 사용 <style module>
태그 사용
<template>
<button :class="$style.button">Click me</button>
</template>
<style module>
.button {
background-color: blue;
color: white;
}
</style>
2. CSS 모듈을 import 해서 사용
<template>
<button :class="styles.button">Click me</button>
</template>
<script>
import styles from '@/styles/foo.module.css';
export default {
computed: {
styles() {
return styles;
}
}
}
</script>
.module
파일 이름을 추가하고 모든 스타일 파일을 CSS 모듈로 처리하려면 아래와 같이 vue.config.js
설정을 한다.
module.exports = {
css: {
loaderOptions: {
css: {
modules: {
auto: () => true
}
}
}
}
}
3. Vue Cli 설정 사용
module.exports = {
...
css: {
loaderOptions: {
css: {
modules: {
localIdentName: '[name]-[hash]',
}
}
}
},
...
}
localIdentName
이 [name]-[hash]
로 설정된 경우, 생성된 button
클래스 이름은 다음과 같이 변환된다
styles
abc123
따라서, 최종 클래스 이름은 styles-abc123
가 된다.
이 설정을 통해 .button
클래스는 styles-abc123
와 같이 고유한 이름으로 변환된다. 이를 통해 클래스 이름 충돌을 방지하고, 스타일을 모듈화하여 관리할 수 있다.
쉽게 말해 .button
이지만 유니크한 값으로 변환해서 고유하게 쓸 수 있게 해주는 기능이다.
loaderOptions
의 sass
옵션은 SASS 전처리기와 관련된 설정이다. 이 설정은 SASS 파일을 처리할 때 추가적인 데이터를 자동으로 포함시키는 데 사용된다.
예를 들어, 모든 Sass/Less 스타일에 공유된 전역 변수를 전달하려면 다음과 같다.
📄variables.scss
/*== color ==*/
$white : #FFFFFF;
$black : #000000;
$red : #F00F00;
$grayEBE : #EBEBEB;
module.exports = {
...
css: {
loaderOptions: {
sass: {
additionalData: '@import "@/assets/scss/_variables";',
},
},
},
...
}
이렇게 전처리기로 가져와서 프로젝트 내의 모든 SASS
파일에서 공통 변수를 사용할 수 있도록 설정한다.
Vue CLI
에서 Webpack
설정을 체인 방식으로 수정할 수 있는 메서드다. 이를 통해 Webpack 설정을 세밀하게 조정할 수 있다. chainWebpack
메서드는 webpack-chain
라이브러리를 사용하여 Webpack 설정을 구성한다.
📣
webpack-chain
라이브러리는VueCli
에 내장되어 있다.
내가 사용하면서 주로 쓰던 기능은 아래와 같다
config.resolve.alias.set('@', path.resolve(__dirname, 'src/'));
src
를 기점으로 절대경로로 쓰기 위해 설정하여 더 간단하게 참조할 수 있다.
import MyComponent from '@/components/MyComponent.vue';
config.module
.rule('vue')
.use('vue-loader')
.tap((options) => ({
...options,
defineModel: true,
}));
defineModel
은 vue3.3에서 추가된 기능이다. 사용하려면 vue.config 나 vite.config 에서 설정을 해줘야한다.
vue-loader
의 옵션을 수정하여 defineModel: true
를 추가한다.tap
메서드를 사용하여 기존 옵션을 확장하거나 수정할 수 있다.config.plugin('define').tap((definitions) => {
Object.assign(definitions[0], {
__VUE_OPTIONS_API__: 'true', // Vue Options API 사용 여부 설정
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false' // Vue 3의 hydration mismatch 세부 정보 비활성화
});
return definitions;
});
이 코드는 Webpack의 DefinePlugin
을 사용하여 전역 상수를 정의하는 설정이다. DefinePlugin
은 컴파일 타임에 전역 상수를 정의하여 코드 내에서 사용할 수 있게 한다. 이 설정은 Vue CLI 프로젝트에서 특정 전역 상수를 정의하여 Vue의 동작을 제어하는 데 사용된다.