[Vue] Nuxt3 + Eslint + Prettier +Vscode 設定 — 讓 Eslint 自動排版 Nuxt 專案

Les Lee
一個小小工程師的隨手筆記
10 min readJul 4, 2022

最近因為接案需要,決定使用 Nuxt 作為快速開發的框架。發現一段時間沒觀注,前端環境真是日新月異。 Nuxt 竟然也迎來第三版了。

因此這次在設定環境時順便記錄了一下如何在專案中結合 Eslint + Prettier 與 Vscode 的自動風格檢查兼排版。

Nuxt

安裝

使用 npx 直接安裝

$ npx nuxi init <nuxt-app>

打開你的 nuxt-app

$ code nuxt-app

其中如果我們不希望我們的 .nuxt 相依專案以 .shim 的形式產生,我們先在 nuxt.config.ts 內將 shim 設成 false.

export default defineNuxtConfig({
typescript: {
shim: false
}
})

安裝相依套件

$ yarn install

到這邊這些前置作業完成之後,我們先啟動一次 nuxt 讓他生成自己的 .nuxt 專案。

$ yarn dev -o

Vscode

Prettier Eslint

Eslint

Eslint

Init

執行 npx eslint — init 初始化 .eslintrc.js 並自動安裝相關的 dependency,他會問你一些問題來據此產生相關的設定

You can also run this command directly using ‘npm init @eslint/config’.
npx: 40 安裝成功,花費 3.812 秒
✔ How would you like to use ESLint? · style
✔ What type of modules does your project use? · esm
✔ Which framework does your project use? · vue
✔ Does your project use TypeScript? · No / Yes
✔ Where does your code run? · browser
✔ How would you like to define a style for your project? · prompt
✔ What format do you want your config file to be in? · JavaScript
✔ What style of indentation do you use? · 4
✔ What quotes do you use for strings? · single
✔ What line endings do you use? · unix
✔ Do you require semicolons? · No / Yes
The config that you’ve selected requires the following dependencies:
eslint-plugin-vue@latest @typescript-eslint/eslint-plugin@latest @typescript-eslint/parser@latest
✔ Would you like to install them now? · No / Yes
✔ Which package manager do you want to use? · yarn

產生出來的 .eslintrc.js 會像是這樣

module.exports = {
“env”: {
“browser”: true,
“es2021”: true
},
“extends”: [
“eslint:recommended”,
“plugin:vue/essential”,
“plugin:@typescript-eslint/recommended”
],
“parserOptions”: {
“ecmaVersion”: “latest”,
“parser”: “@typescript-eslint/parser”,
“sourceType”: “module”
},
“plugins”: [
“vue”,
@typescript-eslint”
],
“rules”: {
}
}

Install Dependency

安裝相關的 dependency

$ yarn add -D eslint-plugin-vue@latest @typescript-eslint/eslint-plugin@latest @typescript-eslint/parser@latest eslint@latest typescript eslint-plugin-nuxt 

package.jsonscripts 中加上 “lint”: “eslint . — ext .ts,.vue” 然後使用 yarn lint 來測試 eslint 是否有生效.

![[image-20220704162435221.png]]

修改 .eslintrc 加入 nuxt 與 eslint 的相關套件

把配置文件中 `extends` 做如下的修改:

  • ”plugin:vue/essential” 改成 ”plugin:vue/vue3-recommended” (前者是 vue2 的設定, 後者為 vue3)
  • ”eslint:recommended” 改成 ”plugin:nuxt/recommended”
  • 刪除 plugins 內的 ”vue”
  • 如果檔案內出現 Component name should always be multi-word 的錯誤,這是因為 nuxt 提倡 vue 文件的 Component 應該要用 multi-word snack case 進行命名。我們可以在 rules 中增加 ”vue/multi-word-component-names”: 0 來關閉。

Prettier

Install Dependency

安裝 prettier, eslint-plugin-prettier, eslint-config-prettier 等相關套件

$ yarn add -D prettier eslint-plugin-prettier eslint-config-prettier
  • eslint-plugin-prettier: 讓我們可以在 .eslintrc.js 中直接在 rules 內使用 prettier/prettier 屬性設定 .prettierrc ,省去多增加這個 file 的 maintainance.
  • eslint-config-prettier : 會自動關掉所有不必要且可能會跟 Prettier 相衝的設定,讓我們可以在 eslint 中設定自己要的 rule。舉例來說如果 eslint 的 rule 和 prettier 的 rule conflict 的時候 (例如 eslint 限制了必须單引號,prettier 也限制了必须單引號,那麼如果用 eslint 驅動 prettier 來做檢查的話就會提示兩種 error 儘管他們都指向同一種錯誤。)此時這個 Plugin 就可以關閉額外的 error 顯示。

之後,一樣修改 .eslintrc 中的 extends 內容:增加 ’plugin:prettier/recommended’

extends: [
...,
"plugin:prettier/recommended",
...
]

此時可能會出現紅線佈滿每個檔案,這是因為 prettier 在偵測 rule 時,若是沒有發現 .prettierrc 在專案中的話,就會去往更 root 的地方找,有可能 root 的 prettier 設定與專案所需不符。

我們這時可以在 .eslintrc.js 中的 rules 中增加 prettier/prettier 的來告訴 prettier 我們的 eslint 要怎樣的規則,如此可以取代掉在專案中建立 .prettirerc

完整的 .eslintrc.js 最終會如下

module.exports = {
env: {
browser: true,
es2021: true,
node: true,
},
extends: [
‘plugin:vue/vue3-recommended’,
‘plugin:@typescript-eslint/recommended’,
‘plugin:nuxt/recommended’,
‘plugin:prettier/recommended’,
],
parserOptions: {
ecmaVersion: ‘latest’,
parser: ‘@typescript-eslint/parser’,
sourceType: ‘module’,
},
plugins: [
// “vue”,
@typescript-eslint’,
],
rules: {
indent: [‘error’, 2],
‘linebreak-style’: [‘error’, ‘unix’],
quotes: [‘error’, ‘single’],
semi: [‘error’, ‘always’],
‘vue/multi-word-component-names’: 0,
‘comma-dangle’: [
‘error’,
{
arrays: ‘always-multiline’,
objects: ‘always-multiline’,
imports: ‘never’,
exports: ‘never’,
functions: ‘never’,
},
],
‘vue/html-self-closing’: [
‘error’,
{
html: {
void: ‘always’,
normal: ‘always’,
component: ‘always’,
},
svg: ‘always’,
math: ‘always’,
},
],
‘prettier/prettier’: [
‘error’,
{
printWidth: 120, // 最大長度
tabWidth: 2, // tab 縮排 2 空格
useTabs: false, // 使用空格縮排
singleQuote: true, // js 單引號
semi: true, // 要有分號
trailingComma: ‘es5’, // 使用 es5 規則規範結尾的逗號
arrowParens: ‘avoid’,
},
],
},
};

此時我們再使用 ctrl+s 保存,應該就會發現可以自動格式化檔案了。

Trouble shooting

若是發現存檔後沒有如預期中自動格式化,可以檢查是否自己的 Vscode 預設格式化工具是 prettier-eslint

  • 使用 cmd + p (ctrl + p) ,輸入 > Format Document
  • 選擇 Prettier ESLint

之後再嘗試一次看看,基本上應該就要有反應了~

Reference

--

--

Les Lee
一個小小工程師的隨手筆記

對新事物總是興緻勃勃、嘗試新技術、解決新挑戰; 也時常陷入許多無謂的思索,卡在其中得不出答案。