Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky

前期回顾 

Vue项目实战 —— 后台管理系统( pc端 ) —— Pro最终版本_0.活在风浪里的博客-CSDN博客通用开源后台管理系统https://blog.csdn.net/m0_57904695/article/details/129730440?spm=1001.2014.3001.5501

你把 vite打包 玩明白_0.活在风浪里的博客-CSDN博客webpack 打包看这里(移动端打包)一步一步,一步 从代码到,打包成为手机App,上传至nginx服务器 (Vue项目)_0.活在风浪里的博客-CSDN博客_移动端打包成app一步一步,一步 从代码到,打包成为手机App,上传至ngnix服务器 (Vue项目)手写一个服务器代码将 《vue电商后台管理系统》部署上去 上线、打包_0.活在风浪里的博客-CSDN博客亲测可用,一定会收获颇多,1.上线vue电商后台管理项目2.手写搭建服务器并挂载 (node)3.打包优化 完成上线。.............https://blog.csdn.net/m0_57904695/article/details/126118104?spm=1001.2014.3001.5502 Vite项目,vite + vue3 + ts + vuex + vue-router + axios + scss + 自动导入api(就是用v3不需要引入api直接使用)_vue3 封装axios router vuex_0.活在风浪里的博客-CSDN博客​webpack回顾 ​ (移动端打包)一步一步,一步 从代码到,打包成为手机App,上传至nginx服务器 (Vue项目)_0.活在风浪里的博客-CSDN博客_移动端打包一步一步,一步 从代码到,打包成为手机App,上传至ngnix服务器 (Vue项目) https://blog.csdn.net/m0_57904695/article/details/122500485?ops_request_misc=%257B%2522request%255Fid%2522%253A%25221656https://blog.csdn.net/m0_57904695/article/details/125487996?spm=1001.2014.3001.5502

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第1张图片

 

目录

前言: 

pnpm:

 Vite:

正文开始

 1 创建项目:

 2 配置eslint:

报错原因: 

排错思路: 

修改.eslintrc.js文件

3 安装vscode插件ESlint

 4 配置prettier

 5 配置sass

 6 安装Prettier - Code formatter插件

 6.1 解决eslint与prettier的冲突

在 .eslintrc.cjs 中 extends 的最后添加一个配置 

7 配置styleling

8 配置husky


 

前言: 

1:配置好的项目在最后已上传github,此外还有公网地址基于配置好的模板写的后台管理系统:地址:张坤-后台管理系统

2: 在配置过程中会有无数的埋点,作者会站在看官的角度去思考问题,代替直接问出迷惑的地方,并且我会去分析错误,一步步去链接到错误,并在官网中找出答案,而不是直接贴出答案告诉解决方法

3:如果你的配置不精简或者代码太过庞大,逻辑交错复杂,会导致你的运行速度慢,一个页面看不出来具体区别,但是随着项目周期迭代会逐渐显示出 delay

此模板运行启动时间为331ms

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第2张图片

 

pnpm:

  pnpm与其他包管理器(如npm和Yarn)的不同之处在于它使用一种称为“硬链接”的独特安装方法。当你使用PNPM安装一个包时,它并不会重复的去下载每个项目的node_modules依赖,而是在一个中心存储位置创建硬链接。这意味着多个项目可以共享同一个包文件,从而节省磁盘空间并减少安装时间。

        pnpm可能会缓存,比如修改了一些配置还是使用之前的依赖,可能会导致缓存没生效类似问题,解决方法:

  1. 清除pnpm缓存:可以使用 pnpm cache clean 命令来清除pnpm的缓存,这样可以确保使用最新的依赖。

  2. 强制重新安装依赖:可以使用 pnpm install --force 命令来强制重新安装依赖,这样可以确保使用最新的配置和依赖。

  3. 检查依赖版本:如果依赖版本不匹配,可能会导致缓存无法生效,因此需要检查依赖的版本是否正确。

  4. 使用--no-cache选项:在执行命令时,可以使用--no-cache选项来禁用缓存,这样可以确保使用最新的依赖和配置。

  5. 更新pnpm:如果你的pnpm版本过旧,可能会导致一些缓存问题,因此需要更新到最新版本。可以使用 npm install -g pnpm 命令来更新pnpm。

        pnpm还支持一种称为“虚拟包”的特性,它允许你为包创建别名。虚拟包可用于同时安装多个版本的包,或者在不改变其他包的依赖关系的情况下替换一个包。

pnpm旨在快速高效,它的开发者声称在某些情况下可以比npm或yarn快10倍。它还支持广泛的包锁定文件格式,包括npm、yarn使用的格式。
 

 

 Vite:

   Vite 不需要提前将所有的代码打包成一个或多个静态文件。相反,Vite 会在浏览器请求资源时动态地编译和提供所需的模块,并在内存中生成对应的静态文件。这种方式可以提高开发体验和构建速度。它还支持热更新和代码分割等功能,使得开发者能够更快地进行开发、调试和部署。

比如有a、b、c三个页面,a页面是错误的,只要不在首屏加载调用,它只会在项目启动了,进入a页面,提示报错

 


 

正文开始

 1 创建项目:

pnpm create vite my-vue-app --template vue-ts

创建项目非常简单、Vite也很快

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第3张图片

 

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第4张图片

 

——————————————————  创建项目完  ———————————————————

 

eslint 可以保证项目的质量,prettier 可以保证项目的统一格式、风格。

 2 配置eslint:

执行安装命令

pnpm add eslint -D

 执行eslint初始化命令

pnpm eslint --init

 依次选择初始化选项:

图片描述: 

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第5张图片

 具体选项描述

(1) How would you like to use ESLint?
选择:To check syntax and find problems

(2) What type of modules does your project use?
选择:JavaScript modules (import/export)

(3) Which framework does your project use?
选择:Vue.js

(4) Does your project use TypeScript?
选择:Yes

(5) Where does your code run?
选择:Browser

(6) What format do you want your config file to be in?
选择:JavaScript

(7) Would you like to install them now?
选择:Yes

(8) Which package manager do you want to use?
选择:pnpm

依赖安装完成后,会生成  .eslintrc.js 配置文件 ,此时打开 .eslintrc.js 配置文件会出现一个报错,需要再 env 字段中增加 node: true 配置以解决eslint找不到module的报错

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第6张图片

 修改如下:

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

在 package.json 文件中的 script中添加lint命令

{
    "scripts": {
        // eslint . 为指定lint当前项目中的文件
        // --ext 为指定lint哪些后缀的文件
        // --fix 开启自动修复
        "lint": "eslint . --ext .vue,.js,.ts,.jsx,.tsx --fix"
    }
}

 执行lint命令

pnpm lint

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第7张图片

 发现报错了,执行不了,

报错原因: 

eslint默认是不会解析.vue后缀文件的。因此,需要一个额外的解析器来解析.vue后缀文件

 查看官网解释如下:

User Guide | eslint-plugin-vue

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第8张图片

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第9张图片

 

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第10张图片

 


 

排错思路: 

但是我们查看.eslintrc.js文件中的extends会发现已经有继承"plugin:vue/vue3-essential"的配置。

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第11张图片

 然后在node_modules中可以找到eslint-plugin-vue/lib/cinfigs/essential,里面配置了extends是继承于同级目录下的base.js, 

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第12张图片

 在base.js里面会发现parser: require.resolve('vue-eslint-parser')这个配置。因此,按道理来说应该是会解析.vue后缀文件的。

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第13张图片

继续往下看.eslintrc.js文件中的extends会发现,extends中还有一个"plugin:@typescript-eslint/recommended"

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第14张图片

它是来自于/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended.js

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第15张图片

 查看该文件会发现最终继承于同级目录下的base.js文件。从该文件中可以发现parser: '@typescript-eslint/parser',配置。

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第16张图片

按照.eslintrc.js文件中的extends配置的顺序可知,最终导致报错的原因就是@typescript-eslint/parservue-eslint-parser覆盖了

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第17张图片

 Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第18张图片

如果已经使用了另外的解析器(例如"parser": "@typescript-eslint/parser"),则需要将其移至parseOptions,这样才不会与vue-eslint-parser冲突。 

修改.eslintrc.js文件

module.exports = {
  env: {
    browser: true,
    es2021: true,
    // 新增
    node: true
  },
  extends: [
    'eslint:recommended',
    'plugin:vue/vue3-essential',
    'plugin:@typescript-eslint/recommended'
  ],
  // 新增
  parser: 'vue-eslint-parser',
  parserOptions: {
    ecmaVersion: 'latest',
    parser: '@typescript-eslint/parser',
    sourceType: 'module'
  },
  plugins: ['vue', '@typescript-eslint'],
  rules: {}
};

此时,再执行 pnpm lint,就会发现校验通过了。但是出现警告了

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第19张图片

该警告建议你更新配置文件以避免意外加载~/.eslintrc.*,可以在项目的ESLint配置文件中添加root:true选项来解决该问题。

你可以在.eslintrc.js.eslintrc.json文件中添加以下内容:json

{
  "root": true,
  "rules": {
    // ...其他规则
  }
}

如果使用的是旧版本的ESLint,则可能需要将其升级到支持'root'属性的最新版本。

此外,如果你不需要在全局范围内使用ESLint配置文件,请删除位于用户主目录下的~/.eslintrc.*文件,以避免被意外加载。

修改.eslintrc.js文件 

module.exports = {
  env: {
    browser: true,
    es2021: true,
    // 新增
    node: true
  },
  extends: [
    'eslint:recommended',
    'plugin:vue/vue3-essential',
    'plugin:@typescript-eslint/recommended'
  ],
  // 新增
  parser: 'vue-eslint-parser',
  parserOptions: {
    ecmaVersion: 'latest',
    parser: '@typescript-eslint/parser',
    sourceType: 'module'
  },
  plugins: ['vue', '@typescript-eslint'],
  // 新增
  "root": true,
  rules: {}
};

 再次运行如下:

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第20张图片

 

———————————————  配置ESLint完  —————————————————— 

 

3 安装vscode插件ESlint

 如果写一行代码就要执行一遍lint命令,这效率就太低了。所以我们可以配合vscode的ESLint插件,实现每次保存代码时,自动执行lint命令来修复代码的错误。

 在项目中新建.vscode/settings.json文件,然后在其中加入以下配置

{
    // 开启自动修复
    "editor.codeActionsOnSave": {
        "source.fixAll": false,
        "source.fixAll.eslint": true
    }
}

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第21张图片

 

 —————————————— 安装vscode插件ESlint —————————————————

 

 4 配置prettier

 执行安装命令

pnpm add prettier -D

 在根目录下新建.prettierrc.js  下面会修改为prettierrc.cjs

 添加以下配置,更多配置可查看官方文档

module.exports = {
    // 一行的字符数,如果超过会进行换行,默认为80
    printWidth: 80, 
    // 一个tab代表几个空格数,默认为80
    tabWidth: 2, 
    // 是否使用tab进行缩进,默认为false,表示用空格进行缩减
    useTabs: false, 
    // 字符串是否使用单引号,默认为false,使用双引号
    singleQuote: true, 
    // 行位是否使用分号,默认为true
    semi: false, 
    // 是否使用尾逗号,有三个可选值""
    trailingComma: "none", 
    // 对象大括号直接是否有空格,默认为true,效果:{ foo: bar }
    bracketSpacing: true
}

 在package.json中的script中添加以下命令 

{
    "scripts": {
        "format": "prettier --write \"./**/*.{html,vue,ts,js,json,md,scss}\"",
    }
}

运行该命令,会将我们项目中的文件都格式化一遍,后续如果添加其他格式的文件,可在该命令中添加,例如:.less后缀的文件

好的,又出错了,你可以看看有多少细节、埋坑 

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第22张图片

 问题描述:

错误信息提示 .prettierrc.js 配置文件存在问题。似乎该文件被视为 ES 模块文件。

怎么解决:

可以尝试以下几种解决方法:

  1.  .prettierrc.js 文件重命名为 .prettierrc.cjs,以明确指示该文件为 CommonJS 模块。

  2. 修改引用该文件的代码,使用动态 import()。这种方法适用于所有的 CommonJS 模块。

  3. 在 package.json 中将 "type": "module" 修改为 "type": "commonjs",以将所有的 .js 文件都视为 CommonJS 模块。如果需要使用 ES 模块,则可以使用 .mjs 文件扩展名。

  4. 升级到 Prettier 2.3.2 或更高版本,该版本已经支持 .prettierrc.js 文件的 ES 模块语法。

本次采用第一种方式

 Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第23张图片

 

 —————————————— 配置prettier ————————————————— 

 

 5 配置sass

要在 Vite 项目中使用 Sass,需要安装 sasssass-loader 依赖。然后,在 vite.config.ts 文件中进行如下配置:

pnpm install sass sass-loader --save-dev
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [vue()],
  css: {
    preprocessorOptions: {
      scss: {
        // 这里可以添加全局的 Sass 变量、Mixin等。首先你的有这个文件
        // additionalData: `
        //   @import "@/styles/variables.scss";
        //   @import "@/styles/mixins.scss";
        // `,
      }
    }
  }
})

其中,additionalData 属性可以用来引入全局的 Sass 变量和 Mixin 等,并且会在每个 .scss 文件中自动注入。

在 Vue 组件中,可以直接使用 lang="scss" 来编写 Sass 样式:(前提你的有这个文件并且里面写有这个变量) 




 —————————————— 配置sass —————————————————  

 

 6 安装Prettier - Code formatter插件

安装该插件的目的是,让该插件在我们保存的时候自动完成格式化

.vscode/settings.json中添加一下规则

{
    // 保存的时候自动格式化
    "editor.formatOnSave": true,
    // 默认格式化工具选择prettier
    "editor.defaultFormatter": "esbenp.prettier-vscode"
}

 6.1 解决eslintprettier的冲突

 

在理想的状态下,eslintprettier应该各司其职。eslint负责我们的代码质量,prettier负责我们的代码格式。但是在使用的过程中会发现,由于我们开启了自动化的eslint修复与自动化的根据prettier来格式化代码。所以我们已保存代码,会出现屏幕闪一起后又恢复到了报错的状态。

这其中的根本原因就是eslint有部分规则与prettier冲突了,所以保存的时候显示运行了eslint的修复命令,然后再运行prettier格式化,所以就会出现屏幕闪一下然后又恢复到报错的现象。这时候你可以检查一下是否存在冲突的规则。

查阅资料会发现,社区已经为我们提供了一个非常成熟的方案,即eslint-config-prettier + eslint-plugin-prettier

  • eslint-plugin-prettier: 基于 prettier 代码风格的 eslint 规则,即eslint使用pretter规则来格式化代码。
  • eslint-config-prettier: 禁用所有与格式相关的 eslint 规则,解决 prettier 与 eslint 规则冲突,确保将其放在 extends 队列最后,这样它将覆盖其他配置

 安装依赖

pnpm add eslint-config-prettier eslint-plugin-prettier -D

在 .eslintrc.cjs 中 extends 的最后添加一个配置 

{ 
    extends: [
    'eslint:recommended',
    'plugin:vue/vue3-essential',
    'plugin:@typescript-eslint/recommended',
      // 新增,必须放在最后面
     'plugin:prettier/recommended' 
  ],
}
module.exports = {
  env: {
    browser: true,
    es2021: true,
    // 新增
    node: true
  },
  extends: [
    'eslint:recommended',
    'plugin:vue/vue3-essential',
    'plugin:@typescript-eslint/recommended',
    // 新增,必须放在最后面
    'plugin:prettier/recommended'
  ],
  // 新增
  parser: 'vue-eslint-parser',
  parserOptions: {
    ecmaVersion: 'latest',
    parser: '@typescript-eslint/parser',
    sourceType: 'module'
  },
  plugins: ['vue', '@typescript-eslint'],
  // 新增
  root: true,
  rules: {}
}

 

  —————————————— 冲突解决 —————————————————  

 

7 配置styleling

stylelint 为css的lint工具。可格式化css代码,检查css语法错误与不合理的写法,指定css书写顺序等...

由于我的项目使用的sass预处理器,因此配置的为sass相关的,项目中使用其他预处理器的可以按照该配置方法改一下就好

安装依赖

// less
pnpm add stylelint postcss postcss-less postcss-html stylelint-config-prettier stylelint-config-recommended-less stylelint-config-standard stylelint-config-standard-vue stylelint-less stylelint-order -D

//scss
pnpm add stylelint postcss postcss-scss postcss-html stylelint-config-prettier stylelint-config-recommended-scss stylelint-config-standard stylelint-config-standard-vue stylelint-scss stylelint-order -D

Vue3 + Ts + Vite + pnpm 项目中集成 —— eslint 、prettier、stylelint、husky_第24张图片

 增加.stylelintrc.cjs配置文件  为什么是.cjs 与 4 配置prettier 同理

less: 

module.exports = {
  extends: [
    'stylelint-config-standard',
    'stylelint-config-prettier',
    'stylelint-config-recommended-less',
    'stylelint-config-standard-vue'
  ],
  plugins: ['stylelint-order'],
  // 不同格式的文件指定自定义语法
  overrides: [
    {
      files: ['**/*.(less|css|vue|html)'],
      customSyntax: 'postcss-less'
    },
    {
      files: ['**/*.(html|vue)'],
      customSyntax: 'postcss-html'
    }
  ],
  ignoreFiles: [
    '**/*.js',
    '**/*.jsx',
    '**/*.tsx',
    '**/*.ts',
    '**/*.json',
    '**/*.md',
    '**/*.yaml'
  ],
  rules: {
    'no-descending-specificity': null, // 禁止在具有较高优先级的选择器后出现被其覆盖的较低优先级的选择器
    'selector-pseudo-element-no-unknown': [
      true,
      {
        ignorePseudoElements: ['v-deep']
      }
    ],
    'selector-pseudo-class-no-unknown': [
      true,
      {
        ignorePseudoClasses: ['deep']
      }
    ],
    // 指定样式的排序
    'order/properties-order': [
      'position',
      'top',
      'right',
      'bottom',
      'left',
      'z-index',
      'display',
      'justify-content',
      'align-items',
      'float',
      'clear',
      'overflow',
      'overflow-x',
      'overflow-y',
      'padding',
      'padding-top',
      'padding-right',
      'padding-bottom',
      'padding-left',
      'margin',
      'margin-top',
      'margin-right',
      'margin-bottom',
      'margin-left',
      'width',
      'min-width',
      'max-width',
      'height',
      'min-height',
      'max-height',
      'font-size',
      'font-family',
      'text-align',
      'text-justify',
      'text-indent',
      'text-overflow',
      'text-decoration',
      'white-space',
      'color',
      'background',
      'background-position',
      'background-repeat',
      'background-size',
      'background-color',
      'background-clip',
      'border',
      'border-style',
      'border-width',
      'border-color',
      'border-top-style',
      'border-top-width',
      'border-top-color',
      'border-right-style',
      'border-right-width',
      'border-right-color',
      'border-bottom-style',
      'border-bottom-width',
      'border-bottom-color',
      'border-left-style',
      'border-left-width',
      'border-left-color',
      'border-radius',
      'opacity',
      'filter',
      'list-style',
      'outline',
      'visibility',
      'box-shadow',
      'text-shadow',
      'resize',
      'transition'
    ]
  }
}

 scss:

module.exports = {
    extends: [
      'stylelint-config-standard',
      'stylelint-config-prettier',
      'stylelint-config-recommended-scss',
      'stylelint-config-standard-vue'
    ],
    plugins: ['stylelint-order'],
    // 不同格式的文件指定自定义语法
    overrides: [
      {
        files: ['**/*.(scss|css|vue|html)'],
        customSyntax: 'postcss-scss'
      },
      {
        files: ['**/*.(html|vue)'],
        customSyntax: 'postcss-html'
      }
    ],
    ignoreFiles: [
      '**/*.js',
      '**/*.jsx',
      '**/*.tsx',
      '**/*.ts',
      '**/*.json',
      '**/*.md',
      '**/*.yaml'
    ],
    rules: {
      'no-descending-specificity': null, // 禁止在具有较高优先级的选择器后出现被其覆盖的较低优先级的选择器
      'selector-pseudo-element-no-unknown': [
        true,
        {
          ignorePseudoElements: ['v-deep']
        }
      ],
      'selector-pseudo-class-no-unknown': [
        true,
        {
          ignorePseudoClasses: ['deep']
        }
      ],
      // 指定样式的排序
      'order/properties-order': [
        'position',
        'top',
        'right',
        'bottom',
        'left',
        'z-index',
        'display',
        'justify-content',
        'align-items',
        'float',
        'clear',
        'overflow',
        'overflow-x',
        'overflow-y',
        'padding',
        'padding-top',
        'padding-right',
        'padding-bottom',
        'padding-left',
        'margin',
        'margin-top',
        'margin-right',
        'margin-bottom',
        'margin-left',
        'width',
        'min-width',
        'max-width',
        'height',
        'min-height',
        'max-height',
        'font-size',
        'font-family',
        'text-align',
        'text-justify',
        'text-indent',
        'text-overflow',
        'text-decoration',
        'white-space',
        'color',
        'background',
        'background-position',
        'background-repeat',
        'background-size',
        'background-color',
        'background-clip',
        'border',
        'border-style',
        'border-width',
        'border-color',
        'border-top-style',
        'border-top-width',
        'border-top-color',
        'border-right-style',
        'border-right-width',
        'border-right-color',
        'border-bottom-style',
        'border-bottom-width',
        'border-bottom-color',
        'border-left-style',
        'border-left-width',
        'border-left-color',
        'border-radius',
        'opacity',
        'filter',
        'list-style',
        'outline',
        'visibility',
        'box-shadow',
        'text-shadow',
        'resize',
        'transition'
      ]
    }
  }
  

package.json增加命令 

"scripts": {
    "prepare": "husky install",
    "dev": "vite",
    "build": "vue-tsc --noEmit && vite build",
    "preview": "vite preview",
    "lint": "eslint . --ext .vue,.js,.ts,.jsx,.tsx --fix",
    "format": "prettier --write \"./**/*.{html,vue,ts,js,json,md}\"",

    "lint:style": "stylelint \"./**/*.{css,less,scss,vue,html}\" --fix"
},

安装vscode的Stylelint插件

安装该插件可在我们保存代码时自动执行stylelint

.vscode/settings.json中添加一下规则 

{
  // 开启自动修复
  "editor.codeActionsOnSave": {
    "source.fixAll": false,
    "source.fixAll.eslint": true,
   "source.fixAll.stylelint": true
  },
  // 保存的时候自动格式化
  "editor.formatOnSave": true,
  // 默认格式化工具选择prettier
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  // 配置该项,新建文件时默认就是space:2
  "editor.tabSize": 2,
  // stylelint校验的文件格式
 "stylelint.validate": ["css", "less", "vue", "html"]
}

8 配置husky

虽然上面已经配置好了eslintpreitterstylelint,但是还是存在以下问题。

对于不使用vscode的,或者没有安装eslintpreitterstylelint插件的同学来说,就不能实现在保存的时候自动的去修复与和格式化代码。

这样提交到git仓库的代码还是不符合要求的。因此需要引入强制的手段来保证提交到git仓库的代码时符合我们的要求的。

husky是一个用来管理git hook的工具,git hook即在我们使用git提交代码的过程中会触发的钩子。

 安装依赖

pnpm add husky -D

package.json中的script中添加一条脚本命令

{
    "scripts": {
        "prepare": "husky install"
    },
}

该命令会在pnpm install之后运行,这样其他克隆该项目的同学就在装包的时候就会自动执行该命令来安装husky。这里我们就不重新执行pnpm install了,直接执行pnpm prepare,这个时候你会发现多了一个.husky目录。

然后使用husky命令添加pre-commit钩子,运行

pnpm husky add .husky/pre-commit "pnpm lint && pnpm format && pnpm lint:style"

执行完上面的命令后,会在.husky目录下生成一个pre-commit文件

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

pnpm lint && pnpm format

现在当我们执行 git commit 的时候就会执行 pnpm lint 与 pnpm format,当这两条命令出现报错,就不会提交成功。以此来保证提交代码的质量和格式。

 


 

 _______________________________  期待再见  _______________________________ 

 

 

你可能感兴趣的:(vue.js,javascript,前端,创建项目,vite)