iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 16
1
Modern Web

Nuxt - 使用 Vue.js 做 SSR 的第一哩路系列 第 16

16. Nuxt 全域設定檔 (nuxt.config.js),可以吃嗎?

前幾篇提過頁面細部設定,對某一頁調 <head>、改 transition等細部調整。

有些調整,突然 PM 希望套用到整個網站,該怎麼辦?
而前文介紹都會提及 全域單頁 的差別,有哪些設定可調呢?

這篇主要介紹各設定如何使用:


一開始不理解,通常不敢動,先來看 Nuxt 預設值

nuxt.config.js 預設值

module.exports = {
  mode: 'universal',

  /*
  ** Headers of the page
  */
  head: {
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' }
    ],
    link: [
      { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css?family=Roboto' }
    ]
  },

  /*
  ** Customize the progress-bar color
  */
  loading: { color: '#fff' },

  /*
  ** Global CSS
  */
  css: [],

  /*
  ** Plugins to load before mounting the App
  */
  plugins: [
  ],

  /*
  ** Nuxt.js modules
  */
  modules: [
  ],

  /*
  ** Build configuration
  */
  build: {
    /*
    ** You can extend webpack config here
    */
    extend(config, ctx) {

    }
  }
}

實用設定

介紹其中常用的部分

mode

Nuxt 除了編譯靜態頁面,另外提供兩種模式

  • 'universal': 同構架構(Isomorphic),有SSR+CSR(包含 client-side navigation)
  • 'spa': 僅有 CSR (包含 client-side navigation)

預設值

mode: 'universal'

head

Nuxt 全站套用的 <head> 設定,像 <title><meta><link>meta tag

參數同參考 vue-meta,舉幾個例

<title>網站標題 <- 定義標題句子,會填入 title 值</title>
head: {
  title: '網站標題',
  titleTemplate: '%s <- 定義標題句子,會填入 title 值',
  // titleTemplate: (titleChunk) => {
  //   /* function return 也可以 */
  //   return titleChunk ? `${titleChunk} - Site Title` : 'Site Title';
  // },
}
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="og:title" property="og:title" content="Test title - My page">
head: {
  meta: [
    { charset: 'utf-8' },
    { name: 'viewport', content: 'width=device-width, initial-scale=1' },
    {
      'property': 'og:title',
      'content': 'Test title',
      'template': chunk => `${chunk} - My page`, //or as string template: '%s - My page',
      'vmid': 'og:title'
    }
  ]
}
<link rel="stylesheet" href="/css/index.css">
<link rel="favicon" href="favicon.ico">
head: {
  link: [
    { rel: 'stylesheet', href: '/css/index.css' },
    { rel: 'favicon', href: 'favicon.ico' }
  ]
}

hid 比較特別,vue-meta 互蓋時,會用這唯一id判斷 meta tag 排列順序與覆蓋與否

head: {
  meta: [
    // hid is used as unique identifier. Do not use `vmid` for it as it will not work
    { hid: 'description', name: 'description', content: 'Meta description' }
  ]
}	

預設值

<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto">
head: {
  meta: [
    { charset: 'utf-8' },
    { name: 'viewport', content: 'width=device-width, initial-scale=1' }
  ],
  link: [
    { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css?family=Roboto' }
  ]
},

loading

Nuxt 全站套用的進度條設定,這複雜一點,有三種用法
前文 12. Nuxt 客製頁面效果 - 讀取(Loading) 提過

  1. 預設進度條元件的樣式

  2. 讀取效果對應哪個元件

  3. 效果觸發時機手動控制

    loading: false
    

    false 後,Nuxt 不會幫你觸發讀取效果
    控制權全然交給開發者,在頁面元件呼叫 開始(start)結束(finish)才會觸發

    export default {
      mounted () {
        this.$nextTick(() => {
          this.$nuxt.$loading.start()
    
          setTimeout(() => this.$nuxt.$loading.finish(), 500)
        })
      }
     }
    

預設值

白色進度條

loading: { color: '#fff' }

css

Nuxt 全域樣式,自動將陣列內 css 一一載入
若有裝 sass-loader,直接引用 scss/sass 也行

通常用來載入 讀取/轉場效果首屏 所需樣式

之前 07. Nuxt.js 頁面怎麼切會更好?以電商登入頁為例 用過

  css: [
    '@/assets/sass/all.sass'
  ]

預設值
空的,僅載 Nuxt pagelayoutdocument 寫的 style 樣式

  css: []

plugins

Nuxt Plugin 載入設定,列舉需要的 /plugin/*.js,並可設定執行環境

  plugins: ['~/plugins/my-plugin.js']
  /* 相當於此種寫法的縮寫 */
  /*
  plugins: [
    { src: '~/plugins/my-plugin.js', ssr: true }
  ]
  */

預設值
空的,不載入 plugin

  plugins: []

詳細使用與說明可參考 Nuxt Plugin 如何讓 Axios 更好用


上一篇
15. Nuxt 透過 fetch 動態產生內容,並在 Client 使用
下一篇
17. Nuxt 靜態資源 (Assets) 管理和引用
系列文
Nuxt - 使用 Vue.js 做 SSR 的第一哩路32

尚未有邦友留言

立即登入留言