淺談Vue開發最佳實踐—事項清單

来源:https://www.cnblogs.com/helong-123/archive/2022/04/22/16179928.html
-Advertisement-
Play Games

一 、通過雲開發平臺快速創建初始化應用 1.創建相關應用模版請參考鏈接:徹底學會快速部署vue框架,一篇就夠了 2.完成創建後就可以在github中查看到新增的Vue.js 倉庫 二 、 本地編寫《開發跨平臺桌面應用》項目 1.將應用模版克隆到本地 ● 首先假定你已經安裝了Git、node,沒有安裝 ...


一 、通過雲開發平臺快速創建初始化應用

1.創建相關應用模版請參考鏈接:徹底學會快速部署vue框架,一篇就夠了

2.完成創建後就可以在github中查看到新增的Vue.js 倉庫

file

二 、 本地編寫《開發跨平臺桌面應用》項目

1.將應用模版克隆到本地

● 首先假定你已經安裝了Git、node,沒有安裝請移步node官網進行安裝。克隆項目:

git clone + 項目地址

● 進入項目文件

cd Vue.js

● 切換到feature/1.0.0 分支上

git checkout feature/1.0.0

● 使用一下命令全局安裝 Vue CLI :

npm install -g @vue/cli 

● 安裝 Vue CLI Plugin Electron Builder

vue add electron-builder

過程中會提示你選擇Electron的版本,選擇最新版本即可。

在這個過程中,由於網路的原因,Electron可能會安裝失敗,這時候如果node_modules文件夾中已經有electron文件夾(該文件夾是不完整的electron包,不能運行),那麼刪除這個文件夾,然後可以使用cnpm重新安裝electron。

cnpm i electron --S

註意,如果上面不是選擇的最新版本,這裡安裝的時候需要指定版本安裝,如cnpm i [email protected] --S

● 安裝依賴包

npm install

● 啟動服務

npm run electron:serve

這裡打開瀏覽器8080埠,並出現預設頁面。

2.案例效果預覽、功能分析與項目架構

● 效果預覽

file

file

file

● 功能分析

1、記錄待完成任務和已完成任務

2、通過新建,添加待完成任務,並設置時間

3、點擊完成任務,跳轉到已完成界面;點擊刪除,可以刪除任務

4、點擊右上角的 × 按鈕,可以關閉主界面,要再次打開主界面,可以通過系統托盤

5、設定的時間到了,會在右下角彈出提醒框,如下圖所示。

file

● 項目架構

如果你有過vue開發經驗,會發現整個項目目錄還是熟悉的配方,業務代碼放在了src文件夾下。

渲染進程的頁面交給了vue進行渲染,開發過程和我們平時使用vue開發web頁面相差無幾。而electron主進程的代碼是放在background.js中。

file

項目支持熱更新,修改代碼後不用再手動刷新,比之前從零DIY要方便很多,我們可以更專註於業務邏輯的開發,下麵就進入coding階段~~

● 項目架構分析

file

項目主要有兩個渲染進程,對應兩個頁面(main和remind),因此,這裡我們採用多頁面打包的方式。

vue-cli構建的包預設是單頁面打包,所以,我們在vue.config.js中進行改造:

module.exports = { //多頁面打包
  pages: {
    main: {
      // 入口js
      entry: 'src/modules/main/main.js',
      // 模板來源
      template: 'public/main.html',
      // 在 dist 中生成的html文件名字
      filename: 'main.html',
      // template html 中的 title 標簽需要是 <title><%= htmlWebpackPlugin.options.title %></title>
      title: 'Main Page'
    },
    remind: {
      entry: 'src/modules/remind/remind.js',
      template: 'public/remind.html',
      filename: 'remind.html',
      title: 'Remind Page'
    }
  }
}

這時候的項目目錄:

file

以main頁面為例,它的main.js和Main.vue內容如下:

● main.js

import { createApp } from 'vue'
import App from './Main.vue'
import router from '../../router'
import store from '../../store'

createApp(App).use(store).use(router).mount('#app')

● Main.vue

<template>
  <div id="nav">
    <div class="date">{{dateStr}}</div>
    <div class="nav-text">
      <router-link to="/">待辦事項</router-link>
      <router-link to="/finished">已完成</router-link>
    </div>
    <router-link to="/add"><span>新建</span></router-link>
  </div>
  <div class="content">
    <span class="close enable-click" @click="closeMain">×</span>
    <div class="content-manage">
      <router-view/>
    </div>
  </div>
</template>
<script>
import { closeMain } from '../../utils/useIPC.js'
export default {
  setup () {
    const date = new Date()
    const dateStr = `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`
    return {
      closeMain,
      dateStr
    }
  }
}
</script>

3.路由與狀態管理

提醒視窗(remind)的結構和數據都很簡單,這裡主要分析主視窗。

● 路由

主視窗的頁面架構主要是三個Tab,分別對應三個vue組件。

file

使用vue-router的代碼如下:

// src/router/index.js

import { createRouter, createWebHashHistory } from 'vue-router'
import Todo from '../views/Todo.vue'

const routes = [
  {
    path: '/',
    name: 'Todo',
    component: Todo
  },
  {
    path: '/finished',
    name: 'Finished',
    component: () => import(/* webpackChunkName: "finished" */ '../views/Finished.vue')
  },
  {
    path: '/add',
    name: 'Add',
    component: () => import(/* webpackChunkName: "add" */ '../views/Add.vue')
  }
]

const router = createRouter({
  history: createWebHashHistory(),
  routes
})

export default router

● 狀態管理

這裡的主要數據就是 待完成任務(todoArray)和 已完成任務(finishedArray)。在上面三個組件中都有對這兩個數據的操作,所以使用vuex進行狀態管理。
本例中,任務數據需要使用localStorage來存儲,我們選擇vuex來管理數據,可以藉助插件來完成vuex中數據的持久化,這裡使用vuex-persistedstate。

import { createStore } from 'vuex'
import createPersistedState from 'vuex-persistedstate'

export default createStore({

  // 該插件會將vuex中數據持久化
  // 可通過配置來決定哪些數據需要持久化,保存在localStorage、sessionStorage還是cookie中
  plugins: [createPersistedState()],  
  
  state: {
    todoArray: [],      //待完成任務數組
    finishedArray: [],  //已完成任務數組
    keepTimes: 0        //已完成任務次數
  },
  mutations: {
    SET_TODO_ARRAY: (state, todoArray) => {
      state.todoArray = todoArray
    },
    SET_FINISHED_ARRAY: (state, finishedArray) => {
      state.finishedArray = finishedArray
    },
    SET_KEEP_TIMES: (state, keepTimes) => {
      state.keepTimes = keepTimes
    }
  }
})

4.Composition Api

之前沒用過Vue3,在這個項目中第一次用,最大的體驗就是Composition Api,所以這裡簡單地寫寫。

使用傳統的option配置方法寫組件的時候問題,隨著業務複雜度越來越高,代碼量會不斷的加大;由於相關業務的代碼需要寫到特定的vue實例,導致代碼可復用性不高,而Composition Api就是為瞭解決這個問題而生。

在vue2中,我們知道寫在data和computed中的數據才是響應式的,寫在methods中的函數才能在template的節點中使用。

所以 響應式數據 和 頁面方法 都和vue實例綁定在一起。假如,多個vue實例,每個實例都有msg屬性,changeMsg方法,如果不在每個實例分別定義,比較優雅的方法是可以通過mixin混入。

Composition Api把響應式數據和vue實例解耦,你可以通過調用特定方法(比如reactive、ref、computed)隨便在哪裡定義響應式數據,然後在vue實例的setup方法使用。

5.案例說明

在我們這個項目中,其實主要維護的數據結構有兩個:待完成數組(todoArray)和已完成數組(finishedArray)。

對數組的操作就是讀取數組和更新數組。

並且在待完成(Todo.vue)、已完成(Finished.vue)、新增任務(Add.vue)這三個組件都有對數據的操作。

file

如果不使用Composition Api,就要在每個組件中定義獲取和更新每個數據數據的方法。而使用Composition Api後,我們將所有數據操作寫在一個文件中(useData.js),組件中若有需要,可以引入這個文件。

import { computed, getCurrentInstance } from 'vue'

//封裝對todoArray的獲取和更新
export function useTodo () {
  const { proxy } = getCurrentInstance()  //獲取調用該方法的vue實例
  const todoArray = computed(() => proxy.$store.state.todoArray)  //定義計算屬性todoArray
  const updateTodo = (payload) => {   //定義方法
    proxy.$store.commit('SET_TODO_ARRAY', payload)
  }
  return {
    todoArray,
    updateTodo
  }
}

//封裝對finishedArray的獲取和更新
export function useFinished () {
  //... 和上面todoArray類似
}

//封裝對keepTimes的獲取和更新
export function useKeepTimes () {
  //... 和上面todoArray類似
}

在組件中使用(以Finished.vue為例):

<template>
  <h2>今日已完成任務</h2>
  <ul class="tasks task-finished">
    <li class="task-item" v-for="(item,index) in finishedArray" :key="index">
      <span class="task-text">{{item.name}}</span>
      <span class="flag-icon"></span>
    </li>
  </ul>
  <p>你已經對自己信守承諾<span class="keep-times">{{keepTimes}}</span>次,繼續加油哦!</p>
</template>
<script>
<script>
import { useFinished, useKeepTimes } from '../utils/useData.js'
export default {
  setup () {
    const { finishedArray } = useFinished()
    const { keepTimes } = useKeepTimes()
    return {          //在setup函數中return就可以在template中直接使用
      finishedArray,
      keepTimes
    }
  }
}
</script>

6.主進程

主進程中的代碼和之前項目基本一樣。可以在 入門篇 看主進程功能。

之前項目中,渲染進程對應的html文件都是用file://協議載入,而在這裡需要區分開發環境和生產環境。

在開發環境下,由於使用了webpack-dev-server,所以要訪問dev server的地址(process.env.WEBPACK_DEV_SERVER_URL)才能得到實時更新的頁面內容,而在生產環境下,使用file://協議。

//background.js
app.on('ready', async () => {
  mainWindow = new BrowserWindow({
    frame: false,
    resizable: false,
    width: 800,
    height: 600,
    icon: iconPath,
    webPreferences:{
      backgroundThrottling: false,
      nodeIntegration:true,
      contextIsolation: false
    }
  })
  if (process.env.WEBPACK_DEV_SERVER_URL) {
    // 開發環境下,訪問dev server的地址
    await mainWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL + '/main.html')
  } else {
    createProtocol('app')
    // 生產環境下,使用`file://`協議載入main.html
    mainWindow.loadURL(`file://${__dirname}/main.html`)
  }
  mainWindow.removeMenu()
  setTray ()
})

7.打包

直接執行命令:

npm run electron:build

打包生成的內容在 dist_electron 文件夾,直接基於預設配置打包,生成的dist_electron 文件夾內容如下:

file

點擊tasky-vue Setup 0.1.0預設是直接一鍵安裝,可以看到在桌面的應用圖標也是預設的。

file

怎樣定製打包,如製作圖標、打包格式、安裝行為等等,可以參考Electron應用的打包和自動更新--案例實戰,非常詳細 。

由於我們這裡使用的是Vue CLI Plugin Electron Builder,打包的配置需要放在vue.config.js中。

// vue.config.js

module.exports = {
  pages: { //多頁面打包
   ...
  },
  pluginOptions: {
    electronBuilder: {
      builderOptions: {
        // options placed here will be merged with default configuration and passed to electron-builder
        "appId": "this.is.tasky",
        "productName": "Tasky",
        "copyright": "Copyright © 2021 Alaso",
        "directories": {
          "buildResources": "build"
        },
        "mac": {
          "category": "public.app-category.utilities"
        },
        "dmg": {
          "background": "build/background.jfif",
          "icon": "build/icons/icon.icns",
          "iconSize": 100,
          "contents": [
            {
              "x": 380,
              "y": 180,
              "type": "link",
              "path": "/Applications"
            },
            {
              "x": 130,
              "y": 180,
              "type": "file"
            }
          ],
          "window": {
            "width": 540,
            "height": 380
          }
        },
        "win": {
          "target": [
            "msi",
            "nsis"
          ],
          "icon": "build/icons/icon.ico"
        },
        "nsis": {
          "oneClick": false,
          "language": "2052",
          "perMachine": true,
          "allowToChangeInstallationDirectory": true
        }
      }
    }
  }
}

三 、 雲端一鍵部署上線應用

1.上傳代碼

git add . 
git commit -m '添加你的註釋'
git push

2.在日常環境部署

一鍵進行應用部署。在應用詳情頁面點擊日常環境的「部署」按鈕進行一鍵部署,部署狀態變成綠色已部署以後可以點擊訪問部署網站查看效果。

file

3.配置自定義功能變數名稱線上上環境上線

配置線上環境自定義功能變數名稱。在功能開發驗證完成後要線上上環境進行部署,線上上環境的「部署配置」-「自定義功能變數名稱」中填寫自己的功能變數名稱。例如我們添加一個二級功能變數名稱 company.workbench.fun 來綁定我們部署的前端應用。然後複製自定義功能變數名稱下方的API網關地址對添加的二級功能變數名稱進行CNAME配置。

file

配置CNAME地址。複製好 API網關功能變數名稱地址後,來到你自己的功能變數名稱管理平臺(此示例中的功能變數名稱管理是阿裡雲的功能變數名稱管理控制台,請去自己的功能變數名稱控制台操作)。添加記錄的「記錄類型」選擇「CNAME」,在「主機記錄」中輸入你要創建的二級功能變數名稱,這裡我們輸入「company」,在「記錄值」中粘貼我們之前複製的 API網關功能變數名稱地址,「TTL」保留預設值或者設置一個你認為合適的值即可。

file

線上上環境部署上線。回到雲開發平臺的應用詳情頁面,按照部署的操作,點擊線上環境的「部署按鈕」,部署完成以後就在你自定義的功能變數名稱進行了上線。CNAME 生效之後,我們輸入 company.workbench.fun(示例網址) 可以打開部署的頁面。至此,如何部署一個應用到線上環境,如何綁定自己的功能變數名稱來訪問一個線上的應用就完成了,趕緊部署自己的應用到線上環境,用自己的功能變數名稱玩起來吧 ;)

file

一鍵創建Vue應用模版鏈接 :https://workbench.aliyun.com/application/front/create?fromConfig=34&fromRepo=sol_github_34

參考文獻:https://juejin.cn/post/6983843979133468708


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 系列文章: Linux Shell 常用命令 - 01篇 8. shell 中各種括弧的作用 參考 https://www.jb51.net/article/123081.htm https://www.jianshu.com/p/3e1eaaa3fee8 8.1 單小括弧 () 一般在命令替換的時 ...
  • 4、1 字元輸出 4-1 程式 迴圈輸出界面界面 // 4-1_文本輸出.cpp : 定義應用程式的入口點。 // #include "pch.h" #include "framework.h" #include "4-1_文本輸出.h" #define MAX_LOADSTRING 100 #de ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 前言 Qt6.22LTS版本正式推出了,剛好有個項目,使用的linux屏資源比較好,準備使用Qt6.22,記錄下在ubuntu20.04.3下安裝Qt6.22的步驟 一、安裝步驟 1.安裝ubuntu20.04.3 直接到ubuntu網站,下載該 ...
  • 由淺到深,逐步講解Redis 本書主要分為四大部分。 第一部分"數據結構與對象": 介紹了Redis中的各種對象及其數據結構,並說明這些數據結構如何影響對象的功能和性能。 第二部分"單機資料庫的實現": 對Redis實現單機資料庫的方法進行了介紹,包括資料庫、RDB持久化、AOF持久化、事件等。 第 ...
  • testPing.java public class testPing { public static void main(String[] args) { Jedis jedis = new Jedis("Redis節點所在的機器的IP",6379); System.out.println(jed ...
  • 1、記憶體管理部分 1.1 介紹下記憶體管理機制 在iOS中,使用引用計數來管理OC對象的記憶體 一個新創建的OC對象引用計數預設是1,當引用計數減為0,OC對象就會銷毀,釋放其占用的記憶體空間,調用retain會讓OC對象的引用計數+1,調用release會讓OC對象的引用計數-1 記憶體管理的經驗總結 M ...
  • HMS Core Discovery第14期直播《縱享絲滑剪輯,釋放視頻創作力》,已於4月21日圓滿結束,本期直播我們同HMS Core視頻編輯服務(Video Editor Kit)的產品經理和高級專家一起探討了視頻編輯服務的應用場景和圖像處理演算法、AI處理能力、高清低碼等技術細節,下麵我們一起來 ...
  • 1. 前言 站長以前介紹過這個開源項目,最近又有人在問,索性掛在Dotnet9網站上,方便大家線上瀏覽,先聲明,模板來自下麵的倉庫: 倉庫名: 大屏數據展示模板 作者:lvyeyou 開源協議:MIT 倉庫地址:https://gitee.com/lvyeyou/DaShuJuZhiDaPingZh ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...