Syw.Frontend

๐Ÿงฉ Vue 2๋กœ ๋ฐฐ์šฐ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ธฐ์ดˆ

2๋‹จ๊ณ„. ๋„ฅ์ŠคํŠธ๊ณต๋ฌด์› ๋ฉ”์ธ Vue + Express๋กœ ๋กœ ํด๋ก ํ•˜๊ธฐ

2-1. ์‹ค์ „ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์„ค๊ณ„ & ์ดˆ๊ธฐ ์„ธํŒ…

๐ŸŽฏ ๋ชฉํ‘œ

  • ๋ฉ”๊ฐ€๊ณต ๋ฉ”์ธ ํŽ˜์ด์ง€ ์žฌ๊ตฌํ˜„์„ ์œ„ํ•œ Vue ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ
  • ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„ ๋ฐ ๊ธฐ๋ณธ ๋ผ์šฐํŒ… ์ค€๋น„
  • ๊ธ€๋กœ๋ฒŒ ์Šคํƒ€์ผ, ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ ์ „๋žต ์ˆ˜๋ฆฝ

๐Ÿ—‚ ์ถ”์ฒœ ํด๋” ๊ตฌ์กฐ

vue2-megagong/
โ”œโ”€โ”€ public/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ assets/          # ๊ณตํ†ต ์Šคํƒ€์ผ(css/scss), ์ด๋ฏธ์ง€ ๋“ฑ
โ”‚   โ”œโ”€โ”€ components/      # ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”œโ”€โ”€ views/           # ํŽ˜์ด์ง€ ๋‹จ์œ„ ๋ทฐ ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”œโ”€โ”€ router/          # Vue Router ์„ค์ •
โ”‚   โ”œโ”€โ”€ store/           # Vuex (์ถ”ํ›„ ํ†ตํ•ฉ)
โ”‚   โ”œโ”€โ”€ utils/           # axios ๋“ฑ ์œ ํ‹ธ
โ”‚   โ”œโ”€โ”€ App.vue
โ”‚   โ””โ”€โ”€ main.js
โ”œโ”€โ”€ .env
โ”œโ”€โ”€ package.json
โ””โ”€โ”€ vue.config.js

๐Ÿ“ฆ 1. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

vue create vue2-megagong
# ์„ ํƒ โ†’ Manually select features
# ์„ ํƒ โ†’ Babel, Router, Vuex, CSS Pre-processors(Sass/SCSS) ๋“ฑ ํฌํ•จ
# ์„ ํƒ โ†’ 2.x, Use history mode, Prettier, Lint on save

# ๋งŒ์•ฝ ํ˜„์žฌ ํด๋”์— ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด vue create .
cd vue2-megagong
npm run serve


๐Ÿ›  2. ๊ธฐ๋ณธ ์„ค์ • ์ž‘์—…

1) vue.config.js (API ํ”„๋ก์‹œ)

module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:8080', // ๋ฐฑ์—”๋“œ API ์„œ๋ฒ„ ์ฃผ์†Œ
        changeOrigin: true,
      },
    },
  },
};

2) main.js

import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import './assets/base.scss';

Vue.config.productionTip = false;

new Vue({
  router,
  store,
  render: (h) => h(App),
}).$mount('#app');

3) assets/base.scss

body {
  font-family: 'Noto Sans KR', sans-serif;
  margin: 0;
  background: #f8f8f8;
  color: #222;
}
a {
  color: inherit;
  text-decoration: none;
}

4) .prettierrc ํŒŒ์ผ ์ƒ์„ฑ (Prettier ์„ค์ •)

๋ฃจํŠธ ํด๋”์— .prettierrc ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค์Œ ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”:

{
  "singleQuote": false,
  "semi": true,
  "trailingComma": "es5",
  "printWidth": 100,
  "tabWidth": 2
}

5) .eslintrc.js ํŒŒ์ผ ์ˆ˜์ •

module.exports = {
  root: true,
  env: {
    node: true,
  },
  extends: ["plugin:vue/essential", "eslint:recommended", "plugin:prettier/recommended"],
  parserOptions: {
    parser: "@babel/eslint-parser",
  },
  rules: {
    "prettier/prettier": "off", // ์ถ”๊ฐ€
    "no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
    "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
  },
};

๐Ÿงฉ 3. ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๊ตฌ์„ฑ (router/index.js)

import Vue from 'vue';
import Router from 'vue-router';
import HomePage from '@/views/HomePage.vue';

Vue.use(Router);

export default new Router({
  mode: 'history',
  routes: [
    {
      path: '/',
      name: 'Home',
      component: HomePage,
    },
  ],
});

โœ… 4. ์ฒซ View ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ

<!-- src/views/HomePage.vue -->
<template>
  <div class="home">
    <h1>๋ฉ”๊ฐ€๊ณต ๋ฉ”์ธ ํŽ˜์ด์ง€ ์‹œ์ž‘</h1>
  </div>
</template>

<script>
export default {
  name: 'HomePage',
};
</script>

์ €์žฅ์†Œ

GitHub - heroyooi/vue2-megagong at ch1

๐Ÿ’ฌ ๋Œ“๊ธ€

    โ€ป ๋กœ๊ทธ์ธ ํ›„ ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.