Vue 프로젝트의 구성요소

! 300

Webpack 기반의 Vue

npx degit ParkYoungWoong/webpack-template-basic vue3-webpack-template

Pasted image 20230522100452.png

# next를 사용하는 이유는 사용하지 않으면 vue2 버전이 설치 되기 때문입니다.
npm i vue@next
# 후에는 현재 강의에서는 개발용으로만 사용할 것이기에, 개발 의존성 패키지를 설치할 것이다. 
# vue/compiler가 vue를 html로 변환 시키는 작업을 하는 패키지 이다.
npm i -D vue-loader@next vue-style-loader @vue/compiler-sfc
// path: NodeJS에서 파일 및 디렉토리 경로 작업을 위한 전역 모듈

const path = require('path')
const HtmlPlugin = require('html-webpack-plugin')
const CopyPlugin = require('copy-webpack-plugin')
const { VueLoaderPlugin } = reqire('vue-loader') // 추가

module.exports = {
  // 파일을 읽어들이기 시작하는 진입점 설정
  entry: './js/main.js',
  // 결과물(번들)을 반환하는 설정
  output: {
    // 주석은 기본값!, `__dirname`은 현재 파일의 위치를 알려주는 NodeJS 전역 변수
    // path: path.resolve(__dirname, 'dist'),
    // filename: 'main.js',
    clean: true
  },
  // 모듈 처리 방식을 설정
  module: {
    rules: [
    //vue 파일을 받앗기 때문에 해당 부분을 추가하면 됩니다.
    // ++++++++++++++++++++++++++++++++++++++++++++
	  {
		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'
        ]
      }
    ]
  },
  // 번들링 후 결과물의 처리 방식 등 다양한 플러그인들을 설정
  plugins: [
    new HtmlPlugin({
      template: './index.html',
    }),
    new CopyPlugin({
      patterns: [
        { from: 'static' }
      ]
    }),
    new VueLoaderPlugin()
  ],
  // 개발 서버 옵션
  devServer: {
    host: 'localhost',
    port: 8080,
    hot: true
  }
}

webpack.config.js

간단 Vue 예시

<template>
    <h1></h1>
</template>

<script>
export default{
    data(){
        return {
            message: 'Hello Vue!!!'
        }
    }
}
</script>

src/App.vue

import Vue from 'vue'
import App from './App.vue'

Vue.createApp(App).mount('#app')

src/

...
module.exports = {
  resolve:{
    extensions: ['.js', '.vue']
  },
  // 파일을 읽어들이기 시작하는 진입점 설정
  entry: './js/main.js',
  // 결과물(번들)을 반환하는 설정
  output: {
    // 주석은 기본값!, `__dirname`은 현재 파일의 위치를 알려주는 NodeJS 전역 변수
    // path: path.resolve(__dirname, 'dist'),
    // filename: 'main.js',
    clean: true
  },
  ...

webpack.config.js

componet 생성 및 assets 사용


componets/HelloWorld.vue

npm i -D file-loader
...

module.exports = {
  resolve:{
    extensions: ['.js', '.vue']
    // 경로 별칭
    alias:{
      '~' : path.resolve(__dirname, 'src'),
      'assets': path.resolve(__dirname,'src/assets')
    }
  },
  // 파일을 읽어들이기 시작하는 진입점 설정
  entry: './js/main.js',
  // 결과물(번들)을 반환하는 설정
  output: {
    // 주석은 기본값!, `__dirname`은 현재 파일의 위치를 알려주는 NodeJS 전역 변수
    // path: path.resolve(__dirname, 'dist'),
    // 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'
        ]
      },
      // file-loader 의존성 패키지 추가
      {
        test: /\.(png |jpe?g|gif|webp)$/,
        use : 'file-loader'
      }
    ]
  },
  ...

webpack.config.js

eslint

npm i -D eslint eslint-plugin-vue babel-eslint
module.exports = {
    env:{
	    // 프론트 환경에서 개발 할 시에, 여러가지 전역 개념들에 대한 코드 검사를, 브라우저와 node 단위에서
	    // 설정한다는 코드 입니다.
        browser: true,
        node: true
    },
    extends: [
	    //vue
        // 'plugin:vue/vue3-essential', // LV1
        'plugin:vue/vue3-strongly-recommanded', // LV2
        // 'plugin:vue/vue3-recommnaded', // LV3
        //js
        'eslint:recommanded'
    ],
    parserOptions: {
		// babel은 해당 es6 문법을 es5로 변환해주는 역할을 한다.
	    parser: 'babel-eslint'
    },
    rules: {}
}

.eslintrc.js

<template>
    <img 
	    src="~assets/logo.png" 
	    alt="HEORPY"
	>
</template>

src/compontes/HelloWorld.vue

{
	...
	"editor.codeActionsOnSave": {
        "source.fixAll.eslint":true
    }
}

#Vue #FrontEnd #Vue2