91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于Vue的前端架構所實現的技術有哪些

發布時間:2021-10-21 10:42:00 來源:億速云 閱讀:110 作者:iii 欄目:web開發

這篇文章主要介紹“基于Vue的前端架構所實現的技術有哪些”,在日常操作中,相信很多人在基于Vue的前端架構所實現的技術有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”基于Vue的前端架構所實現的技術有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1.分解需求

技術棧

  •  考慮到后續招人和現有人員的技術棧,選擇 Vue 作為框架。

  •  公司主要業務是 GIS 和 BIM,通常開發一些中大型的系統,所以 vue-router 和 vuex 都是必不可少的。

  •  放棄了 Element UI 選擇了 Ant Design Vue(最近 Element 好像復活了,麻蛋)。

  •  工具庫選擇 lodash。

建立腳手架

  •  搭建 NPM 私服。

  •  使用 Node 環境開發 CLI 工具。

  •  基于 @vue/cli 搭建基礎的模板(大家都比較了解,節省開發時間,遠勝于從零開始搭建)。

  •  根據業務需求定義各種開發中可能用到的功能(組件庫、狀態管理、過濾器、指令、CSS內置變量、CSS Mixins、表單驗證、工具函數等)。

  •  性能優化,例如對 Ant Design Vue 組件庫的優化。

開發規范

  •  對代碼風格、命名規則、目錄結構進行統一規范。

  •  靜態資源的使用規范。

  •  單元測試、提交線上測試規范。

  •  Git 提交記錄和多人協作規范。

2.樣式

CSS 預處理器的選擇

  •  Sass/Scss ?

  •  Less ?

  •  Stylus ?

為什么選擇了兩個?因為公司團隊跟傾向于使用 scss 開發,less 是為了覆蓋 ant design vue 的樣式,stylus 只有我自己喜歡這種風格。

局部樣式與全局樣式

局部樣式

一般都是使用 scoped 方案:

<style lang="scss" scoped>    ...  </style>  復制代碼

全局樣式

全局樣式 目錄:@/styles

variable.scss: 全局變量管理 mixins.scss: 全局 Mixins 管理 global.scss: 全局樣式

其中 variable.scss 和 mixins.scss 會優先于 global.css 加載,并且可以不通過 import 的方式在項目中任何位置使用這些變量和 mixins。

// vue.config.js  module.exports = {    css: {      loaderOptions: {        sass: {          prependData: `          @import '@/styles/variable.scss';          @import '@/styles/mixins.scss';          `,        },      },    },  }  復制代碼

體驗優化

頁面載入進度條

使用 nprogress 對路由跳轉時做一個偽進度條,這樣做在網絡不好的情況下可以讓用戶知道頁面已經在加載了:

import NProgress from 'nprogress';  router.beforeEach(() => {    NProgress.start();  });  router.afterEach(() => {    NProgress.done();  });  復制代碼

美化滾動條

一直用 Mac 做前端,突然發現同事的 Windows 上出現了十分丑陋的滾動條,為了保持一致:

::-webkit-scrollbar {    width: 6px;    height: 6px;  }  ::-webkit-scrollbar-track {    width: 6px;    background: rgba(#101F1C, 0.1);    -webkit-border-radius: 2em;    -moz-border-radius: 2em;    border-radius: 2em;  }  ::-webkit-scrollbar-thumb {    background-color: rgba(#101F1C, 0.5);    background-clip: padding-box;    min-height: 28px;    -webkit-border-radius: 2em;    -moz-border-radius: 2em;    border-radius: 2em;  }  ::-webkit-scrollbar-thumb:hover {    background-color: rgba(#101F1C, 1);  }  復制代碼

靜態資源加載頁面

首次加載頁面時,會產生大量的白屏時間,這時做一個 loading 效果看起來會很友好,其實很簡單,直接在 public/index.html 里寫一些靜態的樣式即可。

移動端 100vh 問題

在移動端使用 100vh 時,發現在 Chrome、Safari 瀏覽器中,因為瀏覽器欄和一些導航欄、鏈接欄導致不一樣的呈現:

你以為的 100vh === 視口高度

實際上 100vh === 視口高度 + 瀏覽器工具欄(地址欄等等)的高度

解決方案

安裝 vh-check npm install vh-check \--save

import vhCheck from 'vh-check';  vhCheck('browser-address-bar');  復制代碼

定義一個 CSS Mixin

@mixin vh($height: 100vh) {    height: $height;    height: calc(#{$height} - var(--browser-address-bar, 0px));  }  復制代碼

之后就是哪里不會點哪里。

3.組件庫

因為 Element UI 長期沒更新,并且之前使用過 React 的 Ant Design(重點),所以組件庫選擇了Ant Design Vue。

覆蓋 Ant Design Vue 樣式

設計師眼中的 Ant Design === '丑'(心酸)。

1.使用 .less 文件

Ant Design Vue 的樣式使用了 Less 作為開發語言,并定義了一系列全局/組件的樣式變量,所以需要安裝了 less、less-loader,在 @/styles/antd-theme.less 可以覆蓋默認樣式。

優點是:

方便快捷,可以修改 class,覆蓋默認變量。

缺點是:

必須引入 @import '~ant-design-vue/dist/antd.less'; ,引入后會將所有的組件樣式全部引入,導致打包后的 css 體積達到 500kb 左右。

2.使用 JavaScript 對象

通過 JavaScript 對象的方式可以修改內置變量,需要對 Less 進行配置:

// vue.config.js  const modifyVars = require('./src/styles/antdTheme.js');  module.exports = {    css: {      loaderOptions: {        less: {          lessOptions: {            javascriptEnabled: true,            modifyVars,          },        },      },    },  }  復制代碼

這一步還可以繼續優化,通過 babel-plugin-import 使 Ant Design Vue 的組件樣式可以按需加載:

// babel.config.js  module.exports = {    presets: [      '@vue/cli-plugin-babel/preset',    ],    plugins: [      [        'import',        { libraryName: 'ant-design-vue', libraryDirectory: 'es', style: true },      ],    ],  };  復制代碼

優點是:

可以按需引入,打包后的 CSS 體積取決于你引用了多少個組件。

缺點是:

不能使用 class 進行樣式覆蓋。

干掉無用的圖標

Ant Design Vue 把所有的 Icon 一次性引入(不管你因用了多少個組件),這使得體積打包后圖標所占的體積竟然有幾百 kb 之多。這些圖標大多數不會被設計師所采納,所以部分圖標都應該被干掉:

創建一個 icons.js 來管理 Ant Design Vue 圖標,這里以一個 Loading 圖標為例:

// @/src/assets/icons.js  export { default as LoadingOutline } from '@ant-design/icons/lib/outline/LoadingOutline';  復制代碼

如何知道你要加載的圖標在什么路徑下?

在 @ant-design/icons/lib 目錄下有三種風格的圖標,分別是 fill、outline、twotone,這里面內部的文件并不是 svg 格式,而是 js 和 ts 格式,這就是為什么我們可以這么引入圖標的關鍵所在了。

下一步是通過配置 vue.config.js 將這個文件引入進來:

// vue.config.js  module.exports = {    configureWebpack: {      resolve: {        alias: {          '@ant-design/icons/lib/dist$': path.resolve(__dirname, './src/assets/icons.js'),       },      },    },  }  復制代碼

解決 Moment 多國語

解決到這之后,Ant Design Vue 居然還很大,這是因為 moment 是 Ant Design Vue 中有強依賴該插件,所以使用 webpack 插件減小打包體積,這里我們只保留 zh-cn 語言包:

// vue.config.js  module.exports = {    chainWebpack: (config) => {      config        .plugin('ContextReplacementPlugin')        .use(webpack.ContextReplacementPlugin, [/moment[/\\]locale$/, /zh-cn/]);    },  }  復制代碼

部分組件需要在頁面內引用

Ant Design Vue 中部分體積較大的組件,例如 DatePicker,根據業務需求,應考慮在頁面中進行加載,盡量保證首屏加載的速度:

<script>  import { DatePicker } from 'ant-design-vue';  export default {    components: {      ADatePicker: DatePicker,    },  }  </script>  復制代碼

4.靜態資源與圖標

靜態資源

所有的靜態資源文件都會上傳到 阿里云 OSS 上,所以在環境變量上加以區分。

.env.development 與 .env.production 的 VUE_APP_STATIC_URL 屬性分別配置了本地的靜態資源服務器地址和線上 OSS 的地址。

本地的靜態資源服務器是通過 pm2 + http-server 創建的,設計師切完直接扔進來就好了。

自動注冊 Svg 圖標

在日常的開發中,總是會有著大量的圖標需要使用,這里我們直接選擇使用 SVG 圖標。但是如果每次使用圖標還需要通過路徑找到這張圖標豈不是很麻煩?

下面這種才是我想要的方案(直接 name 等于 文件名即可):

<template>      <svg name="logo" />  </template>  復制代碼

而且最后打包后需要合并成一張雪碧圖。

首先需要對 @/assets/icons 文件夾下的 svg 圖標進行自動注冊,需要對 webpack 和 svg-sprite-loader 進行了相關設置,文件全部打包成 svg-sprite。

module.exports = {    chainWebpack: (config) => {      config.module        .rule('svg')        .exclude.add(resolve('src/assets/icons'))        .end();      config.module        .rule('icons')        .test(/\.svg$/)        .include.add(resolve('src/assets/icons'))        .end()        .use('svg-sprite-loader')        .loader('svg-sprite-loader');    },  }  復制代碼

寫一個全局用的 Vue 組件 <m-svg />:

// @/components/m-svg/index.js

const requireAll = (requireContext) => requireContext.keys().map(requireContext);  const req = require.context('@/assets/icons', false, /\.svg$/);  requireAll(req);  復制代碼

@/components/m-svg/index.vue

<template>    <svg class="mw-svg" aria-hidden="true">      <use :xlink:href="iconName"></use>    </svg>  </template>  <script>  export default {    name: 'm-svg',    props: {      name: { type: String, default: '' },    },    computed: {      iconName() {        return `#${this.name}`;     },    },  };  </script>  <style lang="scss" scoped>  .mw-svg {    width: 1.4em;    height: 1.4em;    fill: currentColor;    overflow: hidden;    line-height: 1em;    display: inline-block;  }  </style>  復制代碼

參數 name

  •  類型:String

  •  默認值:null

  •  說明:放置在 @/assets/icons 文件夾下的文件名

樣式

  •  圖標的大小可以通過 width + height 屬性改變。

  •  通過改變 font-size 屬性改變,寬高 = font-zise * 1.4

5.異步請求

封裝 Axios

在 @/libs/request.js 路徑下對 Axios 進行封裝,封裝了請求參數,請求頭,以及錯誤提示信息、 request 攔截器、response 攔截器、統一的錯誤處理、baseURL 設置等。

廢話不說直接貼代碼:

import axios from 'axios';  import get from 'lodash/get';  import storage from 'store';  // 創建 axios 實例  const request = axios.create({   // API 請求的默認前綴   baseURL: process.env.VUE_APP_BASE_URL,   timeout: 10000, // 請求超時時間  });  // 異常攔截處理器  const errorHandler = (error) => {   const status = get(error, 'response.status');   switch (status) {     /* eslint-disable no-param-reassign */     case 400: error.message = '請求錯誤'; break;     case 401: error.message = '未授權,請登錄'; break;     case 403: error.message = '拒絕訪問'; break;     case 404: error.message = `請求地址出錯: ${error.response.config.url}`; break;     case 408: error.message = '請求超時'; break;     case 500: error.message = '服務器內部錯誤'; break;     case 501: error.message = '服務未實現'; break;     case 502: error.message = '網關錯誤'; break;     case 503: error.message = '服務不可用'; break;     case 504: error.message = '網關超時'; break;     case 505: error.message = 'HTTP版本不受支持'; break;     default: break;     /* eslint-disabled */   }   return Promise.reject(error);  };  // request interceptor  request.interceptors.request.use((config) => {   // 如果 token 存在   // 讓每個請求攜帶自定義 token 請根據實際情況自行修改   // eslint-disable-next-line no-param-reassign   config.headers.Authorization = `bearer ${storage.get('ACCESS_TOKEN')}`;   return config;  }, errorHandler);  // response interceptor  request.interceptors.response.use((response) => {   const dataAxios = response.data;   // 這個狀態碼是和后端約定的   const { code } = dataAxios;   // 根據 code 進行判斷   if (code === undefined) {     // 如果沒有 code 代表這不是項目后端開發的接口     return dataAxios;   // eslint-disable-next-line no-else-return   } else {     // 有 code 代表這是一個后端接口 可以進行進一步的判斷     switch (code) {       case 200:         // [ 示例 ] code === 200 代表沒有錯誤         return dataAxios.data;       case 'xxx':         // [ 示例 ] 其它和后臺約定的 code         return 'xxx';       default:         // 不是正確的 code         return '不是正確的code';     }   }  }, errorHandler);  export default request;  復制代碼
  •  通過 VUE_APP_BASE_URL 區分線上與開發環境的 API 地址。

  •  code 起到一個比較關鍵的作用,例如 token 過期時的驗證。

  •  使用了一個叫 sotre 的包作為本地儲存的工具用來存儲 token。

跨域問題

跨域問題一般情況直接找后端解決了,你要是不好意思打擾他們的話,可以用 devServer 提供的 proxy 代理:

// vue.config.js  devServer: {    proxy: {      '/api': {        target: 'http://47.100.186.132/your-path/api',        ws: true,        changeOrigin: true,        pathRewrite: {          '^/api': ''        }      }    }  }  復制代碼

Mock 數據

一個很常見的情況,后端接口沒出來,前端在這干瞪眼。

Mock 數據功能是基于 mock.js (opens new window)開發,通過 webpack 進行自動加載 mock 配置文件。

規則

  •  所有的 mock 配置文件均應放置在 @/mock/services 路徑內。

  •  在 @/mock/services 內部可以建立業務相關的文件夾分類存放配置文件。

  •  所有的配置文件應按照 ***.mock.js 的命名規范創建。

  •  配置文件使用 ES6 Module 導出 export default 或 export 一個數組。

入口文件

import Mock from 'mockjs';  Mock.setup({    timeout: '500-800',  });  const context = require.context('./services', true, /\.mock.js$/);  context.keys().forEach((key) => {    Object.keys(context(key)).forEach((paramKey) => {      Mock.mock(...context(key)[paramKey]);    }); });  復制代碼

示例模板

import Mock from 'mockjs';  const { Random } = Mock;  export default [    RegExp('/example.*'),    'get',    {      'range|50-100': 50,      'data|10': [        {          // 唯一 ID          id: '@guid()',          // 生成一個中文名字          cname: '@cname()',          // 生成一個 url          url: '@url()',          // 生成一個地址          county: Mock.mock('@county(true)'),          // 從數組中隨機選擇一個值          'array|1': ['A', 'B', 'C', 'D', 'E'],         // 隨機生成一個時間          time: '@datetime()',          // 生成一張圖片          image: Random.dataImage('200x100', 'Mock Image'),        },      ],    },  ];  復制代碼

6.路由

Layout

布局暫時分為三大類:

  •  frameIn:基于 BasicLayout,通常需要登錄或權限認證的路由。

  •  frameOut:不需要動態判斷權限的路由,如登錄頁或通用頁面。

  •  errorPage:例如404。

權限驗證

通過獲取當前用戶的權限去比對路由表,生成當前用戶具的權限可訪問的路由表,通過 router.addRoutes 動態掛載到 router 上。

  •  判斷頁面是否需要登陸狀態,需要則跳轉到 /user/login

  •  本地存儲中不存在 token 則跳轉到 /user/login

  •  如果存在 token,用戶信息不存在,自動調用 vuex '/system/user/getInfo'

在路由中,集成了權限驗證的功能,需要為頁面增加權限時,在 meta 下添加相應的 key:

auth

  •  類型:Boolean

  •  說明:當 auth 為 true 時,此頁面需要進行登陸權限驗證,只針對 frameIn 路由有效。

permissions

  •  類型:Object

  •  說明:permissions 每一個 key 對應權限功能的驗證,當 key 的值為 true 時,代表具有權限,若 key 為 false,配合 v-permission 指令,可以隱藏相應的 DOM。

在這里貼一下路由跳轉時權限驗證的代碼:

import router from '@/router';  import store from '@/store';  import storage from 'store';  import util from '@/libs/utils';  // 進度條  import NProgress from 'nprogress';  import 'nprogress/nprogress.css';  const loginRoutePath = '/user/login';  const defaultRoutePath = '/home';  /**  * 路由攔截   * 權限驗證   */  router.beforeEach(async (to, from, next) => {    // 進度條    NProgress.start();    // 驗證當前路由所有的匹配中是否需要有登錄驗證的    if (to.matched.some((r) => r.meta.auth)) {      // 是否存有token作為驗證是否登錄的條件      const token = storage.get('ACCESS_TOKEN');      if (token && token !== 'undefined') {        // 是否處于登錄頁面        if (to.path === loginRoutePath) {          next({ path: defaultRoutePath });          // 查詢是否儲存用戶信息        } else if (Object.keys(store.state.system.user.info).length === 0) {          store.dispatch('system/user/getInfo').then(() => {            next();          });        } else {          next();        }      } else {        // 沒有登錄的時候跳轉到登錄界面        // 攜帶上登陸成功之后需要跳轉的頁面完整路徑        next({          name: 'Login',          query: {            redirect: to.fullPath,          },        });        NProgress.done();      }    } else {      // 不需要身份校驗 直接通過      next();    }  });  router.afterEach((to) => {    // 進度條    NProgress.done();    util.title(to.meta.title);  });  復制代碼

頁面開發

  •  根據業務需要劃分,按照路由層級在 views 中創建相對應的頁面組件,以文件夾的形式創建,并在文件夾內創建 index.vue 文件作為頁面的入口文件。

  •  頁面內的組件:在頁面文件夾下創建 components 文件夾,在其內部對應創建相應的組件文件,如果是復雜組件,應以文件夾的形式創建組件。

  •  工具模塊:能夠高度抽象的工具模塊,應創建在 @/src/libs 內創建 js 文件。

7、構建優化

包分析工具

構建代碼之后,到底是什么占用了這么多空間?靠直覺猜測或者使用 webpack-bundle-analyzer。

const WebpackBundleAnalyzer = require('webpack-bundle-analyzer');  module.exports = {    chainWebpack: (config) => {      if (process.env.use_analyzer) {        config          .plugin('webpack-bundle-analyzer')          .use(WebpackBundleAnalyzer.BundleAnalyzerPlugin);      }    }, };  復制代碼

開啟 Gzip

對,這這么一句話,后端就得支持你的 .gz 文件了,而你只需要坐著等老板夸:

chainWebpack: (config) => {    config      .plugin('CompressionPlugin')      .use(CompressionPlugin, []);  },  復制代碼

路由懶加載

這塊 @vue/cli 已經幫忙處理好了,但也需要了解一下他的原理和如何配置。

{    path: 'home',    name: 'Home',    component: () => import(      /* webpackChunkName: "home" */ '@/views/home/index.vue'    ),  },  復制代碼

webpackChunkName 這條注釋還是很有必要加的,至少你打包后知道又是哪個頁面變得又臭又大。

Preload & Prefetch

不清楚這兩個功能的去 @vue/cli 補課,這兩個功能非常有助于你處理加載的性能。

8.測試框架

直接使用了官方提供的 Vue Test Utils,這東西可以對組件進行測試,很不錯。

寫單元測試在團隊里其實很難推進,不知道大家怎么看。

9.組件庫

對于很多第三方的工具,我堅持認為二次封裝成 vue 插件并沒有多少開發成本,反而讓你在后續的開發中變得很靈活。

我對以下庫進行了 vue 插件的封裝,并提交到 npm 私服:

  •  數字動畫

  •  代碼高亮

  •  大文件上傳(切片、斷點續傳、秒傳)需要與后端配合

  •  圖片預覽

  •  Excel 導入導出

  •  富文本編輯器

  •  Markdown 編輯器

  •  代碼編輯器

大文件上傳有興趣的可以留言,我后續單獨拎出來詳細的寫一下這塊。

10.Vuex

內置一些功能,主要是對以下這些功能做了一些封裝:

  •  用戶信息管理(儲存信息、對 token 進行操作等)

  •  登陸(調接口)

  •  菜單管理(儲存路由信息,生成菜單,模糊查詢等功能)

  •  UA信息

  •  全屏操作

  •  Loading

  •  日志管理(消息提醒、日志留存、日志上報)

11.過濾器

過濾器是 Vue 提供的一個很好用的功能,聽說 vue3 沒了?

{{ message | capitalize }}  復制代碼

我寫了幾個常用的過濾器:

  •  日期時間

  •  剩余時間

  •  區分環境的鏈接(主要針對本地靜態資源服務器和 OSS )

  •  文件大小

  •  數字金額

  •  浮點型精度

12.指令

自定義指令可以提供很好的幫助:

  •  組件權限驗證

  •  文本復制

  •  快捷鍵綁定

  •  滾動至指定位置

  •  圖片懶加載

  •  焦點

13.開發規范

ESLint

不管是多人合作還是個人項目,代碼規范都是很重要的。這樣做不僅可以很大程度地避免基本語法錯誤,也保證了代碼的可讀性。

這里我們采用了 Airbnb JavaScript Style Guide。

這套規范給我的感覺就是 很嚴謹!

CSS 規范

降低選擇器復雜性

瀏覽器讀取選擇器,遵循的原則是從選擇器的右邊到左邊讀取。

#block .text p {   color: red;  }  復制代碼
  •  查找所有 P 元素。

  •  查找結果 1 中的元素是否有類名為 text 的父元素

  •  查找結果 2 中的元素是否有 id 為 block 的父元素

選擇器優先級

內聯 > ID選擇器 > 類選擇器 > 標簽選擇器

  •  選擇器越短越好。

  •  盡量使用高優先級的選擇器,例如 ID 和類選擇器。

  •  避免使用通配符 *。

使用 flexbox

在早期的 CSS 布局方式中我們能對元素實行絕對定位、相對定位或浮動定位。而現在,我們有了新的布局方式 flexbox,它比起早期的布局方式來說有個優勢,那就是性能比較好。不過 flexbox 兼容性還是有點問題,不是所有瀏覽器都支持它,所以要謹慎使用。各瀏覽器兼容性:

  •  Chrome 29+

  •  Firefox 28+

  •  Internet Explorer 11

  •  Opera 17+

  •  Safari 6.1+ (prefixed with -webkit-)

  •  Android 4.4+

  •  iOS 7.1+ (prefixed with -webkit-)

動畫性能優化

在 CSS 中,transforms 和 opacity 這兩個屬性更改不會觸發重排與重繪,它們是可以由合成器(composite)單獨處理的屬性。

屬性值

  •  當數值為 0 - 1 之間的小數時,建議省略整數部分的 0。

  •  當長度為 0 時建議省略單位。

  •  建議不使用命名色值。

  •  建議當元素需要撐起高度以包含內部的浮動元素時,通過對偽類設置 clear 或觸發 BFC 的方式進行 clearfix。盡量不使用增加空標簽的方式。

  •  除公共樣式之外,在業務代碼中盡量不能使用 !important。

  •  建議將 z-index 進行分層,對文檔流外絕對定位元素的視覺層級關系進行管理。

字體排版

  •  字號應不小于 12px(PC端)。

  •  font-weight 屬性建議使用數值方式描述。

  •  line-height 在定義文本段落時,應使用數值。

Vue 代碼規范

常規

  •  當在組件中使用 data 屬性的時候 (除了 new Vue 外的任何地方),它的值必須是返回一個對象的函數 data() { return {...} }。

  •  prop 的定義應該盡量詳細,至少需要指定其類型。

  •  布爾類型的 attribute, 為 true 時直接寫屬性值。

  •  不要在computed中對vue變量進行操作。

  •  應該優先通過 prop 和事件進行父子組件之間的通信,而不是 this.$parent 或改變 prop。

  •  在組件上總是必須用 key 配合 v-for,以便維護內部組件及其子樹的狀態。

  •  v-if 和 v-for 不能同時使用

  •  公共方法盡量不要掛到原型上, 可以寫在 utils 文件,也可以使用 mixin 文件。不要將業務公共組件注冊到全局。

  •  不要將任何第三方插件掛載到 vue 原型上。

  •  具有高度通用性的方法,要封裝到 libs、全局組件或指令集里。

  •  為組件樣式設置作用域。

  •  盡量使用指令縮寫。

vuex

State (opens new window)為單一狀態樹,在 state 中需要定義我們所需要管理的數組、對象、字符串等等,只有在這里定義了,在 vue 的組件中才能獲取你定義的這個對象的狀態。

  •  修改 state 中數據必須通過 mutations。

  •  每一個可能發生改變的 state 必須同步創建一條或多條用來改變它的 mutations。

  •  服務端獲取的數據存放在 state 中,作為原始數據保留,不可變動。

Getters (opens new window)有點類似 vue.js 的計算屬性,當我們需要從 store 的 state 中派生出一些狀態,那么我們就需要使用 getters,getters 會接收 state 作為第一個參數,而且 getters 的返回值會根據它的依賴被緩存起來,只有 getters 中的依賴值(state 中的某個需要派生狀態的值)發生改變的時候才會被重新計算。

  •  通過 getters 處理你需要得到的數據格式,而不是通過修改 state 原始數據。

  •  組件內不強制使用 mapGetters,因為你可能需要使用 getter 和 setter。

  •  改變 state 的唯一方法就是提交 mutations (opens new window)。

  •  組件內使用 mapMutations 輔助函數將組件中的 methods 映射為 store.commit 調用。

  •  命名采用 大寫字母 + 下劃線 的規則。

  •  定義 CLEAR,以確保路由切換時可以初始化數據。

Actions

  •  頁面重的數據接口盡量在 actions (opens new window)中調用。

  •  服務端返回的數據盡量不作處理,保留原始數據。

  •  獲取到的數據必須通過調用 mutations 改變 state。

Modules

  •  通常情況下按照頁面劃分 modules (opens new window)。

  •  默認內置了 system 保證了腳手架的基礎功能。

  •  每個頁面模塊或頁面的子模塊添加屬性 namespaced: true。

14.完成詳細的使用文檔

不論是功能還是組件庫等等的工具,都需要完善的文檔提供查閱,即使是輪子的構建者,也抵不住時間長了會忘記許多細節。

這里我使用 vuepress 構建文檔,方便快捷。

15.Git 多人協作流程

公司使用內部搭建的 GitLab 托管代碼

Root 倉庫

項目啟動時,由項目管理者搭建起最原始的倉庫,稱為 Root 倉庫(源倉庫)。

源倉庫的有個作用 :

  •  匯總參與該項目的各個開發者的代碼。

  •  存放趨于穩定和可發布的代碼。

  •  向 Master 分支提交 Merge Requests 可以觸發測試環境構建(CI/CD)。

  •  源倉庫是受保護的,開發者不可直接對其進行開發工作。

開發者倉庫

任何開發者都沒有權限對 Root 倉庫進行直接的操作,源倉庫建立以后,每個開發者需要做的事情就是把源倉庫的 Fork 一份,作為自己日常開發的倉庫。

  •  每個開發者所Fork的倉庫是完全獨立的,互不干擾。

  •  每個開發者提交到代碼到自己的倉庫中,開發工作完成以后,開發者可以向源倉庫發送 Pull Request ,本地倉庫先合并源倉庫,解決沖突。

  •  發起 Merge Request 請求管理員把自己的代碼合并到源倉庫中的 master 或 其他分支。

Git 流程

基于Vue的前端架構所實現的技術有哪些

  •  前端項目會在 Root 倉庫下創建 dev 分支,用于代碼的拉取和合并,如果有多個不同的測試環境,按照測試環境創建分支。

  •  在本地的倉庫中創建你的 dev 分支和其他功能性的分支。

  •  開發過程中不允許直接在 master 分支上開發,創建一個新的分支進行開發,git checkout &ndash;b {branch_name}。

  •  規范且詳細的書寫 commit ,推薦使用 git-cz 工具進行提交。

  •  完成開發后將相應的分支合并到自己倉庫的 master 分支。

  •  將 master 分支 push 到自己的遠程倉庫(Fork倉庫)。

  •  向 Root 倉庫 dev 分支提交 Merge Requests。

  •  提醒前端負責人審查代碼、解決沖突或測試環境上線。

  •  解決沖突后 git pull upstream dev 拉取解決后的最新代碼。 

到此,關于“基于Vue的前端架構所實現的技術有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

vue
AI

山阴县| 大同市| 成都市| 铜陵市| 缙云县| 北安市| 江孜县| 岳阳市| 新沂市| 迁西县| 新郑市| 富平县| 竹溪县| 汉中市| 出国| 宝应县| 宝坻区| 广宁县| 宣威市| 永年县| 建宁县| 利川市| 墨竹工卡县| 托克逊县| 无极县| 新和县| 镇巴县| 灵台县| 德保县| 三亚市| 滕州市| 光泽县| 娱乐| 潼南县| 黄石市| 同江市| 开原市| 千阳县| 西平县| 宝鸡市| 若羌县|