Nuxtjs實現服務端渲染和靜態化站點

来源:https://www.cnblogs.com/jimojianghu/archive/2023/04/13/17292223.html
-Advertisement-
Play Games

本文將介紹如何使用Nuxtjs對vue項目進行ssr和靜態化處理。 Nuxtjs簡單介紹 首先,我們簡單瞭解下Nuxtjs框架,Nuxt.js是一個基於Vue的通用框架,主要用於解決Vue項目的服務端渲染(SSR)。 它本質上是一個Vue框架,增加一層node服務,通過對客戶端/服務端的抽象封裝,使 ...


本文將介紹如何使用Nuxtjs對vue項目進行ssr和靜態化處理。

Nuxtjs簡單介紹

首先,我們簡單瞭解下Nuxtjs框架,Nuxt.js是一個基於Vue的通用框架,主要用於解決Vue項目的服務端渲染(SSR)。
它本質上是一個Vue框架,增加一層node服務,通過對客戶端/服務端的抽象封裝,使用Nuxt各種資源配置,處理服務端渲染。
除了服務端渲染以外,Nuxtjs還提供生成靜態化站點的能力。

image

使用Nuxtjs

當我們需要進行SSR服務端渲染處理,使用Nuxtjs的時候,為了避免各種庫的版本相容等問題,建議使用官方提供的 create-nuxt-app 新建一個標準的nuxtjs項目,然後再將原有Vue項目代碼遷移過來。

創建一個新的Nuxtjs項目:

npx create-nuxt-app <項目名>
# 或
yarn create nuxt-app <項目名>

創建好新的Nuxtjs項目後,補充項目目錄結構,大致如下:

image

標註了基本結構,不一定所有結構都會用到,根據項目的不同情況進行使用。
Nuxtjs項目創建完成,建立好相應的目錄結構以後,就可以把對應Vue項目里的代碼遷移到Nuxtjs項目中。
大部分的頁面和組件都比較好遷移,直接複製拷貝就可以,但如果涉及到路由和狀態管理,需要特別處理,在介紹之前先看下Nuxtjs的配置文件。

Nuxt配置

先看下nuxt.config.js文件的基本結構,如下代碼:

export default {
  target: '',
  srcDir: '',
  head: {
    title: '',
    htmlAttrs: { lang: 'en' },
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { hid: 'description', name: 'description', content: '' },
      { name: 'format-detection', content: 'telephone=no' }
    ],
    link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]
  },
  css: [],
  plugins: [],
  components: true,
  buildModules: [],
  modules: [],
  build: {}
}

各個配置項對應不同的功能:

  • target
    部署目標,server(服務端渲染)和 static(靜態化站點)
  • srcDir
    配置項目的源碼路徑,如代碼文件方在 src 下,這裡就配置 ./src
  • head
    配置頁面head部分內容,該配置還能統一增加通用JS腳本如第三方統計sdk等
    也可以在pages目錄下的vue文件中自行定義每一頁的head內容
  • css
    定義全局樣式文件或第三方庫樣式等,如添加通用樣式:assets/style/reset.less
  • plugins
    第三方js庫或自定義全局插件等
  • modules
    添加Nuxtjs模塊到項目中,如添加 @nuxtjs/axios@nuxtjs/router
  • build
    在build的bundle.js中添加模塊,減少應用bundle的體積

路由和狀態管理

關於路由,正常情況下,Nuxtjs會依據頁面目錄(pages)結構自動生成路由配置。
但如果需要在項目中自定義添加較複雜的路由,可以使用 @nuxtjs/router 模塊進行處理:

  1. 安裝該模塊:npm install @nuxtjs/router
  2. 在配置文件中增加:modules: ['@nuxtjs/router']
  3. 在項目根目錄下增加路由文件 router.js,用於處理路由。

關於狀態管理,可以直接在根目錄結構下使用store目錄,Nuxtjs會自動找到store目錄,並引用 Vuex 模塊,構建整個項目的狀態管理。
這個過程和單獨的Vue項目大致一樣,只不過不用在代碼里引入store文件,其他使用方式也一樣:

import { mapGetters, createNamespacedHelpers } from 'vuex'
const { mapMutations } = createNamespacedHelpers('config')
export default {
  computed: {
  ...mapGetters([
    'isHad'
  ])
  },
  methods: {
  ...mapMutations([
    'setConfig',
    'initConfig'
  ])
  }
}

也可以使用 $store 進行操作:

this.$store.dispatch('config/setConfig', {})

命令腳本

接下來,看下package.json的命令腳本,Nuxtjs常用的scripts命令語句:

"scripts": {
  "dev": "nuxt",
  "build": "nuxt build",
  "start": "nuxt start",
  "generate": "nuxt generate"
}

其中,npm run build 用於服務端渲染;npm run generate 用於靜態化站點。
基於此,在這裡解釋下這些語句,簡單看看每些語句執行後,做了什麼:

  • npm run dev 單獨執行,會生成根目錄下的 .nuxt 目錄,但該目錄下不包括 dist 目錄
  • npm run build 也會生成根目錄下的 .nuxt 目錄,該目錄包含 distdist\clientdist\server
  • npm run generate
    • 如果設置配置文件 target: 'static', 則只會生成根目錄下的 dist 目錄,包含所有靜態資源
    • 如果配置文件沒設置 target, 則除了會生成根目錄下的 .nuxt 目錄(包含 distdist\clientdist\server),還生成根目錄下的dist 目錄(包含靜態資源)
  • npm run start 需要搭配 buildgenerate 命令一起使用:
    • 先執行 build 再執行 start,則使用 .nuxt 目錄的內容,target被設置成server
    • 先執行 generate 再執行 start,則使用 dist 目錄的內容
    • 如果 nuxt.config.js 配置中的 target: 'static',則 start 必須和 generate 一起使用

process

Nuxtjs存在兩個環境,一個用於運行服務端,一個用於運行客戶端,通過環境變數可以進行區分。
下麵,看下Nuxtjs中的 process 幾個環境變數:

  • process.server:用來標識當前環境是服務端Vue
  • process.client:用來標識當前環境是客戶端Vue
  • process.static:用來區分是否是 npm run generate 生成,為true則是,為false則否

如果 nuxt.config.js 中的 target: 'static',則 npm run devnpm run buildnpm run generate 中的 process.static 都是 true

process.client/process.server 是在執行打包命令的時候進行轉換的,這個時候會把服務端和客戶端的代碼分開打包,服務端的代碼在node環境中執行,客戶端的代碼一般在瀏覽器中執行。

它們的存在,對我們處理一些問題很有用,如只能在客戶端環境下執行的代碼要做區分(window、document等):

if (process.client) {
  document.addEventListener('click', (e) => {})
  window.addEventListener('resize', () => {}, false)
}

如上代碼,當使用了 process.client 進行判斷後,這部分代碼將只會打包在客戶端,就不會出現找不到對象的錯誤了。

Nuxtjs部署

有了以上關於Nuxtjs的介紹,特別是腳本命令,我們就能很容易搞定Nuxtjs的部署了。
Nuxtjs在部署上有三種方式:服務端渲染部署、靜態化站點部署、單頁面應用部署。

服務端渲染部署

設置nuxt.config.js:

target: 'server'

執行打包命令:

npm run build

執行命令後,將會在根目錄下生成一個 .nuxt 的目錄。

當我們要在伺服器上進行部署的時候,需要將Nuxtjs項目下的 .nuxt目錄、static目錄、nuxt.config.js、package.json 四個資源拷貝到伺服器上。
在伺服器上直接啟動,則執行以下命令:

# 安裝包:
npm run install

# 啟動:
npm run start

PM2 啟動

如果用PM2來啟動,也是先安裝包:npm run install
然後,可以新建一個PM2的啟動配置文件 ecosystem.json

{
  "app": [{
    "name": "appWeb",
    "script": "./node_modules/nuxt/bin/nuxt.js"
  }]
}

配置好 script 啟動腳本,直接啟動即可:

pm2 start ecosystem.json

靜態化站點部署

設置nuxt.config.js:

target: 'static'

執行打包命令:

npm run generate

生成的靜態文件位於根目錄的 dist 目錄(預設)下,直接將該文件拷貝web伺服器上即可。

靜態頁面JS無效

生成靜態文件時,會把pages下的每個頁面都生成一個對應的html頁面,但如果遇到該html頁面上的js無效的情況,需要特殊處理。
我在處理nuxtjs項目,進行靜態化導出的時候就碰到了JS無法執行的問題,最後使用在 layouts 佈局頁面中進行頁面處理才解決問題,具體如下:

  1. layouts 佈局頁面獲取路由path值:toPath: this.$route.path;
  2. 在佈局頁面中增加對應的頁面模塊:
import page1 from '../pages/page1'
import page2 from '../pages/page2'
<div class="layouts">
  <pp-header/>
  <page1 v-if="toPath.includes('page1')"/>
  <page1 v-if="toPath.includes('page1')"/>
  <pp-footer/>
</div>

通過路由字元串判斷,獲取當前路由信息,使用組件的方式載入對應的頁面。
這樣處理後,在使用 npm run generate 進行靜態化打包時,也會把對應頁面的內容替換進去。
最後生成html頁面,瀏覽器打開後JS都能執行。

而直接使用 <nuxt/> 雖然頁面內容效果一樣,但JS卻無法執行。

單頁面應用部署

設置nuxt.config.js:

mode: 'spa'

執行打包命令:

npm run build

這時候會自動生成dist文件夾目錄,部署到伺服器上即可。


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

-Advertisement-
Play Games
更多相關文章
  • ChatBox 是什麼 開源的 ChatGPT API (OpenAI API) 桌面客戶端,Prompt 的調試與管理工具,支持 Windows、Mac 和 Linux。 為什麼需要它 每次想訪問 ChatGPT 時,都需要在瀏覽器中輸入 ChatGPT 網址,然後點擊登錄,選擇賬號,整個過程中比 ...
  • 今天解決了我自認為一個很不起眼的Bug。 我的Tabs下麵有5個tabPane,並且這幾個tabPane共用了一個search組件,今天遇到了一個bug,就是這幾個組件使用公共查找組件的時候,前一個組件的值會影響下一個組件的值。 找了半天發現,原來我應該在父組件Tabs中定義一個useState的狀 ...
  • 項目忙完,這次上新,寫一個前端系列,採用vue3來開發一個微信公眾號商城。 前言: 1. 微信公眾號商城本質也是一個網站,由一個個網頁組成,只不過這些網頁運行在手機端,能響應手指的點擊、長按、拖拽等操作。 2. 既然是網頁,當然可以用3件套(js+html+css)來寫,但象vue這樣的前端框架比3 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 平時在使用v-for的時候,一般會要求傳入key,有沒有像我一樣的小伙伴,為了省心,直接傳索引index,貌似也沒有遇到過什麼問題,直到有一天,我遇到一個這樣的需求 場景 在一個下單界面,我需要去商品列表選商品,然後在下單界面遍歷顯 ...
  • 前端模板 - Anchor UI KIT 前言 今天介紹一款製作精良、開源、免費的 Bootstrap 模板 —— Anchor UI KIT 該模板使用的是Bootstrap v4版本 本文將介紹如何在Django中導入該模板的靜態資源包並使用 介紹 官方文檔 Anchor - a free Bo ...
  • Promise 是非同步編程的一種解決方案,比傳統的回調函數或事件更合理和更靈活。 Promise 方法 Promise的原型方法:then/catch/finally,這三種方法很常用,then用於處理Promise轉為fulfilled狀態時的代碼,catch用於處理Promise轉為reject ...
  • 我們是袋鼠雲數棧 UED 團隊,致力於打造優秀的一站式數據中台產品。我們始終保持工匠精神,探索前端道路,為社區積累並傳播經驗價值。。 本文作者:霜序(掘金) 前言 在我們的業務應用中越來越多的應用到編碼內容,例如在 API 中,給到後端的 SQL 都是通過 Base64 加密的數據等等。 能夠發現我 ...
  • 因為沒看見答案,所以也不知道對不對。 JavaScript 的垃圾回收機制是由 JavaScript 引擎自動管理的,通常情況下我們無法控制垃圾回收機制的執行時間和頻率。 然而,我們可以採取一些優化策略來減少垃圾回收的性能開銷,從而提高代碼執行速度。 減少全局變數:全局變數不易被垃圾回收,因為它們始 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...