vue.js

vue.js[webpack]_1

youngseokim_kr 2021. 11. 3. 16:26

webpack을 이용한 vue.js 구성하기

npx degit youngseoKim-kr/webpack-template-basic vue3-webpack-template

npx를 통해서 github에 저장된 내 이름과 폴더의 내용을 vue3-webpack-template 로 복제

cd 를 통해서 파일을 cd vue3-webpack-template로 이동하고

code . -r 로 실행시킨다.

src 폴더를 만들고 app.vue 와 main.js 파일을 만들고 원래 있던 js 폴더는 삭제시킨다.

npm i vue@next 그 다음 뷰를 설치한다.

vue.js 는 문법을 해석하는 용도이고 vue 파일을 프로그램에서 관리하려면 여러 패키지를 더 설치해줘야 한다.

npm i -D vue-loader@next vue-style-loader @vue/compiler-sfc 3개의 패키지를 설치한다.

// 구성옵션을 제공해야 한다. nodejs 환경에서 동작
const path = require('path')
const HtmlPlugin = require('html-webpack-plugin')
const CopyPlugin = require('copy-webpack-plugin')
const {VueLoaderPlugin} = require('vue-loader')   //추가!

module.exports = {
  //parcel index.html  파일 진입점 설정
  entry:'./src/main.js',         //js 파일을 진입점으로 설정 수정!
  

  //결과물(번들)을 반환하는 설정
  output:{
    //path filename은 따로 지정해주지 않아도 동작한다.
    // path:path.resolve(__dirname,'dist'),  //두개의 인수를 합쳐서 가져온다.__dirname 은 현재파일이 있는 경로 
    // filename:'main.js',                    //dist 폴더에 만들어질 js 파일 이름
    clean:true                            //기존에 만든거 제거
  },

  module : {
    rules:[                //추가!
      {
        test:/\.vue$/,
        use:'vue-loader'
      },
      {
        test:/\.s?css$/,         // .css , .scss 파일을 찾는다.
        use: [
          'vue-style-loader',  //가장 마지막 해석 추가!
          'style-loader',      //순서가 중요하다!
          'css-loader',
          'postcss-loader',
          'sass-loader'
        ]
      },
      {
        test:/\.js$/,
        use: [
          'babel-loader'
        ]
      }
    ]
  },

  plugins: [                    //번들링 후 결과물의 처리 방식 등 다양한 플러그인들을 설정
    new HtmlPlugin({
      template:'./index.html'
    }),
    new CopyPlugin ({
      patterns : [
        {from:'static'}
      ]
    }),
    new VueLoaderPlugin()       //추가!
  ],

  devServer : {
    host:'localhost'
  }
}

webpack.config.js 파일에 추가라고 적힌 부분을 수정했습니다.

import {createApp} from 'vue'
import App from './App.vue'

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

main.js

<template>
  <h1>{{message}}</h1>
</template>

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

App.vue

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Hello Webpack!</title>
  <!-- reset.css -->
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/reset-css@5.0.1/reset.min.css">
</head>
<body>
  <div id="app"></div>
</body>
</html>

index.html

이렇게 하고 npm run dev를 하면

Hello Vue!!! 가 화면에 잘나오는걸 확인할 수 있다.

import {createApp} from 'vue'
import App from './App'   //확장자 없음

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

main.js 파일의 확장자를 안적어주어도 오류가 안생기게 하는 방법이 있는데

module.exports = {
  resolve:{
    extensions : ['.js','.vue']
  },
  //parcel index.html  파일 진입점 설정
  entry:'./src/main.js',         //js 파일을 진입점으로 설정 수정!

webpack.config.js 파일에 resolve를 추가해주면 된다.

이미지

파일을 이렇게 변경시켜주고 이미지를 출력하기 위해서 패키지를 설치해준다.

npm i -D file-loader 설치해주고 webpack.config.js 파일로 이동해서

module.exports = {
  resolve:{
    extensions : ['.js','.vue'],
    alias:{  //경로 별칭
      '~':path.resolve(__dirname,'src'),
      'assets':path.resolve(__dirname,'src/assets')
    }
  },
  //parcel index.html  파일 진입점 설정
  entry:'./src/main.js',         //js 파일을 진입점으로 설정 수정!

alias 부분을 추가하고

module : {
    rules:[                //추가!
      {
        test:/\.vue$/,
        use:'vue-loader'
      },
      {
        test:/\.s?css$/,         // .css , .scss 파일을 찾는다.
        use: [
          'vue-style-loader',  //가장 마지막 해석 추가!
          'style-loader',      //순서가 중요하다!
          'css-loader',
          'postcss-loader',
          'sass-loader'
        ]
      },
      {
        test:/\.js$/,
        use: [
          'babel-loader'
        ]
      },
      {
        test:/\.(png|jpe?g|gif|webp)$/,               //이미지 추가
        use:'file-loader'
      }
    ]
  },

module 부분에 test 이미지 추가 부분을 추가해준다.

<template>
  <h1>{{message}}</h1>
  <HelloWorld />
</template>

<script>
import HelloWorld from '~/components/HelloWorld'  //경로별칭

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

app.vue 파일을 수정하여 이미지를 넣을 수 있게 해주고 실행하면 이미지가 잘출력이 된다.