基於 vite 創建 vue3 全家桶項目(vite + vue3 + tsx + pinia)

来源:https://www.cnblogs.com/youyacoder/archive/2022/09/13/16689614.html
-Advertisement-
Play Games

由於 vite 出現的時間不是很久,基於 vite 創建的項目沒有 vue-cli 那麼完整,如果要使用 vue 全家桶、ESLint 等,還需要開發人員手動添加和配置,步驟稍多,略繁瑣。雖然在創建項目時可以選擇 *Customize with create-vue*,但我由於網路問題,一直沒有成功... ...


vite 最近非常火,它是 vue 作者尤大神發佈前端構建工具,底層基於 Rollup,無論是啟動速度還是熱載入速度都非常快。vite 隨 vue3 正式版一起發佈,剛開始的時候與 vue 綁定在一起,但之後的 v2 版本便比較獨立,vite 不僅支持 vue,還支持 React、Preact、Vanilla 等前端庫。

由於 vite 出現的時間不是很久,基於 vite 創建的項目沒有 vue-cli 那麼完整,如果要使用 vue 全家桶、ESLint 等,還需要開發人員手動添加和配置,步驟稍多,略繁瑣。雖然在創建項目時可以選擇 Customize with create-vue,但我由於網路問題,一直沒有成功過。所以我封裝了一個 cli 用於快速創建基於 vite + vue3 的項目,如果各位覺得一步步手動添加和配置比較麻煩,可以使用我封裝併發布到 npmjs 上的腳手架 yyg-cli,使用 yyg-cli 目前只能快速創建 Vite + Vue3 全家桶的項目,後面會逐步更新對其他庫的支持。各位可以直接去文章最後查看 yyg-cli 的使用。

本文將一步步使用 vite 創建 vue3 項目,整合 vue 全家桶,實現基於 vue-cli 創建的項目的效果。整合的內容包括:

  1. vue3 + vite 2
  2. TypeScript、TSX
  3. ESLint Standard
  4. Sass
  5. Vue Router
  6. Pinia(狀態管理)
  7. Element Plus(含圖標全局註冊)

1 創建項目

1.1 創建項目

我習慣使用 yarn 代替 npm 作為包管理工具,某些依賴使用 npm 安裝會有各種問題。使用 yarn 創建項目:

yarn create vite

1)Project name 輸入項目名: vue3-vite-archetype

2)Select a framework 選擇框架:Vue

3)Select a variant 選擇變種(語言):TypeScript

image-20220909175245032

1.2 啟動項目

項目創建完成,按照命令行中的提示操作:

1)進入項目:cd vue3-vite-archetype

2)安裝依賴:yarn

3)啟動項目:yarn dev

控制台出現如下信息,則項目啟動成功,在瀏覽器中訪問控制臺中的地址:

image-20220909175737960

2 項目配置

2.1 添加編輯器配置文件

在根目錄下添加編輯器配置文件:.editorconfig

[*.{js,jsx,ts,tsx,vue}]
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
insert_final_newline = true

2.2 配置別名

vue開發過程中,在引入文件時,習慣使用 @ 代替 src,vite 預設是不識別的,例如 App.vue 中第4行(引入 HelloWorld 組件),如果修改為:

import HelloWorld from '@/components/HelloWorld.vue'

會出現如下錯誤:

image-20220909182201039

需要在 vite.config.js 配置路徑別名。

1)安裝依賴:

 yarn add @types/node -D

2)導入 path

import path from 'path'

3)在導出的對象中添加 resolve:

export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src')
    }
  }
})

同樣的,可以繼續在 alias 中給常用的目錄定義其他別名。

除了上面三步,還需要修改項目根目錄下 tsconfig.json 文件,在 compilerOptions 節點中添加兩個屬性配置 baseUrlpaths,如下:

{
  "compilerOptions": {
...
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  },
...
}

此時就不會報錯了,在項目中可以使用 @ 代替 src

2.3 處理 sass/scss

如果在工程中使用 scss,例如為 App.vue 中的 style 指定 lang="scss"

<style scoped lang="scss">

此時會出現錯誤,提示沒有找到 sass 依賴:

image-20220909182714077

添加 sass/scss 的支持,只需要安裝 sass 開發依賴即可:

yarn add sass -D

2.4 處理 tsx

1)添加開發依賴

yarn add @vitejs/plugin-vue-jsx -D

2)在 vite.config.ts 中配置該插件

import vueJsx from '@vitejs/plugin-vue-jsx'

...

export default defineConfig({
  plugins: [
    vue(),
    vueJsx(),
...
  ],
  ...
})

3 添加 ESLint

ESLint 主要用於代碼規範、統一代碼風格。

3.1 安裝依賴

首先安裝 eslint 為開發依賴:

yarn add eslint -D

3.2 初始化 ESLint 配置

接著執行命令初始化 eslint:

npx eslint --init

執行上述命令後,控制臺中會有如下步驟:

1)需要安裝 @eslint/create-config,問是否繼續: 當然需要繼續,直接回車;

2)使用 ESLint 來幹嘛:我選最後一個 To check syntax, find problems, and enforce code style(檢查語法、尋找問題、強制代碼風格)

3)使用哪種模塊化的方式:肯定選 JavaScript modules (import/export) (幾乎我參與的 vue 項目都是 ESModule)

4)項目使用什麼框架:Vue.js*

5)項目是否使用 TypeScript:Yes

6)項目運行在什麼環境:Browser

7)如何定義項目的代碼風格:Use a popular style guide 使用流行的風格

8)在流行的風格中選擇其中一種:Standard

9)ESLint 配置文件的格式:JavaScript

10)根據上面選擇的,提示需要安裝一大堆依賴,是否安裝?Yes

11)選擇使用什麼包管理工具安裝:yarn

接下來耐心等待安裝依賴。

依賴安裝完畢後,項目的根目錄下也會自動生成 .eslintrc.cjs 文件(可以將尾碼名重命名為 .js)。由於 eslint 預設整合的 vue 規範比較舊,咱們項目是 vue3,vue3 語法規則有些變化(如在 template 標簽下麵可以允許有多個節點等),這些變化會導致 eslint 校驗不太適用於 vue3,所以需要修改 eslint的部分配置,使其對 vue3 友好。將 extends 中的 'plugin:vue/essential' 修改為 vue3 的 'plugin:vue/vue3-essential' 即可。

3.3 修改配置

修改後 .eslintrc.cjs 配置如下:

module.exports = {
  root: true,
  env: {
    browser: true,
    es2021: true,
  },
  extends: [
    'plugin:vue/vue3-essential',
    'standard'
  ],
  parserOptions: {
    ecmaVersion: 'latest',
    parser: '@typescript-eslint/parser',
    sourceType: 'module'
  },
  plugins: [
    'vue',
    '@typescript-eslint'
  ],
  rules: {}
}

3.4 插件配置

上述步驟已經完成 eslint 的引入和配置了,接下來就是配置 vite 的 eslint 插件,該插件可以讓 vite 知道項目的 eslint 配置。

1)安裝插件為開發依賴:

yarn add vite-plugin-eslint -D

2)在 vite.config.js 中添加該插件:

//...
import eslint from 'vite-plugin-eslint'

export default defineConfig({
  plugins: [
    vue(),
    eslint()
  ],
//...
})

3.5 配置 Webstorm

WebStorm 對 ESLint 支持非常好,可以在 WebStorm 指定 ESLint 配置,並自動修正,在 WebStorm 的 Preferences 中按照下圖進行設置:

image-20220909191344197

4 添加 vue-router

4.1 安裝依賴

安裝 vue-router 依賴:

yarn add vue-router@next

4.2 創建測試頁面

src 中創建目錄 views,併在 src/views/ 中創建兩個文件 about.vuehome.vue,兩個 vue 文件的代碼分別如下:

home.vue

<template>
  <div class="home">
    <div>
      <a href="https://vitejs.dev" target="_blank">
        <img src="/vite.svg" class="logo" alt="Vite logo"/>
      </a>
      <a href="https://vuejs.org/" target="_blank">
        <img src="@/assets/vue.svg" class="logo vue" alt="Vue logo"/>
      </a>
    </div>
    <HelloWorld msg="Vite + Vue"/>
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue'
import HelloWorld from '@/components/HelloWorld.vue'

export default defineComponent({
  name: 'home',
  components: {
    HelloWorld
  }
})
</script>
<style scoped>
.logo {
  height: 6em;
  padding: 1.5em;
  will-change: filter;
}

.logo:hover {
  filter: drop-shadow(0 0 2em #646cffaa);
}

.logo.vue:hover {
  filter: drop-shadow(0 0 2em #42b883aa);
}
</style>

about.vue :

<template>
  <div class="about">
    <h1>This is an about page</h1>
  </div>
</template>

4.3 配置路由

src 目錄下創建目錄 router,併在 src/router 中創建 index.ts 文件,該文件用於定義路由和創建路由對象。

src/router/index.ts

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
import Home from '../views/home.vue'

const routes: Array<RouteRecordRaw> = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: () => import('@/views/about.vue')
  }
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})

export default router

4.4 引入配置配置

修改 src/main.ts,引入路由。修改後內容如下:

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import router from './router'

const app = createApp(App)
app.use(router)
app.mount('#app')

4.5 添加插座

修改 src/App.vue,添加鏈接和路由插座:

<template>
  <div id="nav">
    <router-link to="/">Home</router-link> |
    <router-link to="/about">About</router-link>
  </div>
  <router-view/>
</template>

樣式也可以調整一下,修改 src/style.css

body {
  margin: 0;
  display: flex;
  min-width: 320px;
  min-height: 100vh;
}
#app {
  max-width: 1280px;
  margin: 0 auto;
  padding: 2rem;
  text-align: center;
}
a {
  font-weight: 500;
  text-decoration: inherit;
}
a.router-link-exact-active {
  color: #42b983;
}
svg {
  width: 1em;
  height: 1em;
}

5 狀態管理 Pinia

在 vue2 一般採用 vuex 進行狀態管理,在 vue3 中推薦使用 PiniaPinia 相對 vuex 語法更簡潔、拋棄了 mutations 操作、 對 TypeScript 支持也更好、滿足 Vue3 的 Composition API,是最新一代輕量級狀態管理插件。按照尤大神的意思,vuex 將不再接受新的功能,推薦使用 Pinia

5.1 安裝依賴

使用 yarn 安裝 pinia 依賴:

yarn add pinia

5.2 創建根存儲

src/main.ts 創建一個根存儲 pinia,並傳遞給應用程式:

...
import { createPinia } from 'pinia'
...
app.use(createPinia())
...

5.3 定義 store

src 目錄下創建 store,併在 src/store 中創建 demo.ts 文件。該文件中咱們使用 Composition API 的方式實現 store

src/store/demo.ts

import { defineStore } from 'pinia'
import { ref } from 'vue'

const useDemoStore = defineStore('demo', () => {
  const counter = ref(0)

  const increment = () => {
    counter.value++
  }

  return {
    counter,
    increment
  }
})

export default useDemoStore

5.4 使用 store

上面創建了 store,接下來再 src/views/about.vue 中使用 store:

<template>
  <div class="about">
    <h1>This is an about page</h1>
    <h3>counter: {{counter}}</h3>
    <button @click="add">Ad Count</button>
  </div>
</template>

<script lang="ts" setup>
import useDemoStore from '@/store/demo'
import { storeToRefs } from 'pinia'

const demoStore = useDemoStore()
const { counter } = storeToRefs(demoStore)

const add = () => {
  demoStore.increment()
}
</script>

如此便實現了 pinia 狀態管理的 demo,在 about 頁面上點擊按鈕,會修改狀態 counter 的值。

image-20220910113005633

6 使用 Element Plus

Element UI 是很常用的中後臺管理界面的 vue UI庫,對應 Vue3 的版本名為 Element Plus

6.1 添加 Element Plus

1)安裝依賴:

yarn add element-plus

2)在 src/main.ts 中引入:

...
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

...
app.use(ElementPlus)
...

3)在 about.vue 中替換 button 按鈕測試:

<el-button @click="add">Ad Count</el-button>

6.2 全局註冊圖標

在 element-ui 中,安裝 element-ui 後便可以直接使用圖標,但 element-plus 需要單獨安裝依賴,併在使用圖標時引入對應的圖標組件。咱可以進行簡單的封裝,使之與 element-ui 中的用法一致。

1)安裝依賴:

yarn add @element-plus/icons-vue

2)在 src 下創建 utils/str-utils.ts ,定義駝峰命名轉中劃線命名的函數:

export const camelCaseToLine = (v: string): string => {
  return v.replace(/([A-Z])/g, '-$1').toLowerCase()
}

3)在 src/main.ts 中全局註冊所有圖標, 的方式進行使用:

...
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import { camelCaseToLine } from '@/utils/str-utils'

...

for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
  app.component(`el-icon${camelCaseToLine(key)}`, component)
}
...

4)在 about.vue 頁面上測試使用

<el-button @click="add">
  <el-icon-plus></el-icon-plus>
</el-button>

使用 圖標替換之前的文字 Add Count,效果如下:

image-20220910113236506

至此便完成了 vite + vue3 + vue router + pinia + element plus 的基礎整合了,步驟較多較繁瑣,大家可以使用 yyg-cli 省略上述步驟。

7 yyg-cli

yyg-cli 實現了上面的步驟,只需要一個命令便可以創建 vue3 全家桶項目。

首先使用 npm 全局安裝 yyg-cli

npm install -g yyg-cli

全局安裝成功後,使用 yyg create 命令便可創建項目,如創建名為 demo 的項目:

yyg create demo

輸入該命令後,按照自己項目的需求輸入項目描述版本號作者開發運行的埠號 (全部非必填,可以直接回車)。

然後詢問你是否要立即按照依賴,直接回車即可。最後選擇包管理工具,便開始自動安裝依賴。

image-20220911120050213

依賴安裝完成,進入項目根目錄,yarn dev 啟動項目即可。

yyg-cli 幫大家節省了手動整合和配置的時間。後續會引入對 ant-dhero-admin-ui 等的支持,實現開箱即用,快速創建企業級中後臺項目的基礎框架。

感謝你閱讀本文,如果本文給了你一點點幫助或者啟發,還請三連支持一下,點贊、關註、收藏,作者會持續與大家分享更多乾貨


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

-Advertisement-
Play Games
更多相關文章
  • 開心一刻 晚上,女兒眼噙淚水躺在床上 女兒:你口口聲聲說愛我,說陪我,卻天天想著騙我零花錢,你是我親爹嗎? 我:你想知道真相 女兒:想! 我:那你先給爸爸兩百塊錢! 環境準備 MySQL 不同版本 利用 docker 搭建了 7 個不同版本的 MySQL 5.5.62 5.6.51 5.7.36 8 ...
  • 問題解決秘籍 遇到問題,第一個請登錄蘋果開發者官網 檢查一遍賬號是否有許可權,是否被停用,是否過期,是否有協議需要同意,並且在右上角切換賬號後檢查所有關聯的賬號是否工作正常,apple賬號的郵箱也是個重要的地方,當有ipa上傳,賬號有發生變化,被停用,apple經常發送一些郵件,去檢查郵件通知,根據郵 ...
  • 在項目中出現多重嵌套情況時,會出現無法滑動的場景,比如經常碰到的場景 ViewPager -> Fragment -> RecyclerView -> RecyclerView | ViewPager 最外層是一個可滑動的 tabLayout+ViewPager,ViewPager 中是多個 Fra ...
  • AR作為一項增強現實技術,帶來了虛擬數字世界與現實世界的深度融合,這種虛實融合,不僅能應用於虛擬汽車展示、虛擬室內設計等視覺交互場景,更可通過動作交互控制虛擬世界場景,實現無邊界的人機互動。 比如人們在拍攝短視頻時,可以不接觸屏幕,僅通過做出特定手勢來控制特效切換;也可以在拍照時通過手勢識別控制快門 ...
  • Web 水印技術在信息安全和版權保護等領域有著廣泛的應用,對防止信息泄露或知識產品被侵犯有重要意義。水印根據可見性可分為可見水印和不可見水印(盲水印),本文將分別予以介紹,帶你探秘 web 水印技術。 ...
  • 前言 自成都九月份以來疫情原因被封了一兩周,居家著實無聊,每天都是盯著微信公眾號發佈的疫情數據看,那種頁面,就我一個前端仔來說,看著是真的醜啊!(⊙_⊙)?既然醜,那就自己動手開整!項目是2022.9.5開始的,截止2022.9.12我完成了大概有八成。主要是想讓數據更加直觀,而且可離線下載(當然還 ...
  • 跨域是什麼 簡單的講就是你在一個地方使用另一個地方的資源,被瀏覽器給擋下來了,不讓不用!當然,它擋下來是有自己理由的:為了安全(╬▔皿▔)╯。 解決跨域 我是用vue開發的,就vue代理模式解決跨域說明一下。 1、在vue.config.js中這樣寫: let devProxy = { //獲取ip ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 說明 基於uni-app開發,調用官方藍牙相關api實現連接藍牙與向藍牙熱敏印表機發送位元組流,可列印文字,二維碼,圖片,調整字體大小等,本文提供大概思路 結構 bluetooth.js 藍牙連接相關模塊封裝 commands.js 列印十 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...