详细教程搭建 vue 项目

初始化

shell 复制代码
pnpm create vite my-vue-app

选择 vue + ts 项目

shell 复制代码
pnpm i

配置 prettier

shell 复制代码
pnpm add --save-dev --save-exact prettier

避免 prettier 和 eslint 冲突

shell 复制代码
pnpm add --save-dev eslint-plugin-prettier eslint-config-prettier
js 复制代码
// prettier.config.js
export default {
  tabWidth: 2, // 缩进
  useTabs: true, // 缩进方式
  semi: false, // 语句结尾是否加分号
  singleQuote: true, // 单引号
  printWidth: 120, // 换行长度
  arrowParens: "always", // 箭头函数参数
  bracketSpacing: true, // 对象花括号内是否加空格
  endOfLine: "auto", // 换行符
  vueIndentScriptAndStyle: true, // vue文件内script和style标签缩进
};

配置 eslint

shell 复制代码
pnpm create @eslint/config
js 复制代码
// eslint.config.js
import globals from "globals";
import pluginJs from "@eslint/js";
import tseslint from "typescript-eslint";
import pluginVue from "eslint-plugin-vue";
import pluginPrettierRecommendedConfigs from "eslint-plugin-prettier/recommended";
import parserVue from "vue-eslint-parser";
export default [
  // eslint 默认推荐规则
  pluginJs.configs.recommended,
  // ts 默认推荐规则
  ...tseslint.configs.recommended,
  // vue3 基础推荐规则
  ...pluginVue.configs["flat/recommended"],
  // prettier 默认推荐规则
  pluginPrettierRecommendedConfigs,
  {
    languageOptions: {
      globals: {
        ...globals.browser,
        ...globals.es2020,
        ...globals.node,
      },
      ecmaVersion: 2020,
      // 解决 Parsing error: Unexpected token )eslint 报错
      parser: parserVue,
      parserOptions: {
        parser: tseslint.parser,
      },
    },
  },
];

在 Vite 中引入 ESLint 插件,以便在开发阶段发现问题。

shell 复制代码
pnpm add -D vite-plugin-eslint
js 复制代码
// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// @ts-expect-error 由于 vite-plugin-eslint 库有点落后,导致 vite 高版本不能正确的识别 cjs 模块
import eslintPlugin from 'vite-plugin-eslint'

// https://vitejs.dev/config/
export default defineConfig({
	plugins: [vue(), eslintPlugin()],
})

配置 stylelint

shell 复制代码
pnpm add -D stylelint stylelint-config-html stylelint-config-prettier stylelint-config-standard stylelint-config-recess-order stylelint-config-recommended-scss stylelint-config-recommended-vue
js 复制代码
// .styleintrc.js
export default {
	// 继承推荐规范配置
	extends: [
		'stylelint-config-standard',
		'stylelint-config-recommended-scss',
		'stylelint-config-recommended-vue/scss',
		'stylelint-config-html/vue',
		'stylelint-config-recess-order',
	],
	// 指定不同文件对应的解析器
	overrides: [
		{
			files: ['**/*.{vue,html}'],
			customSyntax: 'postcss-html',
		},
		{
			files: ['**/*.{css,scss}'],
			customSyntax: 'postcss-scss',
		},
	],
	// 自定义规则
	rules: {
		// 允许 global 、export 、v-deep等伪类
		'selector-pseudo-class-no-unknown': [
			true,
			{
				ignorePseudoClasses: ['global', 'export', 'v-deep', 'deep'],
			},
		],
	},
}

.stylelintignore

arduino 复制代码
dist
node_modules
public
.husky
.vscode

配置命令

json 复制代码
"script": {
    "lint:eslint": "eslint --fix",
	 "lint:format": "prettier --write --log-level warn \"src/**/*.{js,ts,json,tsx,css,less,vue,html,md}\"",
	 "lint:stylelint": "stylelint \"**/*.{css,scss,vue,html}\" --fix"
}

配置vscode

json 复制代码
// .vscode/settings.json
{
	"files.eol": "\n", // 文件结束符
	"eslint.format.enable": true, // 开启保存时自动修复
	"editor.codeLens": true, // 显示行号
	"editor.tabSize": 2, // 重新设定tabsize
	"editor.detectIndentation": false, // 禁用自动检测缩进
	// 将prettier设置为默认格式化程序(在编辑器中有可能被其他Formatter占用,所以将prettier设置为默认Formatter)
	"editor.defaultFormatter": "esbenp.prettier-vscode",
	// 关闭js/ts的默认format,统一用eslint进行格式化(tslint已经不维护了,所以转eslint吧)
	"javascript.format.enable": false,
	"typescript.format.enable": false,
	// 保存时自动格式化 (根据根目录下'.prettierrc文件配置项')
	"editor.formatOnSave": true,
	// Enable per-language
	"[html]": {
		"editor.defaultFormatter": "vscode.html-language-features",
		"editor.formatOnSave": true
	},
	"[vue]": {
		"editor.formatOnSave": true, // 交给 eslint
		"editor.defaultFormatter": "esbenp.prettier-vscode"
	},
	"[javascript]": {
		"editor.defaultFormatter": "esbenp.prettier-vscode"
	},
	// 什么类型的文件需要遵守stylelint规则
	"stylelint.validate": ["css", "less", "postcss", "scss", "sass", "vue"],
	// 为ESLint启用"保存时自动修复",并且仍然具有格式和快速修复功能
	"editor.codeActionsOnSave": {
		"source.fixAll": "always",
		"source.fixAll.stylelint": "always"
	},
	"[markdown]": {
		"editor.defaultFormatter": null,
		"editor.formatOnSave": false
	},
	"[json]": {
		"editor.defaultFormatter": "esbenp.prettier-vscode"
	},
	"[typescript]": {
		"editor.defaultFormatter": "esbenp.prettier-vscode"
	},
	"[scss]": {
		"editor.defaultFormatter": "stylelint.vscode-stylelint"
	}
}

配置 husky 和 commitlint

husky v9 目前对 windows 支持还有些bug,所以选择 v8 版本

shell 复制代码
pnpm i husky@8.0.3 -D

配置 package.json

json 复制代码
"scripts": {
   ...,
	"prepare": "husky install"
},
shell 复制代码
pnpm run prepare

添加 pre-commit hooks

shell 复制代码
pnpm i lint-staged -D

添加 package.json 配置:

json 复制代码
{
    "script":{
        "lint:eslint": "eslint --fix",
        "lint:format": "prettier --write --log-level warn \"src/**/*.{js,ts,json,tsx,css,less,vue,html,md}\"",
        "lint:stylelint": "stylelint \"**/*.{css,scss,vue,html}\" --fix",
        "lint:lint-staged": "lint-staged",
    },
    "lint-staged": {
		"*.{js,ts,jsx,tsx,vue}": [
			"pnpm run lint:eslint",
			"pnpm run lint:format"
		],
		"*.{css,scss,sass,less,vue,html}": [
			"pnpm run lint:stylelint"
		]
	},
}

然后,执行下列命令创建一个 pre-commit hook:

shell 复制代码
npx husky add .husky/pre-commit "pnpm run lint:lint-staged"

添加 commit-msg hook

shell 复制代码
pnpm install -D commitlint @commitlint/cli @commitlint/config-conventional

在项目根目录下新建 commitlint.config.cjs 配置文件,并执行命令添加 commit-msg hook:

shell 复制代码
npx husky add .husky/commit-msg "npx --no -- commitlint --edit ${1}"

接下来,在 commitlint.config.cjs 中设置提交信息规范,推荐使用 Angular 规范:

js 复制代码
module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [2, 'always', [
      'build', // 编译相关修改,例如发布版本、项目构建或者依赖的改动
      'feat', // 添加新功能
      'fix', // 修复bug
      'update', // 更新某功能
      'refactor', // 重构
      'docs', // 文档
      'chore', // 构建过程或辅助工具的变动,如添加依赖等
      'style', // 不影响代码运行的变动
      'revert', // 回滚到上一个版本
      'perf', // 性能优化
      'test', // 单元测试、集成测试等
    ],
    ],
    'type-case': [0],
    'type-empty': [0],
    'scope-empty': [0],
    'scope-case': [0],
    'subject-full-stop': [0, 'never'],
    'subject-case': [0, 'never'],
    'header-max-length': [0, 'always', 74],
  },
};
相关推荐
一颗花生米。10 分钟前
深入理解JavaScript 的原型继承
java·开发语言·javascript·原型模式
学习使我快乐0114 分钟前
JS进阶 3——深入面向对象、原型
开发语言·前端·javascript
bobostudio199515 分钟前
TypeScript 设计模式之【策略模式】
前端·javascript·设计模式·typescript·策略模式
勿语&1 小时前
Element-UI Plus 暗黑主题切换及自定义主题色
开发语言·javascript·ui
黄尚圈圈1 小时前
Vue 中引入 ECharts 的详细步骤与示例
前端·vue.js·echarts
浮华似水2 小时前
简洁之道 - React Hook Form
前端
正小安4 小时前
如何在微信小程序中实现分包加载和预下载
前端·微信小程序·小程序
_.Switch6 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一路向前的月光6 小时前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js
长路 ㅤ   6 小时前
vite学习教程06、vite.config.js配置
前端·vite配置·端口设置·本地开发