Vue进阶之Vue项目实战(一)

Vue项目实战

  • 项目搭建
    • 初始化
    • eslint+版本约束
      • 版本约束
      • eslint配置
    • stylelint
    • cspell
    • cz-git
    • husky
      • 给拦截举个例子
    • zx

项目搭建

node版本:20.11.1
pnpm版本:9.0.4

初始化

vue3最新的脚手架

pnpm create vite byelide-demo --template vue-ts

请添加图片描述

pnpm i

请添加图片描述

pnpm dev

请添加图片描述
改端口号:
vite.config.ts:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

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

eslint+版本约束

版本约束

package.json

{
  "name": "byelide-demo",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "lint":"eslint --fix .",
    "build": "vue-tsc && vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "vue": "3.4.26"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "5.0.4",
    "typescript": "5.4.5",
    "vite": "5.2.10",
    "vue-tsc": "2.0.15",
    "eslint": "9.1.1"
  }
}

pnpm lint

eslint配置

package.json加:

 "eslint-plugin-vue":"9.25.0",
 "vue-eslint-parser":"9.4.2"

请添加图片描述
eslint.config.js:

import pluginVue from 'eslint-plugin-vue';
import vueEslintParser from 'vue-eslint-parser'

export default [
  {
    files:["**/*,.{ts,tsx,vue}"],
    rules: {
        semi: "error",
        "prefer-const": "error",
        "no-console":'error'
    }
  }
];

再执行:

pnpm i

最终版本:
eslint.config.js:

import js from "@eslint/js";
import pluginVue from 'eslint-plugin-vue';
// importSort插件功能是:项目中引入插件的顺序必须先是官方,后是自己的插件
import importSort from 'eslint-plugin-simple-import-sort';
import vueEslintParser from 'vue-eslint-parser'
import globals from 'globals';

export default [
  {
    languageOptions:{
      globals:{
        ...globals.browser,
        computed:"readonly",
        defineEmits:"readonly",
        defineExpose:"readonly",
        defineProps:"readonly",
        onMounted:"readonly",
        onUnmounted:"readonly",
        reactive:"readonly",
        ref:"readonly",
        shallowReactive:"readonly",
        shallowRef:"readonly",
        toRef:"readonly",
        toRefs:"readonly",
        watch:"readonly",
        watchEffect:"readonly"
      }
    }
  },
  {
    files:["**/*,.{ts,tsx,vue}"],
    ignores:[],
    rules: {
      ...js.configs.recommended.rules,
      ...pluginVue.configs['flat/recommended'].rules,
      "no-console":'error',
      'no-debugger':"error",
      "vue/valid-define-emits":"error",
      "simple-import-sort/imports":"error",
      "simple-import-sort/exports":"error"
    },
    languageOptions:{
      parser: vueEslintParser,
      parserOptions: {
        ecmaFeatures:{
          jsx:true
        },
        extraFileExtensions:[".vue"]
      }
    },
    // eslint 9.x 版本的插件注册方式
    plugins:{
      vue:pluginVue,
      "simple-import-sort":importSort
    }
  }
];

package.json

{
  "name": "byelide-demo",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "lint":"eslint --fix .",
    "build": "vue-tsc && vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "vue": "3.4.26"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "5.0.4",
    "typescript": "5.4.5",
    "vite": "5.2.10",
    "vue-tsc": "2.0.16",
    "eslint": "9.1.1",
    "@eslint/js":"9.1.1",
    "eslint-plugin-vue":"9.25.0",
    "vue-eslint-parser":"9.4.2",
    "globals":"15.1.0",
    "eslint-plugin-simple-import-sort": "12.1.0"
  }
}

安装插件

pnpm i

校验正确:

pnpm lint

stylelint

package.json:
scripts加入:

"lint:style":"stylelint **/*.vue",

加依赖,devDependencies加

"stylelint": "16.4.0",
"stylelint-config-recommended-vue":"1.5.0"

package.json:

{
  "name": "byelide-demo",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "lint":"eslint --fix .",
    "lint:style":"stylelint **/*.vue",
    "build": "vue-tsc && vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "vue": "3.4.26"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "5.0.4",
    "typescript": "5.4.5",
    "vite": "5.2.10",
    "vue-tsc": "2.0.16",
    "eslint": "9.1.1",
    "@eslint/js":"9.1.1",
    "eslint-plugin-vue":"9.25.0",
    "vue-eslint-parser":"9.4.2",
    "globals":"15.1.0",
    "eslint-plugin-simple-import-sort": "12.1.0",
    "stylelint": "16.4.0",
    "stylelint-config-recommended-vue":"1.5.0"
  }
}

插件化机制
就是这里用的plugin的思路 本来eslint只是基础的架子,但是能实现那么强的校验的规则和逻辑,就是因为它能够支持你通过插件注册的形式把你外部的和把所有权交给开发者,让开发者编写对应的规则来增强功能,这就是插件化(微内核)的思路

stylelint.config.js:

/** @type {import('stylelint').Config} */
export default {
  extends:['stylelint-config-recommended-vue'],
  rules: {
    "declaration-property-unit-allowed-list":{
      "font-size":["px"] //font-size只能用px单位 
    },
    "selector-disallowed-list":["/\\data-.+]/"]  //不能使用data-xx形式
  }
};

pnpm i

pnpm lint:style

cspell

package.json的scripts:

"spellcheck":"cspell lint --dot --gitignore --color --cache --show-suggestions \"src/**/*.@(html|js|cjs|mjs|ts|tsx|css|scss|md|vue)\"",

devDependencies加入:

"cspell":"8.7.0"

package.json:

{
  "name": "byelide-demo",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "lint":"eslint --fix .",
    "lint:style":"stylelint **/*.vue",
    "spellcheck":"cspell lint --dot --gitignore --color --cache --show-suggestions \"src/**/*.@(html|js|cjs|mjs|ts|tsx|css|scss|md|vue)\"",
    "build": "vue-tsc && vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "vue": "3.4.26"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "5.0.4",
    "typescript": "5.4.5",
    "vite": "5.2.10",
    "vue-tsc": "2.0.16",
    "eslint": "9.1.1",
    "@eslint/js":"9.1.1",
    "eslint-plugin-vue":"9.25.0",
    "vue-eslint-parser":"9.4.2",
    "globals":"15.1.0",
    "eslint-plugin-simple-import-sort": "12.1.0",
    "stylelint": "16.4.0",
    "stylelint-config-recommended-vue":"1.5.0",
    "cspell":"8.7.0"
  }
}

cspell.json:

{
  "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json",
  "version": "0.2",
  "dictionaryDefinitions": [
    {
      "name": "customs-words",
      "path": ".cspell/project-words.txt",
      "addWords": true
    }
  ],
  "dictionaries": ["project-words"],
  "ignorePaths": ["node_modules", "/project-words.txt"]
}

创建文件:
在这里插入图片描述
安装:

pnpm i

测试:

pnpm spellcheck

cz-git

package.json:
devDependencies中加:

"cz-git":"1.9.1",
"commitizen":"4.3.0"

package.json中加:

"config": {
    "commitizen": {
      "path": "node_modules/cz-git"
    }
  },

scripts中加:

"commit":"git-cz"

package.json:

{
  "name": "byelide-demo",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "lint":"eslint --fix .",
    "lint:style":"stylelint **/*.vue",
    "spellcheck":"cspell lint --dot --gitignore --color --cache --show-suggestions \"src/**/*.@(html|js|cjs|mjs|ts|tsx|css|scss|md|vue)\"",
    "build": "vue-tsc && vite build",
    "preview": "vite preview",
    "commit":"git-cz"
  },
  "config": {
    "commitizen": {
      "path": "node_modules/cz-git"
    }
  },
  "dependencies": {
    "vue": "3.4.26"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "5.0.4",
    "typescript": "5.4.5",
    "vite": "5.2.10",
    "vue-tsc": "2.0.16",
    "eslint": "9.1.1",
    "@eslint/js":"9.1.1",
    "eslint-plugin-vue":"9.25.0",
    "vue-eslint-parser":"9.4.2",
    "globals":"15.1.0",
    "eslint-plugin-simple-import-sort": "12.1.0",
    "stylelint": "16.4.0",
    "stylelint-config-recommended-vue":"1.5.0",
    "cspell":"8.7.0",
    "cz-git":"1.9.1",
    "commitizen":"4.3.0"
  }
}

pnpm i
git init
git add .
pnpm commit

请添加图片描述

创建commitlint.config.cjs文件:
中英对照配置

// .commitlintrc.js
/** @type {import('cz-git').UserConfig} */
module.exports = {
  rules: {
    // @see: https://commitlint.js.org/#/reference-rules
  },
  prompt: {
    alias: { fd: 'docs: fix typos' },
    messages: {
      type: '选择你要提交的类型 :',
      scope: '选择一个提交范围(可选):',
      customScope: '请输入自定义的提交范围 :',
      subject: '填写简短精炼的变更描述 :\n',
      body: '填写更加详细的变更描述(可选)。使用 "|" 换行 :\n',
      breaking: '列举非兼容性重大的变更(可选)。使用 "|" 换行 :\n',
      footerPrefixesSelect: '选择关联issue前缀(可选):',
      customFooterPrefix: '输入自定义issue前缀 :',
      footer: '列举关联issue (可选) 例如: #31, #I3244 :\n',
      confirmCommit: '是否提交或修改commit ?'
    },
    types: [
      { value: 'feat', name: 'feat:     新增功能 | A new feature' },
      { value: 'fix', name: 'fix:      修复缺陷 | A bug fix' },
      { value: 'docs', name: 'docs:     文档更新 | Documentation only changes' },
      { value: 'style', name: 'style:    代码格式 | Changes that do not affect the meaning of the code' },
      { value: 'refactor', name: 'refactor: 代码重构 | A code change that neither fixes a bug nor adds a feature' },
      { value: 'perf', name: 'perf:     性能提升 | A code change that improves performance' },
      { value: 'test', name: 'test:     测试相关 | Adding missing tests or correcting existing tests' },
      { value: 'build', name: 'build:    构建相关 | Changes that affect the build system or external dependencies' },
      { value: 'ci', name: 'ci:       持续集成 | Changes to our CI configuration files and scripts' },
      { value: 'revert', name: 'revert:   回退代码 | Revert to a commit' },
      { value: 'chore', name: 'chore:    其他修改 | Other changes that do not modify src or test files' },
    ],
    useEmoji: false,
    emojiAlign: 'center',
    useAI: false,
    aiNumber: 1,
    themeColorCode: '',
    scopes: [],
    allowCustomScopes: true,
    allowEmptyScopes: true,
    customScopesAlign: 'bottom',
    customScopesAlias: 'custom',
    emptyScopesAlias: 'empty',
    upperCaseSubject: false,
    markBreakingChangeMode: false,
    allowBreakingChanges: ['feat', 'fix'],
    breaklineNumber: 100,
    breaklineChar: '|',
    skipQuestions: [],
    issuePrefixes: [
      // 如果使用 gitee 作为开发管理
      { value: 'link', name: 'link:     链接 ISSUES 进行中' },
      { value: 'closed', name: 'closed:   标记 ISSUES 已完成' }
    ],
    customIssuePrefixAlign: 'top',
    emptyIssuePrefixAlias: 'skip',
    customIssuePrefixAlias: 'custom',
    allowCustomIssuePrefix: true,
    allowEmptyIssuePrefix: true,
    confirmColorize: true,
    scopeOverrides: undefined,
    defaultBody: '',
    defaultIssues: '',
    defaultScope: '',
    defaultSubject: ''
  }
}

pnpm commit

请添加图片描述

husky

husky是一个钩子工具,但是钩子本身不是husky的,钩子是属于git的
帮助轻松拦截hooks
git hooks提供的pre-commit等,可以在开发的时候,在提交对应的时机,发生一些作用。

package.json:
1.devDependencies:

"husky":"9.0.11"

2.scripts:

"prepare": "husky||true"

package.json:

{
  "name": "byelide-demo",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "lint": "eslint --fix .",
    "lint:style": "stylelint **/*.vue",
    "spellcheck": "cspell lint --dot --gitignore --color --cache --show-suggestions \"src/**/*.@(html|js|cjs|mjs|ts|tsx|css|scss|md|vue)\"",
    "build": "vue-tsc && vite build",
    "preview": "vite preview",
    "commit": "git-cz",
    "prepare": "husky"
  },
  "config": {
    "commitizen": {
      "path": "node_modules/cz-git"
    }
  },
  "dependencies": {
    "vue": "3.4.26"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "5.0.4",
    "typescript": "5.4.5",
    "vite": "5.2.10",
    "vue-tsc": "2.0.16",
    "eslint": "9.1.1",
    "@eslint/js": "9.1.1",
    "eslint-plugin-vue": "9.25.0",
    "vue-eslint-parser": "9.4.2",
    "globals": "15.1.0",
    "eslint-plugin-simple-import-sort": "12.1.0",
    "stylelint": "16.4.0",
    "stylelint-config-recommended-vue": "1.5.0",
    "cspell": "8.7.0",
    "cz-git": "1.9.1",
    "commitizen": "4.3.0",
    "husky": "9.0.11"
  }
}

pnpm i
npx husky init

请添加图片描述
pre-commit:预提交 执行提交后会先预提交一下,失败的话全部打回,不会提交
pre-commit:


pnpm lint && pnpm lint:style && pnpm spellcheck &&
npm test

给拦截举个例子

package.json:
scripts:

"commitlint":"commitlint --edit $1"

devDependencies:

"commitlint":"19.3.0"

在.husky/_/commit-msg文件写入:

pnpm commitlint ${1}

pnpm i
git add .
git commit -m “xxxx”

xxxx不允许通过
请添加图片描述

zx

用JavaScript方式写脚本
以后写脚本的时候可以尝试用zx写
package.json:
1.devDependencies:

"zx":"8.0.2"

2.创建文件pre-commit.mjs 在husky/pre-commit.mjs
里面写zx的配置。可以参考zx官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/591150.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年 Java 面试八股文——Mybatis篇

目录 1. 什么是Mybatis? 2. 说说Mybatis的优缺点 3. Xml映射文件中,都有哪些标签 4. #{}和&{}有什么区别 5. Mybatis是如何进行分页的,分页插件的原理是什么 6. Mybatis是如何将sql执行结果封装为目标对象并返回的? 7. Mybatis是怎…

【副本向】Lua副本逻辑

副本生命周期 OnCopySceneTick() 子线程每次心跳调用 --副本心跳 function x3323_OnCopySceneTick(elapse)if x3323_g_IsPlayerEnter 0 thenreturn; -- 如果没人进入,则函数直接返回endif x3323_g_GameOver 1 thenif x3323_g_EndTick > 0 thenx3323_CountDown…

简化Transformer模型,以更少的参数实现更快的训练速度

在深度学习领域,Transformer模型因其卓越的性能而广受欢迎,但其复杂的架构也带来了训练时间长和参数数量多的挑战。ETH Zurich的研究人员Bobby He和Thomas Hofmann在最新研究中提出了一种简化的Transformer模型,通过移除一些非必要的组件&…

STM32——GPIO篇

技术笔记! 1. 什么是GPIO? GPIO是通用输入输出端口(General-purpose input/output)的英文简写,是所有的微控制器必不可少的外设之一,可以由STM32直接驱动从而实现与外部设备通信、控制以及采集和捕获的功…

wordpress子比主题美化-为图文列表封面添加动态缩略图特效 多种效果演示

wordpress子比主题-为图文列表文章封面添加动态缩略图特效 给自己子比主题加一个列表文章封面添加动态缩略图 直接复制以下代码,添加到主题自定义CSS代码中即可,下图为效果演示 wordpress子比主题-为图文列表文章封面添加动态缩略图特效 给自己子比主题…

MySQL①——数据库与表格的创建

今日任务: 创建一个名为“db_classes”的数据库 创建一行名为“db_hero”的表 将四大名著中的常见人物插入这个英雄表 数据库的创建与删除 create 命令(创建): create database 数据库名;#参数默认create database …

Spring MVC(上)

initApplicationEventMulticaster为上下文初始化 simpleApplicationEventMulticaster怎么处理广播事件的 refisterListeners注册监听器 finishBeanFactoryInitialization初始化非延迟bean 惰性初始化 dispatcherServlet的初始化 servletConfigPropertyValues创建propertyValues…

虚拟化技术 安装并配置ESXi服务器系统

安装并配置ESXi服务器系统 一、实验目的与要求 1.掌握创建VMware ESXi虚拟机 2.掌握安装VMware ESXi系统 3.掌握配置VMware ESXi系统的管理IP 4.掌握开启VMware ESXi的shell和ssh功能的方法 二、实验内容 1.安装VMware workstation 15或更高版本 2.创建VMware ESXi虚拟…

软件杯 深度学习的动物识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

分布式事务—> seata

分布式事务之Seata 一、什么是分布式事务? 分布式事务是一种特殊类型的事务,它涉及多个分布式系统中的节点,包括事务的参与者、支持事务的服务器、资源服务器以及事务管理器。 在分布式事务中,一次大型操作通常由多个小操作组成…

排序算法--直接选择排序

前提: 选择排序:选择排序(Selection sort)是一种比较简单的排序算法。它的算法思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 话不多说,直接放图…

ResponseHttp

文章目录 HTTP响应详解使用抓包查看响应报文协议内容 Response对象Response继承体系Response设置响应数据功能介绍Response请求重定向概述实现方式重定向特点 请求重定向和请求转发比较路径问题Response响应字符数据步骤实现 Response响应字节数据步骤实现 HTTP响应详解 使用抓…

Web前端一套全部清晰 ⑥ day4 CSS.1 基础选择器、文字控制属性

后来的我不在抱怨 所有的事与愿违都是我能力或者判断力不足 仅此而已 —— 24.5.1 一、CSS定义 1. 将CSS放在html文件的<style>标签中 层叠样式表(Cascading style Sheets&#xff0c;缩写为 CSS)&#xff0c;是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现(美…

LeetCode 面试经典150题 28.找出字符串中第一个匹配项的下标

题目&#xff1a;给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 思路&#xff1a;暴力&#xff08;…

Pyside6详细使用教程python之GUI开发

1、首先需要安装Pyside6&#xff0c;终端执行命令&#xff1a; pip3.10 install pyside6 2、你们的一般是 pip install pyside6 2、如下代码创建一个简易程序导入必要的模块 import sys from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton,…

【docker】常用的Docker编排和调度平台

常用的Docker编排和调度平台 Kubernetes (K8s): Kubernetes是目前市场上最流行和功能最全面的容器编排和调度平台。它由Google开发并开源&#xff0c;现由CNCF&#xff08;云原生计算基金会&#xff09;维护。Kubernetes设计用于自动化容器部署、扩展和管理&#xff0c;支持跨…

出现nan nan

试着修改训练集大小或者batch_size大小&#xff0c;令训练集大小为batch_size的整数倍&#xff0c;不行 的话&#xff0c;看环境问题

8.k8s中网络资源service

目录 一、service资源概述 二、service资源类型 1.ClusterIP类型 2.service的nodeport类型 3.service的loadbalancer类型&#xff08;了解即可&#xff09; 4.service的externalname类型&#xff08;了解即可&#xff09; 三、nodeport的端口范围设置和svc的endpoint列表 1.修…

Jupyter Notebook魔术命令

Jupyter Notebook是一个基于网页的交互式笔记本&#xff0c;支持运行多种编程语言。 Jupyter Notebook 的本质式一个Web应用程序&#xff0c;便于创建和共享文学化程序文档&#xff0c;支持实现代码&#xff0c;数学方程&#xff0c;可视化和markdown。用途包括&#xff1a;数据…

Redis 实战2

系列文章目录 本文将从字典的实现、哈希算法、解决键冲突、rehash、渐进式rehash几方面来阐述 Redis 实战Ⅱ 系列文章目录字典的实现哈希算法解决键冲突rehash渐进式 rehash渐进式 rehash 执行期间的哈希表操作 字典 API总结 字典的实现 Redis 的字典使用哈希表作为底层实现&…