溫馨提示×

溫馨提示×

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

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

建立和維護大型 Vue.js 項目的實踐有哪些

發(fā)布時間:2021-09-26 14:00:00 來源:億速云 閱讀:110 作者:柒染 欄目:開發(fā)技術

今天就跟大家聊聊有關建立和維護大型 Vue.js 項目的實踐有哪些,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

1.使用插槽(slot)使組件更易于理解并且功能更強大

有一天,我只需要創(chuàng)建一個彈出窗口。乍一看,沒有什么真正復雜的,只是包括標題,描述和一些按鈕。所以我要做的就是把所有東西都當作屬性。最后,我用了三個屬性來定制組件,當人們單擊按鈕時會發(fā)出一個事件。十分簡單!:sweat_smile:

但是,隨著項目的不斷發(fā)展,團隊要求我們在其中顯示許多其他新內容:表單字段,不同的按鈕(取決于顯示在哪個頁面上),卡片,頁腳和列表。我發(fā)現,如果我繼續(xù)使用屬性來使這個組件不斷擴展,似乎也可以。但是上帝,:weary:我錯了!該組件很快變得太復雜了,以至于無法理解,因為它包含了無數的子組件,使用了太多的屬性并發(fā)出了大量事件。:volcano:我經歷了一種可怕的情況,當您在某處進行更改時,它最終以某種方式破壞了另一頁上的其他內容。我搞了個科學怪人的怪物,而不是一個可維護的組件!

但是,如果我從一開始就依賴插槽,情況可能會更好。最后,我重構了所有東西以提供這個小組件。易于維護,更快地理解并且可擴展性更高!

<template>
  <div class="c-base-popup">
    <div v-if="$slots.header" class="c-base-popup__header">
      <slot name="header">
    </div>
    <div v-if="$slots.subheader" class="c-base-popup__subheader">
      <slot name="subheader">
    </div>
    <div class="c-base-popup__body">
      <h2>{{ title }}</h2>
      <p v-if="description">{{ description }}</p>
    </div>
    <div v-if="$slots.actions" class="c-base-popup__actions">
      <slot name="actions">
    </div>
    <div v-if="$slots.footer" class="c-base-popup__footer">
      <slot name="footer">
    </div>
  </div>
</template>
<script> export default {
  props: {
    description: {
      type: String,
      default: null
    },
    title: {
      type: String,
      required: true
    }
  }
} </script>

我的觀點是,根據經驗,由知道何時使用插槽的開發(fā)人員構建的項目確實對其未來的可維護性有很大的影響。這樣就可以減少發(fā)出事件的次數,使代碼更易于理解,并且可以在內部顯示所需的任何組件時提供更大的靈活性。

作為一個經驗法則,請記住,當最終在子組件的父組件中復制子組件的屬性時,應該從這一點開始使用插槽。

2.正確組織您的 Vuex 存儲

通常,新的 Vue.js 開發(fā)人員開始學習 Vuex,因為他們偶然發(fā)現了以下兩個問題:

  • 他們要么需要從樹結構中實際上相距太遠的另一個組件訪問給定組件的數據,要么

  • 他們需要數據在組件銷毀后繼續(xù)存在。

那是他們創(chuàng)建第一個 Vuex 存儲,了解模塊并開始在應用程序中進行組織的時候。

問題是創(chuàng)建模塊時沒有單一模式可以遵循。但是我強烈建議您考慮如何組織它們。據我了解,大多數開發(fā)人員都喜歡按功能組織它們。例如:

  • 驗證碼

  • 博客

  • 收件箱

  • 設定

就我而言,我發(fā)現根據它們從API提取的數據模型來組織它們時更容易理解。例如:

  • 用戶數

  • 隊伍

  • 留言內容

  • 小部件

  • 文章

您選擇哪一個取決于您。唯一要記住的是,從長遠來看,組織良好的 Vuex 存儲將使團隊更具生產力。這也將使新來者更容易在加入您的團隊時就將您的想法圍繞您的代碼庫。

3.使用操作(Vuex Actions)進行 API 調用和提交數據

我的大多數API調用(如果不是全部)都在我的 Vuex 操作(vuex actions)中進行。您可能想知道:為什么這里調用更好?

僅僅因為它們中的大多數都提取了我需要在存儲(vuex store)中提交的數據。此外,它們提供了我真正喜歡的封裝性和可重用性。我這樣做還有其他一些原因:

  • 如果我需要在兩個不同的地方(例如博客和首頁)獲取文章的首頁,則可以使用正確的參數調用適當的調度程序。數據將被提取,提交和返回,除了調度程序調用外,沒有重復的代碼。

  • 如果我需要創(chuàng)建一些邏輯來避免在提取第一頁時提取它,則可以在一個地方進行。除了減少服務器上的負載之外,我還有信心它可以在任何地方使用。

  • 我可以在這些操作(vuex actions)中跟蹤我的大多數 Mixpanel 事件,從而使分析代碼庫真正易于維護。我確實有一些應用程序,其中所有 Mixpanel 調用都是在操作中單獨進行的。當我不必了解跟蹤什么不跟蹤什么以及何時發(fā)送時,:joy:這種方式工作會給我?guī)碛卸啻蟮目鞓贰?/p>

譯注:Mixpanel 是一家數據跟蹤和分析公司,允許開發(fā)者跟蹤各種用戶行為,比如用戶瀏覽的頁面數,iPhone 應用分析,Facebook 應用互動情況,以及 Email 分析。類似Firebase一樣的埋點分析工具。

4.使用 mapState,mapGetters,mapMutations 和 mapAction 簡化代碼庫

當您只需要訪問state/getter或在組件內部調用action/mutation時,通常無需創(chuàng)建多個計算屬性或方法。使用 mapState mapGetters , mapMutations mapActions 可以幫助你縮短你的代碼,通過分組來化繁為簡,從你存儲里模塊一個地方就能掌握全局。

// NPM
import { mapState, mapGetters, mapActions, mapMutations } from "vuex";
export default {
  computed: {
    // Accessing root properties
    ...mapState("my_module", ["property"]),
    // Accessing getters
    ...mapGetters("my_module", ["property"]),
    // Accessing non-root properties
    ...mapState("my_module", {
      property: state => state.object.nested.property
    })
  },
  methods: {
    // Accessing actions
    ...mapActions("my_module", ["myAction"]),
    // Accessing mutations
    ...mapMutations("my_module", ["myMutation"])
  }
};

Vuex官方文檔中提供了您在這些便捷幫助器上所需的所有信息。

5.使用 API 工廠

我通常喜歡創(chuàng)建一個 this.$api 可以在任何地方調用以獲取API端點的助手。在項目的根目錄下,我有一個 api 包含所有類的文件夾(請參閱下面的其中一個)。

api
├── auth.js
├── notifications.js
└── teams.js

每個節(jié)點都將其類別的所有端點分組。這是我在 Nuxt 應用程序中使用插件初始化此模式的方式(這與標準 Vue 應用程序中的過程非常相似)。

// PROJECT: API
import Auth from "@/api/auth";
import Teams from "@/api/teams";
import Notifications from "@/api/notifications";
export default (context, inject) => {
  if (process.client) {
    const token = localStorage.getItem("token");
    // Set token when defined
    if (token) {
      context.$axios.setToken(token, "Bearer");
    }
  }
  // Initialize API repositories
  const repositories = {
    auth: Auth(context.$axios),
    teams: Teams(context.$axios),
    notifications: Notifications(context.$axios)
  };
  inject("api", repositories);
};
export default $axios => ({
  forgotPassword(email) {
    return $axios.$post("/auth/password/forgot", { email });
  },
  login(email, password) {
    return $axios.$post("/auth/login", { email, password });
  },
  logout() {
    return $axios.$get("/auth/logout");
  },
  register(payload) {
    return $axios.$post("/auth/register", payload);
  }
});

現在,我可以簡單地在我的組件或 Vuex 操作中調用它們,如下所示:

export default {
  methods: {
    onSubmit() {
      try {
        this.$api.auth.login(this.email, this.password);
      } catch (error) {
        console.error(error);
      }
    }
  }
};

6.使用 $config 訪問您的環(huán)境變量(在模板中特別有用)

您的項目可能在某些文件中定義了一些全局配置變量:

config
├── development.json
└── production.json

我喜歡通過 this.$config 助手快速訪問它們,尤其是當我在模板中時。與往常一樣,擴展Vue對象非常容易:

// NPM
import Vue from "vue";
// PROJECT: COMMONS
import development from "@/config/development.json";
import production from "@/config/production.json";
if (process.env.NODE_ENV === "production") {
  Vue.prototype.$config = Object.freeze(production);
} else {
  Vue.prototype.$config = Object.freeze(development);
}

7.遵循一個約定來寫提交注釋

隨著項目的發(fā)展,您將需要定期瀏覽組件的提交歷史記錄。如果您的團隊沒有遵循相同的約定來書寫他們的提交說明,那么將很難理解每個團隊成員的行為。

我總是使用并推薦Angular commit消息準則。在我從事的每個項目中,我都會遵循它,在許多情況下,其他團隊成員也會很快發(fā)現遵循它也更好。

遵循這些準則會導致更具可讀性的消息,從而在查看項目歷史記錄時更易于跟蹤提交。簡而言之,這是它的工作方式:

git commit -am "<type>(<scope>): <subject>"
# Here are some samples
git commit -am "docs(changelog): update changelog to beta.5"
git commit -am "fix(release): need to depend on latest rxjs and zone.js"

看看他們的README文件以了解更多約定。

8.始終在生產項目時凍結軟件包的版本

我知道...所有軟件包都應遵循語義版本控制規(guī)則。但實際情況是,其中一些并非如此。:sweat_smile:

為避免因您的一個依賴項在半夜醒來破壞了整個項目,鎖定所有軟件包的版本會使您的早晨工作壓力減輕。:innocent:

它的意思很簡單:避免使用以 ^ 開頭的版本:

{
  "name": "my project",
  "version": "1.0.0",
  "private": true,
  "dependencies": {
    "axios": "0.19.0",
    "imagemin-mozjpeg": "8.0.0",
    "imagemin-pngquant": "8.0.0",
    "imagemin-svgo": "7.0.0",
    "nuxt": "2.8.1",
  },
  "devDependencies": {
    "autoprefixer": "9.6.1",
    "babel-eslint": "10.0.2",
    "eslint": "6.1.0",
    "eslint-friendly-formatter": "4.0.1",
    "eslint-loader": "2.2.1",
    "eslint-plugin-vue": "5.2.3"
  }
}

9.顯示大量數據時使用 Vue 虛擬滾動條

當您需要在給定頁面中顯示很多行或需要循環(huán)訪問大量數據時,您可能已經注意到該頁面的呈現速度很快。要解決此問題,可以使用vue-virtual-scoller。

npm install vue-virtual-scroller

它將僅渲染列表中的可見項,并重用組件和dom元素,以使其盡可能高效。它真的很容易使用,順滑得很

<template>
  <RecycleScroller
    class="scroller"
    :items="list"
    :item-size="32"
    key-field="id"
    v-slot="{ item }"
  >
    <div class="user">
      {{ item.name }}
    </div>
  </RecycleScroller>
</template>

10.跟蹤第三方程序包的大小

當很多人在同一個項目中工作時,如果沒有人關注它們,那么已安裝軟件包的數量會迅速增加,令人難以置信。為了避免您的應用程序變慢(尤其是在移動網絡變慢的情況下),我在Visual Studio Code中使用了導入費用包。這樣,我可以從編輯器中直接看到導入的模塊庫有多大,并且可以查看導入的模塊庫過大時出了什么問題。

例如,在最近的項目中,導入了整個 lodash 庫(壓縮后大約24kB)。問題在于,項目里僅僅使用cloneDeep 一個方法。通過在 導入費用包 中識別此問題后,我們通過以下方式解決了該問題:

npm remove lodash
npm install lodash.clonedeep

然后可以在需要的地方導入clonedeep函數:

import cloneDeep from "lodash.clonedeep"; 
的JavaScript

為了進一步優(yōu)化,您還可以使用Webpack Bundle Analyzer軟件包通過交互式可縮放樹狀圖來可視化Webpack輸出文件的大小。

看完上述內容,你們對建立和維護大型 Vue.js 項目的實踐有哪些有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

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

AI