这是我参与「第五届青训营」伴学笔记创作活动的第 8 天
青训营大项目的前端准备使用Nuxt3,这篇文章主要记录项目的初始化过程。
项目使用pnpm作为包管理器
创建Nuxt3空白项目
运行Nuxt的初始化工具即可快速创建项目
pnpm dlx nuxi init juejin-fe
注:
此处的 juejin-fe 是自己的项目文件夹名称
pnpm dlx命令类似于 npm 中的npx命令。在pnpm中曾经也使用类似形式的命令pnpm,但是现在过时了。
等待片刻,空白项目就创建完成了
配置VSCode推荐扩展
因为涉及到团队协作,不同团队成员之间编辑器的一致性就很重要,为了方便团队成员安装相关插件,需要维护一份VSCode扩展列表
创建 .vscode 文件夹,在该文件夹下创建文件 extensions.json,内容如下
{
"recommendations": [
"vue.volar",
"vue.vscode-typescript-vue-plugin",
"esbenp.prettier-vscode",
"voorjaar.windicss-intellisense",
"dbaeumer.vscode-eslint"
]
}
这是一个VSCode自带的功能,当检测到 extensions.json 时,会读取里面的 recommendations 字段,并将相应的扩展推荐给开发者。
vue.volar - vue3开发所需要的扩展
vue.vscode-typescript-vue-plugin - vue3 TypeScript 开发所需要的扩展
esbenp.prettier-vscode - 根据 prettier 配置格式化文件
voorjaar.windicss-intellisense - windicss 语法提示
dbaeumer.vscode-eslint - eslint 语法检查
配置VSCode工作区设置
原因同上,节省大家开发的时间
{
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"css.lint.unknownAtRules": "ignore",
"less.lint.unknownAtRules": "ignore",
"scss.lint.unknownAtRules": "ignore",
"[scss]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[vue]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
}
editor.formatOnSave - 文件保存时进行格式化
source.fixAll.eslint - 当文件保存时,根据 eslint 规则修正文件格式
[css|scss|less].lint.unknownAtRules - 忽略未知的At Rules。因为开发使用了 windicss,倘若不进行此设置,其许多语法例如@apply @layer在VSCode中都会产生警告,影响开发。
editor.defaultFormatter - 设置每种文件的格式化扩展,这里全部设置成 Prettier
Prettier 配置
安装依赖
pnpm i -D prettier
新建文件 .prettierrc.json
{
"tabWidth": 2,
"useTabs": false,
"singleQuote": true,
"semi": false,
"arrowParens": "avoid",
"jsxBracketSameLine": true,
"endOfLine": "auto"
}
tabWidth - 缩进的宽度,这里设置成两个空格
useTabs - 使用制表符缩进,这里设置为 false(即使用空格)
singleQuote - 在能使用单引号的情况下尽量使用单引号
semi - 每行的末尾是否需要分号,这里设置为 false
arrowParens - 箭头函数是否需要括号,这里设置成 avoid,即在只有一个参数时,将省略括号
jsxBracketSameLine - 标签尾部 > 是否换行,这里设置不换行
endOfLine - 行尾时 crlf 还是 lf,这里设置从自动
ESLint 配置
安装依赖
pnpm i -D eslint eslint-config-prettier eslint-plugin-prettier @nuxt/eslint-config
新建文件 .eslintrc
{
"extends": [
"@nuxt",
"plugin:prettier/recommended"
],
"rules": {
"vue/multi-word-component-names": 0,
"vue/max-attributes-per-line": 0,
"vue/first-attribute-linebreak": 0,
"prettier/prettier": [
"warn"
]
}
}
首先Nuxt官方提供了许多语法规则包,这里通过 @nuxt 引入,接着引入 plugin:prettier/recommended 插件,让 eslint 支持 prettier 的检查
vue/multi-word-component-names - Vue组件需要多个单词,这里忽略(即允许单个单词)
vue/max-attributes-per-line - 忽略 vue 对每行属性的限制(和 prettier 冲突)
vue/first-attribute-linebreak - 忽略第一个属性换行(和 prettier 冲突)
prettier/prettier - prettier 语法检查的等级设置为警告(默认是 error)
Windicss 配置
安装依赖
pnpm i -D windicss nuxt-windicss
在 nuxt.config.ts 中添加 module
modules: ['nuxt-windicss'],
新增 windi.config.ts
import { defineConfig } from 'windicss/helpers'
interface IOpacityItem {
opacityVariable: string
opacityValue?: number
}
function withOpacityValue(variable: string) {
return ({ opacityValue }: IOpacityItem) => {
if (opacityValue === undefined) {
return `rgb(var(${variable}))`
}
return `rgb(var(${variable}) / ${opacityValue})`
}
}
export default defineConfig({
theme: {
extend: {
colors: {
primary: {
extralight: withOpacityValue('--color-primary-extralight'),
light: withOpacityValue('--color-primary-light'),
medium: withOpacityValue('--color-primary-medium'),
DEFAULT: withOpacityValue('--color-primary'),
dark: withOpacityValue('--color-primary-dark'),
},
gray: {
light: withOpacityValue('--color-gray-light'),
DEFAULT: withOpacityValue('--color-gray'),
dark: withOpacityValue('--color-gray-dark'),
},
blue: withOpacityValue('--color-blue'),
green: withOpacityValue('--color-green'),
black: withOpacityValue('--color-black'),
white: withOpacityValue('--color-white'),
},
},
},
})
新增了一个主题色 primary,以及相关的变种颜色 extralight light medium dark,使用一个工具函数 withOpacityValue 来处理css变量,在windicss语法包含透明度的时候,对变量包裹形式进行转换
在旧版本中,因为windicss 的 bug,withOpacityValue 函数无法正常处理阴影透明度,新版本已经修复了