跳到主要內容
前端開發

Vue CLI、Bootstrap 與常用套件安裝筆記

2018 年整理的 Vue CLI、Vue Router、Vuex、axios、Bootstrap 4 與表單驗證套件安裝筆記。

W

這邊記錄手動安裝vuecli, 第三方套件要往上放,先安裝 Node.js。

使用 NVM 管理 Node.js

如果直接從官網下載 Node.js,只會安裝固定版本;NVM 可以用來安裝及切換不同版本。

  • 下載:nvm-windows
  • 點選 nvm-setup.zip
  • 開啟命令提示字元安裝 Node.js
nvm list
nvm list available
nvm install v8.12.0
nvm use v8.12.0
  • nvm list:查看已安裝的版本
  • nvm list available:查看可以安裝的 Node.js 版本
  • nvm install v8.12.0:安裝指定版本
  • nvm use v8.12.0:切換到指定版本
  • LTS:穩定版本

安裝 Vue CLI

全域安裝一次:

npm i -g vue-cli

-g 代表全域安裝。

查看模板清單:

vue list

空資料夾可以選擇下列模板:

  • browserify
  • browserify-simple
  • pwa
  • webpack:主要模板
  • webpack-simple:基本架構

如果要使用 SCSS,設定過程要選擇 Yes。

vue init webpack 資料夾名稱
vue init webpack-simple 資料夾名稱

確認是否安裝完成:

vue -V

安裝 Sass 與 Bootstrap

npm install bootstrap node-sass sass-loader --save
npm install --save jquery
npm install popper.js

測試 SCSS:

<style lang="scss">
$color: #000;

body {
  background-color: $color;
}
</style>

引入 Bootstrap:

@import '~bootstrap/scss/bootstrap';

如果要指定當時使用的 Bootstrap 4 版本:

npm install --save jquery popper.js
npm install bootstrap@4.0.0-beta.3

main.js 引入 Bootstrap 的 SCSS 與 JavaScript 模組:

import 'bootstrap/scss/bootstrap.scss';
import 'bootstrap';

axios 與 vue-axios

npm install --save axios vue-axios

main.js 引入:

import Vue from 'vue';
import axios from 'axios';
import VueAxios from 'vue-axios';

Vue.use(VueAxios, axios);

測試資料可使用 https://randomuser.me/api/

created() {
  const url = 'https://randomuser.me/api/';

  this.axios.get(url).then((response) => {
    console.log(response.data);
  });

  this.$http.get(url).then((response) => {
    console.log(response.data);
  });
}

相關連結參考:

設定 API 路徑

設定 config/dev.env.jsconfig/prod.env.js

module.exports = merge(prodEnv, {
  NODE_ENV: '"development"',
  APIPATH: '"https://xxx.xxx.xxx/"',
  CUSTOMPATH: '"adminUser"',
});

設定完成後要重啟 Vue CLI。在需要使用的頁面輸入:

const url = `${process.env.APIPATH}/admin/signin`;

Vue Router

如果沒有安裝 Vue Router:

npm i -s vue-router

main.js

import router from './router';

new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>',
});

router/index.js

import Router from 'vue-router';
import login from '@/components/pages/login';

Vue.use(Router);

export default new Router({
  routes: [
    {
      path: '/',
      name: 'xxx',
      component: xxx,
    },
  ],
});

元件使用 <router-view/> 顯示路由內容。

導航守衛

導航守衛用來驗證使用者是否需要登入,在路由加入 meta: { requiresAuth: true }

檢查權限:

router.beforeEach((to, from, next) => {
  if (to.meta.requiresAuth) {
    const api = `${process.env.APIPATH}/api/user/check`;

    axios.post(api).then((response) => {
      if (response.data.success) {
        next();
      } else {
        next({
          path: '/login',
        });
      }
    });
  } else {
    next();
  }
});

當時的筆記是:頁面第一次無法觸發時,必須點選下一頁才會執行。

axios 可以直接使用;this.$http 要在 Vue 元件內使用。

vue-loading-overlay

npm install vue-loading-overlay --save
import Loading from 'vue-loading-overlay';
import 'vue-loading-overlay/dist/vue-loading.min.css';

Vue.component('Loading', Loading);
<template>
  <div>
    <loading
      :active.sync="isLoading"
      :can-cancel="true"
      :on-cancel="onCancel"
      :is-full-page="fullPage"
    />
  </div>
</template>

<script>
export default {
  data() {
    return {
      isLoading: false,
    };
  },
};
</script>

Vee Validate

npm install vee-validate

main.js 引入:

import VeeValidate from 'vee-validate';

Vue.use(VeeValidate);

姓名欄位判斷:

<input
  type="text"
  name="name"
  :class="{ 'is-invalid': errors.has('name') }"
  v-validate="'required'"
>
<span class="text-danger" v-if="errors.has('name')">姓名必須輸入</span>

v-validate="'required'" 代表必須輸入。欄位點選後沒有輸入,再移出欄位時會顯示錯誤。

Email 欄位判斷:

<input
  type="text"
  name="email"
  v-model="form.user.email"
  :class="{ 'is-invalid': errors.has('email') }"
  v-validate="'required|email'"
>
<span class="text-danger" v-if="errors.has('email')">
  {{ errors.first('email') }}
</span>

驗證語系

語系路徑:node_modules/vee-validate/dist/locale/

import zhTWValidate from 'vee-validate/dist/locale/zh_TW';

VeeValidate.Validator.localize('zh_TW', zhTWValidate);

表單送出前驗證

this.$validator.validate().then((result) => {
  if (result) {
    this.$http.post(url, { data: order }).then((res) => {
      console.log('訂單已建立', res);
    });
  } else {
    console.log('未完成');
  }
});

Vuex

先新增 store.js,再安裝 Vuex:

npm i -s vuex

main.js

import Vuex, { Store } from 'vuex';

Vue.use(Vuex);

元件:

import store from './store.js';
import { mapState } from 'vuex';

SCSS 架構

app.scss              統一引入自訂樣式與 Bootstrap
_customBootstrap.scss 統一調整 Bootstrap 風格

app.scss

@import 'variable';
@import 'mixin';
@import 'reset';
@import 'extend';
@import 'layout';

// third-party
@import 'customBootstrap';
@import '~bootstrap/scss/bootstrap';

程式進入點只要引入 Bootstrap 與 app.scss

import 'bootstrap';
import './assets/css/app.scss';

參考:SCSS 架構

Vue CLI 專案結構

main.js         程式進入點
router/index.js Router 設定檔
*.vue           分頁與元件

安裝完成後:

npm i
npm run dev

其他筆記

  • 終止命令提示字元:Ctrl+CCtrl+/
  • Shift + 滑鼠右鍵:開啟命令視窗
  • 開啟 VS Code 終端機:Ctrl+`
  • Webpack 的 resolve 可以省略副檔名,路徑可以使用 @/
  • 圖片小於 10KB 會壓縮成 Base64,大於 10KB 則以圖檔顯示
  • index.js 依執行環境設定,host 可以替換成要運行的 IP
分享這篇