vue 파일에 스타일시트를 적용하는 방법은 두 가지가 있다.
하나는 <style></style> 요소 안에 @import를 선언하는 것이고,
다른 하나는 <style src=""/> 와 같이 src 속성을 사용하는 것이다.
scss 파일을 선언하는 방법
<!-- /* 1. @import */ -->
<style lang="scss">
@import "../assets/scss/style"
</style>
<!-- /* 2. src */ -->
<!-- relative path -->
<style lang="scss" src="../assets/styles/style.scss"></style>
<!-- module path -->
<style lang="scss" src="my-package/style.scss"></style>
똑같이 scss를 적용하는 방법이지만 동작 방식에는 차이가 있다.
@import를 사용하면 vue를 빌드하고 실행할 때 내부적으로 sass-loader 모듈의 buggy url() handling을 사용한다.
반면에 src로 정의하면 파일 자체를 load한다.
문제는 다음과 같은 상황에서 발생한다.
css 에서 url(이미지 경로) 속성으로 이미지를 불러올 때, @import 방식을 사용하면 위와 같은 상대경로는 오류가 발생한다.
만약 scss 파일에 url('../../images/background_test.jpg')라는 표현을 썼다면 다음과 같은 오류가 날 것이다.
./~/css-loader!./~/vue-loader/lib/style-rewriter.js?id=data-v-7d52047c!./~/sass-loader/lib/loader.js!./~/vue-loader/lib/selector.js?type=styles&index=0!./src/App.vue
Module not found: Error: Can't resolve '../../images/background_test.jpg' in 'D:\webprojects\gs-portfolio\src'
@ ./~/css-loader!./~/vue-loader/lib/style-rewriter.js?id=data-v-7d52047c!./~/sass-loader/lib/loader.js!./~/vue-loader/lib/selector.js?type=styles&index=0!./src/App.vue 7:64087-64130
@ ./~/vue-style-loader!./~/css-loader!./~/vue-loader/lib/style-rewriter.js?id=data-v-7d52047c!./~/sass-loader/lib/loader.js!./~/vue-loader/lib/selector.js?type=styles&index=0!./src/App.vue
@ ./src/App.vue
@ ./src/main.js
@ multi ./build/dev-client ./src/main.js
sass-loader 모듈을 사용한다면 url을 모듈이름으로 인식하는 것 같다.
../ 또는 ./을 사용해 상대경로로 이미지 파일을 로드하고싶다면 @import 말고 src를 사용하면 된다.
'생계유지형 개발자 > JS Framework' 카테고리의 다른 글
[svelte 기초] 자식 컴포넌트에서 부모 컴포넌트로 이벤트 발생시키기 (= Vue.$emit) (0) | 2022.06.15 |
---|---|
[vue] <img src="[object Module]"> 이미지가 나오지 않을 때 (0) | 2021.08.05 |
[Vue] Vue CDN으로 사용 시 this가 window를 가르킬 때 (0) | 2021.03.24 |
[Thymeleaf] 인라인 자바스크립트에서 파라미터 ${...} (0) | 2020.06.08 |
[vue] warning: component lists rendered with v-for should have explicit keys (0) | 2020.01.22 |