Nuxt3正式版釋出,教你用vite+nuxt+pinia+vueuse搞定前端SSR專案

語言: CN / TW / HK

theme: cyanosis

作者:易師傅github

宣告:文章為稀土掘金技術社群首發簽約文章,14天內禁止轉載,14天后未獲授權禁止轉載,侵權必究!

前言

大家好,我是易師傅,一個專門搞前端的搬(touch)磚(fish)師傅 ~

翹首期盼,終於終於,穩定版的 Nuxt3 它來了,它帶著六親不認的步伐走過來了 ~

11 月 16 日,全球最大的 Nuxt 會議 Nuxt Nation 2022 線上舉行,並正式釋出了 Nuxt.js 3.0 的第一個穩定版本。

Nuxt3 是基於 ViteVue3 和 Nitro 的 Nuxt 框架的重構,具有一流的 Typescript 支援,且這次更新對核心進行了精簡,使之速度更快,體驗更好。

一、瞭解 SSR

在介紹 Nuxt3 之前,肯定要先介紹一波 服務端渲染,畢竟 Nuxt 就是一個基於 Vue.js 的服務端渲染應用框架;

什麼是 SSR

伺服器端渲染(Server-Side Rendering)是指由服務端完成頁面的 HTML 結構拼接的頁面處理技術,傳送到瀏覽器,然後為其繫結狀態與事件,成為完全可互動頁面的過程。

簡單理解就是html是由服務端寫出,可以動態改變頁面內容,即所謂的動態頁面。早年的 phpaspjsp 這些 Server page 都是 SSR 的。

為什麼使用 SSR

  • 網頁內容在伺服器端渲染完成,一次性傳輸到瀏覽器,所以 首屏載入速度非常快
  • 有利於SEO,因為伺服器返回的是一個完整的 html,在瀏覽器可以看到完整的 dom,對於爬蟲、百度搜索等引擎就比較友好;

二、Nuxt 3

苦於在 Nuxt3.0 RC 版本中的不穩定等等一系列問題,現在它終於穩定的釋出了 ~

Nuxt 是一個基於 Vue.js 的服務端渲染應用框架,如同 next 對於 react 一般;

更新 API 穩定性

Nuxt 3 帶有穩定的、生產就緒的 API 和 50 多個由社群和 Nuxt 團隊使用 Nuxt Kit 構建的支援模組

image.png

瀏覽器和 Node.js 支援

瀏覽器支援Nuxt 3 官方僅支援長期自動更新的瀏覽器,且更新過程不需要使用者的干預,例如 ChromeFirefoxSafari 等。

服務端支援Nuxt 3 目前支援 Node.js 14、16、18 和 19。Nuxt.js 團隊鼓勵大家使用 Node.js 的最新 LTS 版本,一旦它們被主要部署平臺廣泛採用,Nuxt.js 團隊就會將其推送。由於 14.x 即將結束支援,強烈建議更新到最新的 18.x 版本。

新特性包括:

  • 更輕量:以現代瀏覽器為目標的伺服器部署和客戶端產物最多可縮小 75 倍
  • 更快:基於 nitro 提供動態程式碼分割能力,以優化冷啟動效能
  • Hybrid:增量靜態生成和其他的高階功能現在都成為可能
  • Suspense:在任意元件和導航前後都可以獲取資料
  • Composition API:使用 Composition API 和 Nuxt 3 的 composables 實現真正的程式碼複用
  • Nuxt CLI:沒有任何依賴,幫你輕鬆搭建專案和整合模組
  • Nuxt Devtools:通過直接在瀏覽器中檢視資訊和快速修復實現更快地工作
  • Nuxt Kit:具有 Typescript 和跨版本相容性的全新模組開發
  • Webpack 5:更快的構建時間和更小的包大小,無需配置
  • Vite:使用 Vite 作為打包工具,體驗閃電般快速的 HMR
  • Vue 3:Vue 3 是你下一個 Web 應用程式的堅實基礎
  • TypeScript:使用原生 TypeScript 和 ESM 構建,無需額外步驟

更多新特性見官網文件

專案模板快速檢視

github 倉庫地址

三、初始化專案

  • Nodejs >= 16.11
  • pnpm >= 7.x

1.初始化: npx nuxi init first-nuxt-app

2.安裝依賴 ``` cd first-nuxt-app

yarn

yarn install

npm

npm install

pnpm

pnpm install ```

注意: 如果你用 pnpm 安裝依賴,請建立一個 .npmrc 檔案,且設定:

shamefully-hoist=true

再使用 pnpm 安裝

pnpm install

3. 執行

pnpm run dev

4. 訪問

開啟本地連結 http://localhost:3000/ 就可以開始訪問了

image.png

Q: 啊,這也太簡單了吧,那是不是就代表結束了,那我們就開始研發吧!

A: 好像是的,一時之間我竟然語塞,畢竟可以正常開啟訪問了 ~

5.思考:

我們看看倉庫程式碼(如下圖)

image.png

發現倉庫程式碼啥都沒有,就一個 app.vue,身為一個前端 er,一看這跟我們常見的前端框架目錄架構不一樣啊!

這不是在跟我開玩笑嗎?

別急嘛,您接著往下看 ~

四、配置 eslint + prettier + husky + commitlint

eslint + prettier程式碼質量程式碼風格 是我們必須要做的項任務,正所謂沒有規矩不成方圓;

husky + commitlintgit hooks提交檢測 我們也是必須要整合的;

這樣子的配置我之前文章講過許多,感興趣的可以參考我之前文章 《手把手教你用 vite + vue3 + ts + pinia + vueuse 打造企業級前端專案》和《非大廠的我們,如何去搞Vue/React Hooks和Utils的企業開源工具庫?

關於為什麼要有他們,如果你還有疑問,可以看看我的上一篇文章《前端規範都有哪些》的介紹;

五、新建常用目錄

我們剛剛講了,發現整個倉庫就一個 app.vue,那麼我們當然不能將就他啊,肯定是要折騰一番呀 ~

1. 新建 app(src) 目錄

mkdir src

並且把 app.vue 檔案移入到 src 目錄下

同時修改配置檔案 nuxt.config.tsts // http://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ srcDir: 'src/', })

再 pnpm dev 執行,發現跟上面初始化的一樣

2. 配置頁面路由目錄:pages

1.新建 src/pages 目錄: mkdir src/pages

2. 新建 src/pages/index.vue 首頁: touch src/pages/index.vue

3. 配置 src/pages/index.vue

``` ```

4. 修改 src/app.vue 入口 ``` ```

5. 再 pnpm dev 執行

image.png

大家再不煩想一下:到這裡如果你想配置一個列表頁或者詳細頁,應該怎麼去做呢?

3. 新增多個頁面靜態路由

正如上面所問的,如何去配置一個 列表頁 或者 詳細頁

其實配置方法很簡單,和上面的 src/pages/index.vue 首頁類似;

下面我們以 列表頁 為例:

1.新建 src/pages/list.vue 檔案: ``` ```

2. 在 src/pages/index.vue 配置路由跳轉

``` ``` 3. 預覽

image.png

<NuxtLink> 是 Vue Router 中 <RouterLink> 元件和 HTM L<a> 標籤的替代品;

關於 NuxtLink 的更多使用,可參考官方文件

根據上面的 src/pages/list.vue 檔案,我們可以得知頁面中 http://localhost:3000/list 就對應了這個檔案,所以如果把 list.vue 換成 detail.vue,路由地址就是 http://localhost:3000/detail 了;這就代表的這個頁面的靜態路由了 ~

4. 新增多個頁面動態路由

動態路由 顧名思義就是這個路由地址是可變的,是動態的;

使用場景一般就是文章的詳細頁,因為一般一篇文章會有對應的一個 id,那這個 id 就是動態的;

那如何去實現呢?

1. 新建 src/pages/[id] 目錄(目錄名一定要是 [id]): mkdir src/pages/[id]

2. 新建 src/pages/[id]/index.vue 檔案: ``` `` **3. 頁面中訪問:http://localhost:3000/[id]`**

其中 [id] 是一個動態的數字,可以是 http://localhost:3000/111,也可以是 http://localhost:3000/222

5. 新增 layouts 模板

熟悉 php 開發或者 jsp 的同學,肯定都會知道 服務端渲染 會有一個通用模板目錄,在 nuxt3 中也有,其目錄名叫 layouts

像一般通用的模板,例如 頭部 header底部 footer 之類的,也有一些較為通用的通用模板;

可能有些同學會問,這不就是一個公共元件嗎,幹嘛非得叫 layouts 模板;

額... 其實你這麼想也沒錯,但是不過他們還是有一些使用和渲染上的差異;

1. 新建 src/layouts 目錄

2. 新建 src/layouts/default.vue 預設檔案 ``` **3. 在全域性頁面中配置: `src/app.vue`(也就是每個頁面中都會有該模板)** ```

這樣你無論開啟哪個頁面都會存在該模板了;

4. 自定義模板(類似 header、footer)

新建 src/layouts/header.vue ``` ```

5. 使用自定義模板 ``` ```

6. 預覽

image.png

六、配置元件 components

熟悉 vue 或者 react 的同學,對元件一定不陌生,在 nuxt3 同樣集成了元件 components

只是在 Nuxt3 中會自動匯入您 components/ 目錄中的所有元件,也就是說當你想使用元件時,不要 import 了,直接使用即可;

1. 元件的使用指南

1. 新建 src/components 目錄

2. 新建 src/components/ListItem.vue 檔案 ``` **3. 在 `src/pages/list.vue` 檔案中使用** ```

根據程式碼,我們看到我們並沒有用 import 去匯入 ListItem.vue,還是正常的渲染了;

4. components 巢狀目錄元件使用

如果您在巢狀目錄中有一個元件,例如: components/ --| list/ ----| detail/ ------| Button.vue 那麼我們可以直接在其它地方使用: <ListDetailButton />

2. \ 元件

Nuxt 提供了 <ClientOnly> 專門用於僅在客戶端渲染元件的元件;

要僅在客戶端匯入元件,請在僅客戶端外掛中註冊該元件。

```

```

七、配置外掛 plugins

Nuxt 會自動讀取 plugins 目錄中的檔案並在建立 Vue 應用程式時載入它們;

你可以在檔名中使用 .server.client 字尾來讓外掛在 伺服器端客戶端 載入外掛;

1. 新建 src/plugins 目錄

2. 以 vue 指令為例:新建 src/plugins/directives.ts 檔案

export default defineNuxtPlugin((nuxtApp) => { nuxtApp.vueApp.directive('focus', { mounted (el) { el.focus() }, getSSRProps (binding, vnode) { // you can provide SSR-specific props here return {} } }) })

當然還有其它許多 vue 關聯的外掛,這裡就不一一舉例了;

八、用 composables 靈活配置 hooks

Nuxt 3 中使用該目錄時,composables/ 目錄將自動匯入,將 Vue 可組合項(Hooks)自動匯入到您的應用程式中,即不需要在其它地方 import

所以你如果寫一些通用的 hooks,只需放入該目錄下即可;

composables 的基本使用指南

1. 新建 src/composables 目錄

2. 新建 src/composables/useFoo.ts 檔案 export const useFoo = () => { return useState('foo', () => 'bar') }

3. 在 src/pages/index.vue 中使用

```

```

根據以上操作,你可以建立屬於你自己的 hooks

九、Nuxt 常用的 Hooks

以下 hooks 為內部整合的 API,不需要手動 import 匯入即可使用;

1. useAppConfig

訪問專案中的 Nuxt 配置 ``` const appConfig = useAppConfig()

console.log(appConfig) ```

2. useAsyncData

在頁面、元件和外掛中,您可以使用 useAsyncData 來訪問非同步返回的資料; const { data, pending, error, refresh } = await useAsyncData( 'mountains', () => $fetch('http://api.nuxtjs.dev/mountains') )

3. useFetch

顧名思義,這就是一個 fetch 請求;

在頁面、元件或者外掛中可以使用 useFetch 獲取任意URL資源。

useFetch是對useAsyncData包裝,自動生成key同時推斷響應型別,用起來更簡單。

const param1 = ref('value1') const { data, pending, error, refresh } = await useFetch('http://api.nuxtjs.dev/mountains',{ query: { param1, param2: 'value2' } })

4. useCookie

在頁面、元件和外掛中,可以使用 useCookie一個 SSR 友好的 hooks 來讀取和寫入 cookie。

```

```

5. useHead

Nuxt 提供 useHead 可組合項來新增和自定義 Nuxt 應用程式各個頁面的頭部屬性。

6. useRoute

useRoute 是一個在實際專案開發中使用較多的 hooks,主要返回當前路由的一些資料;並且必須在 setup 函式、外掛或路由中介軟體中呼叫。 ```

```

7. useRouter

useRouter 返回路由器的例項,並且必須在設定函式、外掛或路由中介軟體中呼叫。

ts const router = useRouter(); router.back(); router.forward(); router.go(); router.push({ path: "/home" }); router.replace({ hash: "#bio" });

更多 Hooks 等相關 API 請檢視官網文件

十、配置 pinia

pinia 我這裡就不做多的介紹了,簡單解釋就是與 vuex 類似的一個狀態管理器;

1. 安裝: bash pnpm install pinia @pinia/nuxt

2. 配置 nuxt.config.js ts // nuxt.config.js export default defineNuxtConfig({ // ... 其他配置 modules: [ // ... '@pinia/nuxt', ], })

3. 新建 src/stores/index.ts

4. 新建 src/stores/useUserStore.ts ``` import { defineStore } from 'pinia'

const USER_INFO = { userName: '易師傅', id: 1, sex: '男', }

export const useUserStore = defineStore('userInfo', () => {

const userInfo = reactive(USER_INFO)

return { userInfo, } }) ```

5. 使用 ```

```

至此就可以愉快的使用 pinia 了 ~

十一、配置 vueuse

VueUse 是一個基於 Composition API 的實用函式集合。

一句話:它就是一個工具函式包;

1. 安裝: bash pnpm install @vueuse/nuxt @vueuse/core

2. 配置 nuxt.config.js ts // nuxt.config.js export default defineNuxtConfig({ // ... 其他配置 modules: [ // ... '@vueuse/nuxt', ], })

3. 使用 VueUse 函式: ```

```

是的,就是這麼簡單

十二、配置 css/scss/less/stylus

css 的整合有多種方式,有使用原生 css 的,也有使用 lessscss 的,也有使用 stylus 的;

為了快速上手,這裡我就不一一介紹了,下面主要以 scss 為例;

1. 安裝: bash pnpm install sass --save-dev

2. 新建 src/assets/styles 目錄新增預設 default.scss scss $bgColor: rgb(125, 159, 172); $theme: red; 3. 在 nuxt.config.ts 中新增 scss 的配置 ts export default defineNuxtConfig({ vite: { css: { preprocessorOptions: { scss: { additionalData: '@import "@/assets/styles/default.scss";' } } } } })

3. 使用 ```

```

如果你想新增其它的 scss mixins 等方法,可自行新增

十三、其它

到這裡,專案的基本結構與目錄就 ok 了;

但是咱們試想一下,如果你的領導讓你去做 nuxt3 的 SSR 專案,你是不是應該考慮的更多?

其實目前咱們只是把專案搭建完了,專案上線後的伺服器的 打包部署效能壓測服務併發負載均衡等等都是需要咱們去考量的;

關於這些,我會在後面新開專欄細講,敬請期待 ~


另外,nuxt 中還有一些配置是沒有講到的,例如:

  • 其它 plugins 等可自行挖掘;
  • server 目錄下的 API 路由等;
  • middleware 路由中介軟體;
  • nuxt.config.ts 配置相關;
  • 等等

感興趣的可自行查閱官方文件

總結

目前 Nuxt3 穩定版已正式釋出,如若您想寫一個 SSR 專案,Nuxt3 不失為你的一個選擇;

專案模板地址:github

最後

該系列會是一個持續更新系列,關於 前端基建,筆者主要會從如下圖幾個方面講解,如果您想第一時間看到我的更新文章,可以關注我和我的《前端要搞基建》專欄

前端基建之路.png

專欄往期更新文章:

  1. 非大廠的我們,要如何去搞前端基建?
  2. 非大廠的我們,如何去卷一套標準的前端團隊規範?
  3. 非大廠的我們,如何去搞Vue/React Hooks和Utils的企業開源工具庫?
  4. 如何管理企業工具庫在pnpm monorepo多倉庫模式下的版本與發包

目前正集結一班大佬在寫開源工具庫(工具庫倉庫地址);

如果您對 前端工具庫 感興趣,歡迎加入我們 ~

如果您對 Vue Hooks 感興趣,想寫自己的 Hooks,歡迎加入我們 ~

如果您對 React Hooks 感興趣,想寫自己的 Hooks,歡迎加入我們 ~

聯絡 vx: JeddyGong(備註開源)


如果想跟我一起討論技術吹水摸魚, 歡迎加入前端學習群聊(群人數太多,只能加vx,望諒解) vx: JeddyGong

感謝大家的支援,碼字實在不易,其中如若有錯誤,望指出,如果您覺得文章不錯,記得 點贊關注加收藏 哦 ~

關注我,帶您一起搞基建 ~