nuxt:從零開始一個移動端項目(持續更新)


有關ssr的概念和優點的相關理論可以參考我的另外一篇博客

這篇主要記錄一下如何從零創建一個nuxt項目

參考:nuxt.js官網

P1.項目創建

nuxt.js官網有推薦使用create-nuxt-app命令一步創建一個nuxt項目,windows的話這里推薦使用cmd,不要使用git bash(因為使用git bash時一些需要方向鍵進行選擇的時候根本看不到你現在選擇的是哪項,比較難受)

我選的配置如下:

如果npx不可用,可能時npm版本過低,可以使用npm init nuxt-app <你的項目名> 

等安裝完成依賴,初始化的項目結構如下:

運行npm run dev就可以運行起來,如果初始化的項目都跑不起來,建議檢查一下自己的node或者npm版本是不是太低

P2. 路由

 nuxt.js內置vue-router,不需要修改router.js文件,只需要在pages目錄下創建對應文件夾,nuxt.js會自動生成路由配置。

pages/test/index.vue 對應的路由為 /test

pages/test/_testName.vue 是動態路由,nuxt.js里_開頭的為動態路由,可以由params中接收傳參,對應路由為 /test/xx ,其中xx為傳遞的數據

跳轉至動態路由的代碼如下

    testRoute() {
      this.$router.push({ name: 'test-testName', // 動態拼接name  params: { testName: Math.ceil(Math.random() * 10) // 參數key與路由名對應  } }) }

 P3.數據請求

nuxt.js內置axios插件,在nuxt.js中配置使用 。對請求的配置可以參考官網文檔

  modules: [
    '@nuxtjs/axios' ]

可以在nuxt實例中訪問到它,即window.$nuxt.$axios

但注意window對象在服務端渲染期間是無法訪問到的,如果想在服務端渲染期間進行請求,axios對象還會在asyncData與fetch中的參數上下文對象context中訪問到,如

asyncData({ $axios }) {
    // ...
} fetch({ $axios, store }) { // ... }

P4.fetch與asyncData

均在服務端渲染期間調用,支持請求完成后再展示首屏頁面

不同:

fetch用於更新vuex的state數據,asyncData可以更新組件內部數據。

相同:

1.都只在頁面組件(pages目錄下)下才會被調用,子組件的這兩個方法是沒用的。

2.都無法訪問到this,window,document

3.第一個參數都是上下文對象context,context 變量的可用屬性一覽:

屬性字段 類型 可用 描述
app Vue 根實例 客戶端 & 服務端 包含所有插件的 Vue 根實例。例如:在使用 axios 的時候,你想獲取 $axios 可以直接通過 context.app.$axios 來獲取
isClient Boolean 客戶端 & 服務端 是否來自客戶端渲染(廢棄。請使用 process.client )
isServer Boolean 客戶端 & 服務端 是否來自服務端渲染(廢棄。請使用 process.server )
isStatic Boolean 客戶端 & 服務端 是否來自 nuxt generate 靜態化(預渲染)(廢棄。請使用 process.static )
isDev Boolean 客戶端 & 服務端 是否是開發 dev 模式,在生產環境的數據緩存中用到
isHMR Boolean 客戶端 & 服務端 是否是通過模塊熱替換 webpack hot module replacement (僅在客戶端以 dev 模式)
route Vue Router 路由 客戶端 & 服務端 Vue Router 路由實例
store Vuex 數據 客戶端 & 服務端 Vuex.Store 實例。只有vuex 數據流存在相關配置時可用
env Object 客戶端 & 服務端 nuxt.config.js 中配置的環境變量,見 環境變量 api
params Object 客戶端 & 服務端 route.params 的別名
query Object 客戶端 & 服務端 route.query 的別名
req http.Request 服務端 Node.js API 的 Request 對象。如果 Nuxt 以中間件形式使用的話,這個對象就根據你所使用的框架而定。nuxt generate 不可用
res http.Response 服務端 Node.js API 的 Response 對象。如果 Nuxt 以中間件形式使用的話,這個對象就根據你所使用的框架而定。nuxt generate 不可用
redirect Function 客戶端 & 服務端 用這個方法重定向用戶請求到另一個路由。狀態碼在服務端被使用,默認 302 redirect([status,] path [, query])
error Function 客戶端 & 服務端 用這個方法展示錯誤頁:error(params) 。params 參數應該包含 statusCode 和 message 字段
nuxtState Object 客戶端 Nuxt 狀態,在使用 beforeNuxtRender 之前,用於客戶端獲取 Nuxt 狀態,僅在 universal 模式下可用
beforeNuxtRender(fn) Function 服務端 使用此方法更新 __NUXT__ 在客戶端呈現的變量,fn 調用 (可以是異步) { Components, nuxtState } ,參考 示例

兩個方法都必須做好錯誤捕獲,如果在執行過程中出現了錯誤,頁面會直接渲染失敗

P5.Plugins

 plugins是在app實例化之前加載完成的插件庫,包括第三方插件或者自制插件,在nuxt.config.js中配置,通過ssr屬性設置是在服務端時加載還是在客戶端時加載(服務端加載時無window和document)。

配置參考如下:

 plugins: [{
    src: './node_modules/lib-flexible/flexible.js', // 移動端適配
    ssr: false }, { src: '@/plugins/mint-ui.js', ssr: false }, { src: '@/plugins/lazyload.js', ssr: false }, { src: '@/plugins/vconsole.js', ssr: false }],

需要在plugins目錄下創建對應的文件,注意配置ssr為true時是無window對象的,因此如果需要window對象,需要將ssr設置為false

  

以引入vconsole為例

1.安裝vconsole依賴項

2.在plugins下創建vconsole.js,內容如下

import VConsole from 'vconsole'

const vc = process.env.NODE_ENV === 'development' ? new VConsole() : '' export default vc

3.在nuxt.config.js中plugins下配置如上,注意配置ssr為false,因為vconsole需要檢查和創建dom

P6.全局css與sass的全局樣式變量如何引入

nuxt.config.js中css屬性可以引入全局樣式文件、 模塊、第三方庫,如下

  css: [{
    src: 'mint-ui/lib/style.css', lang: 'css' }, { src: '~/assets/css/global.css', lang: 'css' }],

如果想引入sass的全局變量,需要啟用和配置styleResource:

    /**
   * 全局引入的其他樣式文件
   * 路徑不能使用~和@
   * See https://zh.nuxtjs.org/api/configuration-build/#styleresources
   */
  styleResources: {
    scss: './assets/css/index.scss', // less: ... // sass: ... },
  modules: [
    '@nuxtjs/style-resources'     // 支持引入全局scss
   ],

P7.移動端適配

簡單粗暴的話,可以考慮引入lib-flexible和postcss-px2rem插件

lib-flexible或者amfe-flexible可以考慮npm安裝,也可以直接將它們的構建結果的js直接引入到項目中,然后在plugins中引入,ssr設為false,可以參考上面plugins配置

postcss-px2rem或者pxcss-pxtorem安裝之后,在nuxt.config.js中設置如下

 build: {
    postcss: [
      require('postcss-px2rem')({ remUnit: 75, // 以設計稿750為參考 propList: ['*'] }), ], }

如果考慮自己實現,還需要處理nuxt的error頁面,不然報錯的時候emmmm

P8.部署

部署內容比較多,后續有時間了另整理一篇講部署的。

P9.緩存

提升nuxt項目性能的重要手段之一就是使用緩存。緩存是指在一段時間內不用重復計算,直接從緩存中取出來使用。可以分為幾個方面:組件數據緩存、api接口緩存、頁面緩存,參考下面那條鏈接,這一part主要實踐一下api接口緩存。

這一part記錄使用在現有nuxt項目中接入緩存,預計使用io-redis,參考資料如下:

https://juejin.cn/post/6844903623483195399


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM