Nuxt3 的生命周期和鉤子函數(五)

来源:https://www.cnblogs.com/Amd794/p/18275087
-Advertisement-
Play Games

摘要:本文詳細介紹了Nuxt3中的六個核心生命周期鉤子及其用法,包括build:done、build:manifest、builder:generateApp、builder:watch、pages:extend和server:devHandler:handler。內容涵蓋各鉤子的調用時機、參數、環... ...



title: Nuxt3 的生命周期和鉤子函數(五)
date: 2024/6/29
updated: 2024/6/29
author: cmdragon

excerpt:
摘要:本文詳細介紹了Nuxt3中的六個核心生命周期鉤子及其用法,包括build:done、build:manifest、builder:generateApp、builder:watch、pages:extend和server:devHandler:handler。內容涵蓋各鉤子的調用時機、參數、環境、功能描述及具體示例代碼,幫助開發者深入理解如何在Nuxt應用的構建、運行、開發及部署等階段自定義行為和邏輯。

categories:

  • 前端開發

tags:

  • Nuxt3
  • 生命周期
  • 鉤子函數
  • Web開發
  • 前端框架
  • 自定義構建
  • 伺服器渲染

image
image

掃碼關註或者微信搜一搜:編程智域 前端至全棧交流與成長

鉤子:build:done

參數:nuxtApp

環境:Nuxt.js

描述:build:done是 Nuxt.js 的一個生命周期鉤子,它在應用的打包構建過程完成後被調用。這個鉤子允許開發者在構建過程結束後執行一些後續操作,比如清理臨時文件、生成額外的資源或者通知外部服務構建完成。

詳細解釋與用法:

  • 參數說明:nuxtApp參數是 Nuxt 應用實例的引用,它提供了對 Nuxt 應用的配置和內部狀態的訪問。
  • 使用場景:通常用於執行構建後的清理工作,或者對構建結果進行最後的修改。
  • 調用時機:在 Nuxt 的構建過程完全結束後,即所有文件都被編譯和優化之後。

案例Demo:

export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hook('build:done', async (builder) => {
    // 示例:構建完成後,列印構建信息
    console.log('構建完成!構建信息如下:');
    console.log(builder.stats);

    // 示例:清理構建目錄中的臨時文件
    await cleanUpTemporaryFiles();

    // 示例:發送構建完成的通知
    await notifyBuildCompletion();
  });

  async function cleanUpTemporaryFiles() {
    // 這裡是清理臨時文件的邏輯
    // 例如使用 Node.js 的 fs 模塊來刪除文件
    const fs = require('fs');
    const path = require('path');
    const tempFilePath = path.join(__dirname, 'temp-file.txt');
    
    if (fs.existsSync(tempFilePath)) {
      fs.unlinkSync(tempFilePath);
      console.log('臨時文件已清理');
    }
  }

  async function notifyBuildCompletion() {
    // 這裡是通知構建完成的邏輯
    // 例如發送 HTTP 請求到某個服務
    const axios = require('axios');
    await axios.post('https://example.com/build-completed', {
      message: '構建完成'
    });
    console.log('構建完成通知已發送');
  }
});

在這個案例中,build:done鉤子被用來列印構建信息、清理臨時文件,以及向外部服務發送構建完成的通知。這些操作有助於確保構建過程的完整性和後續的自動化流程。

鉤子:build:manifest

參數:manifest

環境:Vite 或 Webpack (用於服務端渲染的框架)

描述:build:manifest是 Vite 或 Webpack 在構建過程中生成清單(manifest.json)時調用的鉤子。清單文件通常包含了應用中所有靜態資源的哈希值,以便瀏覽器緩存管理和伺服器預載入。在
Nuxt.js 中,通過這個鉤子,開發者可以自定義 Nitro(Vite 的預渲染服務)在 HTML 中渲染的<link>標簽,以及影響資源的緩存策略。

詳細解釋與用法:

  • 參數說明:manifest是一個對象,包含了當前構建的清單內容,包括文件名、哈希值、版本等信息。
  • 使用場景:可以根據需要修改清單,比如添加或刪除特定資源,或者更改資源的緩存策略。
  • 示例用法:
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hook('build:manifest', async (manifest) => {
    // 示例:修改清單中的資源哈希值
    manifest['assets/images/my-image.png'].hash = 'new-hash-for-image';

    // 示例:添加自定義的清單項
    manifest['custom-manifest'] = {
      url: '/custom-manifest.json',
      revision: manifest.revision,
      hash: 'custom-manifest-hash'
    };

    // 示例:處理 Nitro 預渲染的 `<link>` 標簽
    if (nuxtApp.isServer) {
      const html = nuxtApp.renderToString();
      const modifiedHtml = html.replace(
        '<link rel="preload" href="/manifest.json">',
        '<link rel="preload" href="/custom-manifest.json">'
      );
      nuxtApp.render(modifiedHtml);
    }
  });
});

在這個案例中,build:manifest鉤子被用來:

  1. 修改my-image.png的哈希值,這可能會影響瀏覽器緩存。
  2. 添加一個自定義的清單項,如custom-manifest.json
  3. 如果是在伺服器端渲染(SSR)環境中,替換 Nitro 預渲染時使用的清單文件路徑。

請註意,Vite 和 Webpack 的具體用法可能略有不同,但基本原理相似,都是在構建階段對清單進行定製。

鉤子:builder:generateApp

參數:options

環境:Nuxt.js 用於生成靜態站點或預構建應用

描述:builder:generateApp是 Nuxt.js 在執行nuxt generatenuxt build --generate
命令,即生成應用程式(如靜態站點)之前調用的鉤子。這個鉤子允許開發者在生成過程開始時對生成的文件結構、內容或配置進行定製。

詳細解釋與用法:

  • 參數說明:options是一個對象,包含了生成應用時的配置和環境信息,如輸出目錄、模式(spa、ssr)、路由等。

  • 應用場景:

    • 可以修改輸出目錄或文件名,如重命名文件、創建子目錄結構。
    • 可以根據生成環境(如開發、生產)動態調整內容或配置。
    • 可能會用到options.context,它提供了生成過程中的上下文信息,如當前路由、頁面數據等。

示例用法:

export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hook('builder:generateApp', async (options) => {
    // 示例:修改輸出目錄
    options.outputDir = 'custom-output';

    // 示例:根據環境添加不同的內容
    if (options.mode === 'spa') {
      options.content.push({
        path: 'custom-spa-page.html',
        template: '<h1>Custom SPA Page</h1>'
      });
    } else {
      options.pages['/custom-server-page.vue'] = {
        template: '<h1>Custom Server Page</h1>'
      };
    }

    // 示例:使用 context 獲取當前路由信息
    const currentRoute = options.context.route;
    if (currentRoute.name === 'my-custom-route') {
      // 添加或修改特定路由的頁面內容
    }
  });
});

在這個案例中,builder:generateApp鉤子被用來:

  1. 修改生成的輸出目錄。
  2. 根據應用模式(SPA 或 SSR)動態添加或修改生成的內容。
  3. 利用context獲取當前路由信息,可能用於根據路由條件調整生成的頁面。

請確保在實際使用時,遵循 Nuxt.js 的最佳實踐和API規範。

鉤子:builder:watch

參數:event, path

環境:Nuxt.js 開發環境

描述:builder:watch是 Nuxt.js
在開發環境中使用的鉤子,當文件系統監視器檢測到項目中的文件或目錄發生變化時,此鉤子會被調用。這個鉤子允許開發者在文件變化時執行自定義邏輯,例如清除緩存、觸發自定義構建步驟等。

詳細解釋與用法:

  • 參數說明:

    • event:一個字元串,表示文件變化的類型,通常是add,change, 或unlink(刪除)。
    • path:一個字元串,表示發生變化文件的路徑。
  • 應用場景:

    • 當文件被修改時,清除某些緩存或臨時文件。
    • 當文件被添加或刪除時,觸發某些自定義的構建或編譯過程。

鉤子:pages:extend

鉤子:server:devHandler:handler

餘下文章內容請點擊跳轉至 個人博客頁面 或者 掃碼關註或者微信搜一搜:編程智域 前端至全棧交流與成長,閱讀完整的文章:Nuxt3 的生命周期和鉤子函數(五) | cmdragon's Blog

往期文章歸檔:


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

-Advertisement-
Play Games
更多相關文章
  • 今天我們來學習一個有意思的多行文本輸入打字效果,像是這樣: 這個效果其實本身並非特別困難,實現的方式也很多,在本文中,我們更多的會聚焦於整個多行打字效果最後的動態游標的實現。 也就是如何在文本不斷變長,在不確定行數的情況下,讓文字的最末行右側處,一直有一個不斷閃爍的游標效果: 單行文本打字效果 在此 ...
  • ★ 將File對象轉換為URL的兩種方式 方式一. URL.createObjectURL(object) 返回了一個DOMString包含了一個對象URL,該URL可用於指定源 object的內容。其參數為用於創建 URL 的File 對象、Blob 對象或者 MediaSource 對象。​ 方 ...
  • JavaScript 是一種弱類型語言,開發者經常需要判斷變數的數據類型。本文介紹了 typeof、instanceof、Object.prototype.toString.call 等常用的判斷方法,並討論了 typeof null 返回 object 的歷史原因。此外,還涵蓋瞭如何判斷箭頭函數、... ...
  • 零:前端目前形勢 前端的發展史 HTML(5)、CSS(3)、JavaScript(ES5、ES6):編寫一個個的頁面 -> 給後端(PHP、Python、Go、Java) -> 後端嵌入模板語法 -> 後端渲染完數據 -> 返回數據給前端 -> 在瀏覽器中查看 Ajax的出現 -> 後臺發送非同步請 ...
  • 摘要:本文深入解析了Nuxt3框架中的多個核心生命周期鉤子和組件註冊功能,包括imports:sources、imports:extend、imports:context、imports:dirs、components:dirs及components:extend,通過實例代碼指導開發者如何在不同場... ...
  • ★ 背景說明 在瀏覽器環境中,由於安全性限制,不能直接將網路圖片地址轉換成 File 對象。File 對象是用戶在客戶端上傳文件時才能創建的,而不能由前端代碼直接將網路圖片地址轉換成 File 對象。 ★ 解決方案 如果你想要將網路圖片地址轉換成 Fie 對象,你需要先將圖片下載到客戶端,然後再將其 ...
  • 腳本化CSS 我們剛講過如何獲取和設置行內樣式的值,但是我們開發不會所有樣式都寫在行內,同時js沒法獲取內嵌樣式表和外部樣式表中的值. 事實上DOM提供了可靠的API,得到計算後的樣式。 1. 獲取計算樣式表 只讀,不可寫 獲取的值是計算後的絕對值,不是相對值 window.getComputedS ...
  • ‍ 寫在開頭 點贊 + 收藏 學會 場景是用戶通過微信掃app內的收款碼,跳到一個h5頁面。然後完成支付。 代碼實現的整體流程: 使用微信掃碼,碼是app內生成的,碼的內容是一個h5頁面鏈接,掃碼完成後跳轉到自定義的h5支付界面。 掃碼進入後,將頁面展示所需要的參數進行緩存起來, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...