Nuxt.js nuxt.config.js 設定檔

版本:nuxt 2.15.8

全名為 Nuxt configuration file,功能同 Vue 專案內 vue.config.js 檔,如果我們使用 create-nuxt-app 來建置專案,會自動產生這支檔案,在此配置的內容,會全域讀取設定。

接下來介紹一下一些常用的設定:

廣告

alias

路徑別名,大家還記得在 Vue 專案內,如果沒有設定路徑別名,則需要寫相對路徑(例如:../components/Navbar.vue),對於維護和開發都很不方便,一些程式碼檢核工具,甚至會視為 bad smell,因此我們會在 vue.config.js 檔內統一設定路徑別名。

Nuxt 專案很貼心的自動配置了路徑別名,預設值如下

{
'~~': `<rootDir>`,
'@@': `<rootDir>`,
'~': `<srcDir>`,
'@': `<srcDir>`,
'assets': `<srcDir>/assets`, // (unless you have set a custom `dir.assets`)
'static': `<srcDir>/static`, // (unless you have set a custom `dir.static`)
}

因此在引入元件 Navbar 時可以寫成 @/components/Navbar.vue

如果需要更改配置也可以

import { resolve } from 'path';
export default {
alias: {
'images': resolve(__dirname, './assets/images'),
'@static': resolve(__dirname, './static')
}
}

ssr

server side render,預設為 true,如果不需 SEO,只要 spa 操作,設定 ssr: false 即可

舊版會使用 mode: 'spa' 來進行設定,但官方文件有說明 v2.14.5 版本開始已棄用,改用 ssr: false

export default {
ssr: false // spa
}

server

用來設定 port(預設 3000) 跟 host(預設 localhost)

export default {
server: {
port: 8000,
host: 'my-website'
}
}

router

配置 Nuxt 路由(vue-router),這裡以設定 base url 舉例,其他請參考官方文件

export default {
router: {
base: '/backoffice/'
}
}

head

在 Vue 專案,我們要設定 head 內容,只要在 public/index.html 檔設定就好了,但 Nuxt 專案又該怎麼設定呢?

全域設定

在 nuxt.config.js 檔 head 內即可全域設定,通常在建立專案會預先帶入

export default {
head: {
title: 'test',
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' }
]
}
}

這樣所有頁面都可以讀到 head 設定

單頁設定

Nuxt 專案很重要的一點是 SEO 效能優化,基於這點,通常會需要依照各頁設定自己的 SEO,例如pages/about.vue 頁面的 title 和 description 要單獨設定,方法也很簡單

export default {
head: {
title: '關於我們',
meta: [
{
hid: 'description',
name: 'description',
content: '這是關於我們頁面'
}
]
}
}

在各頁面設定的內容優先度較高,會覆寫全域設定的 head 內容,因此當我們開啟 about 頁面,會看到 title 變成 關於我們description 變成 這是關於我們頁面,其他配置則依照 nuxt.config.js 檔

css

引入全域使用的 css 檔,像是外部套件,或是自訂檔,如果要使用 sass,必須安裝 sass-loader

npm install --save-dev sass sass-loader

export default {
css: [
// 外部套件
{ src: 'bootstrap-icons/font/bootstrap-icons.css' },
// scss 檔
{ src: '@/assets/scss/app.scss', lang: 'scss' }
]
}

plugins

全局引入外部套件,以 vue-notification 舉例,在 plugins 新增 notification.js 檔

// plugins/notification.js
import Vue from 'vue';
import Notifications from 'vue-notification';

Vue.use(Notifications);

在 nuxt.config.js 配置 plugins

export default {
plugins: [
{ src: '@/plugins/notification.js' }
]
}

就可以在所有頁面中使用該套件 <Notifications></Notifications>

components

如設定為 true,會全局引入元件,使用方式只要遵循資料夾結構輸入元件名稱就可以了

export default {
components: true
}

範例:

元件路徑:components/home/Banner.vue

使用元件:<HomeBanner></HomeBanner>

buildModules

用來配置只在開發環境使用的模組,註冊在此可以讓專案在生產環境部署速度提升,並減少 node_modules 容量,詳情可以參考各套件的配置建議

@nuxtjs/eslint-module 套件官方建議配置於 buildModules

export default {
buildModules: [
'@nuxtjs/eslint-module'
]
}

使用條件:Nuxt 版本必須大於 v2.9

modules

用來配置開發環境與生產環境共用模組,buildModules 及 modules 配置位置詳請參考各套件建議

export default {
modules: [
'@nuxtjs/style-resources'
]
}

styleResources

用來注入全域共用 sass, scss,如果不引入,在各頁面(.vue)內的 style 會無法使用像是 mixin 等的常用變數,或是要在各頁面單獨 @import scss 檔

首先必須另外安裝 @nuxtjs/style-resources 套件

執行:npm i @nuxtjs/style-resources

在 nuxt.config.js 檔設定

export default {
modules: [
'@nuxtjs/style-resources'
],
styleResources: {
scss: [
'@/assets/scss/components/_color.scss',
'@/assets/scss/components/_mixin.scss'
]
}
}

這樣就可以達到變數共用了

官方文件 提到,請勿引入實際的 css 樣式,因為每個頁面跟元件都會重複編譯,造成系統極大負擔(筆者踩坑過OQ),建議只注入變數, mixins,因為這些值在編譯後就會消失了。

build

客製化 webpack 設定,這裡舉例,在開發時,發現在 Vue 樣板無法使用可選串連 Optional Chaining(es2020語法),研究後發現必須需安裝擴充套件

npm install vue-template-babel-compiler --save-dev

接著在 nuxt.config.js 檔設定,就可以成功使用囉

export default {
build: {
loaders: {
vue: {
compiler: require('vue-template-babel-compiler')
}
}
}
}

Loading

Loading 效果,基礎設定如下(參數選項

export default {
loading: {
color: 'black',
height: '5px',
continuous: true
}
}

如果想自訂更多樣式,也可以包裝成元件後引入

export default {
loading: '@/components/TheLoading.vue'
}

env

用來定義全局共用的環境變數,Nuxt 專案預設只有 nuxt.config.js 檔內可以讀取環境變數,

因此如果要讓 .vue 檔或是 .js 檔讀到變數,這裡提供以下兩個做法:

方法一:直接在 nuxt.config.js 檔內配置屬性
export default {
env: {
BASE_URL: process.env.BASE_URL
}
}

但有時變數多,不想各別配置,可以採用方法二

方法二:安裝套件 @nuxtjs/dotenv

執行:npm i @nuxtjs/dotenv,在 modules 內設定:

export default {
modules: [
'@nuxtjs/dotenv'
]
}

這樣就可以全域使用 .env 變數囉。

專案如果有區分開發跟生產環境 .env 檔,也可以設定如下:

export default {
modules: [
[ '@nuxtjs/dotenv', { filename: `.env.${process.env.ENV}` } ]
]
}

使用方法二需注意,變數如果內含變數,會讀取不到第二層的變數(饒口),直接提供範例,假設在 .env 檔內有兩個變數
BASE_DOMAIN=my-websites
BASE_URL="http://${BASE_DOMAIN}"
在 .vue 檔直接使用 process.env.BASE_URL,取得值為 http://${BASE_DOMAIN},
無法解析成 http://my-websites,此情況還是需搭配方法一使用


參考文章:

https://ithelp.ithome.com.tw/articles/10207330

https://nuxtjs.org/docs/configuration-glossary

https://hackmd.io/@xq/nuxt-config

廣告
Nuxt.js 目錄結構 Nuxt.js 搭配 Axios 與自訂 Error Page

評論

廣告
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×