英文官网:https://nuxt.com/

中文官网:https://www.nuxt.com.cn/

安装

1
npx nuxi@latest init <project-name>

1.初始化项目

1
npm create vite 项目名称 --template vue-ts

2.启动项目

1
cd 项目路径 && npm install && npm run dev

3.集成配置(别名)

1
npm i @types/node --save-dev

修改tsconfig.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{
"compilerOptions": {
// 别名
"typeRoots": [
"node_modules/@types",
"src/types"
],

"sourceMap": true,
"resolveJsonModule": true,
"esModuleInterop": true,
"baseUrl": "./",
"paths": {
"@": ["src"],
"@/*": ["src/*"]
},

"target": "ES2020",
"useDefineForClassFields": true,
"module": "ESNext",
"lib": ["ES2020", "ESNext","DOM", "DOM.Iterable"],
"skipLibCheck": true,

/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
"jsx": "preserve",

/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
}

修改tsconfig.node.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"compilerOptions": {
"target": "ES2022",
"lib": ["ES2023"],
"module": "ESNext",
"skipLibCheck": true,

/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,

/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
"include": ["vite.config.ts"]
}

修改vite.config.ts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 import { defineConfig } from "vite"
import vue from "@vitejs/plugin-vue"
import { resolve } from "path"

// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
"@": resolve(__dirname, "src")
}
},
server: {
port: 9000,
proxy: {
"/api": {
target: "http://127.0.0.1:8000",
changeOrigin: true,
rewrite: (path: string) => path.replace(/^\/api/, "")
}
}
}
})

3.代码风格

3.1集成tslint

1
2
npm i eslint eslint-plugin-vue --save-dev
npm i @typescript-eslint/eslint-plugin --save-dev

创建.eslintrc.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
module.exports = {
parser: 'vue-eslint-parser',

parserOptions: {
parser: '@typescript-eslint/parser',
ecmaVersion: 2020,
sourceType: 'module',
ecmaFeatures: {
jsx: true
}
},

extends: [
'plugin:vue/vue3-recommended',
'plugin:@typescript-eslint/recommended',
],

rules: {
// override/add rules settings here, such as:
}
};

创建忽略文件

1
2
3
node_modules/
dist/
index.html

修改package.json

1
2
3
4
5
6
7
8
9
{
...
"scripts": {
...
"eslint:comment": "使用 ESLint 检查并自动修复 src 目录下所有扩展名为 .js 和 .vue 的文件",
"eslint": "eslint --ext .js,.vue --ignore-path .gitignore --fix src",
}
...
}

3.2集成prettier

1
npm i prettier eslint-config-prettier eslint-plugin-prettier --save-dev

创建配置文件.prettierrc.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
module.exports = {
// 一行最多 80 字符
printWidth: 80,
// 使用 4 个空格缩进
tabWidth: 4,
// 不使用 tab 缩进,而使用空格
useTabs: false,
// 行尾需要有分号
semi: true,
// 使用单引号代替双引号
singleQuote: true,
// 对象的 key 仅在必要时用引号
quoteProps: 'as-needed',
// jsx 不使用单引号,而使用双引号
jsxSingleQuote: false,
// 末尾使用逗号
trailingComma: 'all',
// 大括号内的首尾需要空格 { foo: bar }
bracketSpacing: true,
// jsx 标签的反尖括号需要换行
jsxBracketSameLine: false,
// 箭头函数,只有一个参数的时候,也需要括号
arrowParens: 'always',
// 每个文件格式化的范围是文件的全部内容
rangeStart: 0,
rangeEnd: Infinity,
// 不需要写文件开头的 @prettier
requirePragma: false,
// 不需要自动在文件开头插入 @prettier
insertPragma: false,
// 使用默认的折行标准
proseWrap: 'preserve',
// 根据显示样式决定 html 要不要折行
htmlWhitespaceSensitivity: 'css',
// 换行符使用 lf
endOfLine: 'auto'
}

修改.eslintrc.js

1
2
3
4
5
6
7
8
9
10
11
12
module.exports = {
...

extends: [
'plugin:vue/vue3-recommended',
'plugin:@typescript-eslint/recommended',
'prettier',
'plugin:prettier/recommended'
],

...
};

修改package.json

1
2
3
4
5
6
7
8
9
{
...
"scripts": {
...
"prettier:comment": "自动格式化当前目录下的所有文件",
"prettier": "prettier --write"
}
...
}

4.搭建目录结构

5.集成第三方依赖

5.1集成vueuse

1
npm i @vueuse/core

5.2集成vue-router

1
npm i vue-router --save

5.3集成pinia

1
npm i pinia

5.4集成axios

1
2
npm i axios
npm i pinia-plugin-persistedstate

引入

1
2
3
4
5
6
7
8
9
import { createPinia } from "pinia"
import piniaPluginPersistedstate from "pinia-plugin-persistedstate"

const store = createPinia()

store.use(piniaPluginPersistedstate)

export default store

使用

1
2
3
4
5
6
7
8
import { defineStore } from 'pinia' 
export const useStore = defineStore('main', { state: () => {
return {
someState: 'hello pinia',
}
},
persist: true, //true即为存储,默认存储到localStorage,someState就是存储key值
})

5.5集成css

1
npm add -D sass

5.6 集成elementplus

1
npm install element-plus

完整引入

1
2
3
4
5
6
7
8
9
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'

const app = createApp(App)

app.use(ElementPlus)
app.mount('#app')

部分引入

1
npm i unplugin-vue-components unplugin-auto-import

修改vite.config.ts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

export default {
plugins: [
AutoImport({
resolvers: [ElementPlusResolver()],
}),
Components({
resolvers: [ElementPlusResolver()],
}),
],
}

5.7集成图标

1
2
3
4
npm install @element-plus/icons-vue

使用
import { Edit } from "@element-plus/icons-vue"

5.8 集成js-cookie

1
2
3
4
npm i js-cookie --save
npm i @types/js-cookie --save
# 由于ESLint默认使用Espree进行语法解析,无法识别TypeScript语法,因此我们需要安装@typescript-eslint/parser替代默认的解析器
npm install @typescript-eslint/eslint-plugin