- 22.04.09 - @vue/compiler-sfc, vue-loader, vue-style-loader, file-loader, eslint, eslint-plugin-vue, babel-eslint 추가
(아래 패키지들의 숫자는 구분하기 편하기 위해 작성한 것이라 순서는 무관)
$ npm i -D webpack
$ npm i -D webpack-cli
$ npm i -D webpack-dev-server
$ npm i -D html-webpack-plugin
// webpack.config.js
const HtmlPlugin = require('html-webpack-plugin')
module.exports = {
plugins: [
new HtmlPlugin({
template: './index.html' // 출력될 html 파일 경로 설정
})
]
}
$ npm i -D copy-webpack-plugin
// webpack.config.js
const CopyPlugin = require('copy-webpack-plugin')
module.exports = {
plugins: [
new CopyPlugin({
patterns: [
{ from: 'static' } // 정적 파일을 모아둔 폴더명
// (객체로 여러개 추가 가능)
]
})
]
}
$ npm i -D css-loader style-loader
// main.js
import '../css/main.css'
- 로더의
선언 순서가 중요
하다.배열 뒤부터 읽어주기 때문에
css-loader
를 제일 밑에 선언한다.
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
}
]
}
}
$ npm i -D sass-loader sass
- scss 문법이 css로 해석이 된 다음에 css-loader가 작동해야 하기 때문에
sass-loader를 제일 뒤에 작성
한다.
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.s?css$/, // 정규표현식은 scss, css 모두 찾을 수 있게 작성
use: [
// 순서 주의!
'style-loader',
'css-loader',
'sass-loader'
]
}
]
}
}
후처리
기능을 지원해주는 패키지$ npm i -D postcss postcss-loader autoprefixer
webpack.config.js
파일에postcss-loader
설정
postcss-loader
는 scss가 올바르게 해석된 후 작동되어야 한다. (선언 순서 주의).postcssrc.js
파일에autoprefixer
연결package.json
파일에 "browserslist" 옵션 추가
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.s?css$/, // 정규표현식은 scss, css 모두 찾을 수 있게 작성
use: [
// 순서 중요!
'style-loader',
'css-loader',
'postcss-loader',
'sass-loader'
]
}
]
}
}
- autoprefixer는
.postcssrc.js
에 설정해서 사용한다.
// .postcssrc.js
module.exports = {
plugins: [
require('autoprefixer')
]
}
- 벤더 프리픽스로 지원하는 범위를
package.json
파일에browserslist
옵션으로 추가한다.- 아래의 경우 전세계 점유율 1% 이상, 마지막 2 버전까지 지원하는 설정.
// package.json
{
"browserslist": [
"> 1%",
"last 2 versions"
]
}
$ npm i -D @babel/core @babel/preset-env @babel/plugin-transform-runtime babel-loader
.babelrc.js
파일에@babel/preset-env
과@babel/plugin-transform-runtime
플러그인을 연결package.json
에 지원 범위를 작성(autoprefixer 사용으로 작성했으면 패스)webpack.config.js
파일에 babel-loader 연결
// .babelrc.js
module.exports = {
presets: ['@babel/preset-env'],
plugins: [
['@babel/plugin-transform-runtime']
]
}
postcss
로 인해 이미 작성했으면browserslist
옵션은 생략 가능
// package.json
{
"browserslist": [
"> 1%",
"last 2 versions"
]
}
js
파일에 적용할babel-loader
를 아래와 같이 연결
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.js$/,
use: [
'babel-loader'
]
}
]
}
}
vue
문법 파일을 해석하기 위한 공식 패키지(vue의 버전과 동일한 버전을 유지해야 정상 작동을 보장함)vue
문법 파일을 webpack에서 해석하기 위한 공식 로더vue
파일 안에 style
태그를 해석하기 위한 로더$ npm i -D @vue/compiler-sfc vue-loader vue-style-loader
vue-loader
초기화 및 연결vue-style-loader
연결
// webpack.config.js
const { VueLoaderPlugin } = require('vue-loader')
module.exports = {
module: {
rules: [
{
test: /\.vue$/,
use: 'vue-loader' // vue-loader 연결
},
{
test: /\.s?css$/,
use: [
// 순서 중요!
'vue-style-loader', // vue-style-loader 연결
'style-loader',
'css-loader',
'postcss-loader',
'sass-loader'
]
},
]
},
plugins: [
new VueLoaderPlugin() // vue-loader 초기화
]
}
$ npm i -D file-loader
file-loader
연결
module.exports = {
module: {
rules: [
{
test: /\.(png|jpe?g|gif|webp)$/i,
use: 'file-loader'
}
]
}
}
eslint
베이스 플러그인vue
문법에 eslint
를 지원해주는 공식 플러그인es6
이상의 문법에 eslint
를 지원해주는 플러그인$ npm i -D eslint eslint-plugin-vue babel-eslint
.eslintrc.js
파일 생성 및 옵션 설정babel-eslint
연결
// .eslintrc.js
module.exports = {
env: {
browser: true, // 브라우저 환경에 lint 적용
node: true // node 환경에 lint 적용
},
extends: [
// vue - https://eslint.vuejs.org/rules/
// 'plugin:vue/vue3-essential', // Lv1
'plugin:vue/vue3-strongly-recommended', // Lv2
// 'plugin:vue/vue3-recommended', // Lv3 (가장 엄격)
// js - https://eslint.org/docs/rules/
'eslint:recommended' // 일단 js의 lint
],
parserOptions: {
parser: 'babel-eslint' // babel-eslint 연결
},
rules: {
// vue의 eslint 규칙을 custom 하고 싶을 때 작성
// https://eslint.vuejs.org/rules/
"vue/html-closing-bracket-newline": ["error", {
singleline: "never",
multiline: "never"
}],
"vue/html-self-closing": ["error", {
html: {
void: "always",
normal: "never",
component: "always"
},
svg: "always",
math: "always"
}]
}
}
// package.json
"scripts": {
"dev": "webpack-dev-server --mode development",
"build": "webpack --mode production"
}
'dist'
)entry의 진입점 파일
)package.json
{
// ...
"scripts": {
"dev": "webpack-dev-server --mode development",
"build": "webpack --mode production"
},
"browserslist": [
"> 1%",
"last 2 versions"
],
"devDependencies": {
"@babel/core": "^7.17.9",
"@babel/plugin-transform-runtime": "^7.17.0",
"@babel/preset-env": "^7.16.11",
"@vue/compiler-sfc": "^3.2.31",
"autoprefixer": "^10.4.4",
"babel-loader": "^8.2.4",
"copy-webpack-plugin": "^10.2.4",
"css-loader": "^6.7.1",
"html-webpack-plugin": "^5.5.0",
"postcss": "^8.4.12",
"postcss-loader": "^6.2.1",
"sass": "^1.50.0",
"sass-loader": "^12.6.0",
"style-loader": "^3.3.1",
"vue-loader": "^17.0.0",
"vue-style-loader": "^4.1.3",
"webpack": "^5.72.0",
"webpack-cli": "^4.9.2",
"webpack-dev-server": "^4.8.1"
},
"dependencies": {
"vue": "^3.2.31"
}
// ...
}
.babelrc.js
module.exports = {
presets: ['@babel/preset-env'],
plugins: [
['@babel/plugin-transform-runtime']
]
}
.postcssrc.js
module.exports = {
plugins: [
require('autoprefixer')
]
}
webpack.config.js
// const path = require('path') // node 환경에서 기본 제공하는 전역 모듈
const HtmlPlugin = require('html-webpack-plugin')
const CopyPlugin = require('copy-webpack-plugin')
module.exports = {
resolve: {
extensions: ['.js', '.vue'], // import시 js, vue 파일 확장자 생략 설정
// 경로 별칭
alias: {
'~': path.resolve(__dirname, 'src'),
'assets': path.resolve(__dirname, 'src/assets')
}
},
// 파일이 읽어들이기 시작하는 진입점 설정
entry: './js/main.js',
// 결과물(번들)을 반환하는 설정
output: {
// 따로 지정 안하면 'dist' 폴더로 사용(__dirname : 현재 파일 경로 나타내는 전역 변수)
// path: path.resolve(__dirname, 'dist'),
// 따로 지정 안하면 entry 옵션의 js를 default로 사용
// filename: 'main.js',
// 기존 불필요한 내용 삭제
clean: true,
},
module: {
rules: [
{
test: /\.vue$/,
use: 'vue-loader'
},
{
test: /\.s?css$/,
use: [
'vue-style-loader',
'style-loader',
'css-loader',
'postcss-loader',
'sass-loader',
]
},
{
test: /\.js$/,
exclude: /node_modules/, // 제외할 경로
use: [
'babel-loader'
]
},
{
test: /\.(png|jpe?g|gif|webp)$/i,
use: 'file-loader'
}
]
},
// 번들링 후 결과물의 처리 방식 등 다양한 플러그인들을 설정
plugins: [
new HtmlPlugin({
template: './index.html'
}),
new CopyPlugin({
patterns: [
{ from: 'static' }
]
}),
new VueLoaderPlugin()
],
devServer: {
host: 'localhost',
// port: 8081
}
}