Prettier Eslint Stylelint Husky lint-staged

news2024/12/24 2:25:36

关于代码格式的讨论数不胜数,个人认为没有绝对的对与错,代码只要始终遵守可读性,可拓展性强这两点我认为就是优秀的代码。

如果是个人项目那就没有什么问题,但是如果涉及到多人开发,就不可避免的遇到代码风格迥异,从而给组内其他成员增加阅读代码时的心智负担,所以需要指定编码格式,团队中的每个人都严格执行,且使用工具对代码进行检查,规范提交。

1.首先先创建一个示例vue3空项目

我这里使用pnpm ,注:pnpm最低支持npm版本为16,所以使用前请先nvm切换至16版本及其以上。(如果没有安装请先npm i -g pnpm,mac电脑如果提示没有权限,即sudo npm i -g pnpm

pnpm create vite test-vue3

接下来正常启动项目

cd test-vue3

pnpm i

pnpm dev

2.Eslint+Prettier

vscode安装插件:

ESLint

Prettier

Prettier ESLint

配置vscode默认格式化程序为Prettier ESLint

npx eslint --init或者npm init @eslint/config

根目录新增.eslintignore文件,忽略格式化文件夹:

node_modules
.vscode
.idea
dist
/public


到此Eslint就先告一段落

pnpm add prettier -D


项目根目录新建 .prettierrc.cjs

module.exports = {
    // 一行最多 80 字符
    printWidth: 80,
    // 使用 4 个空格缩进
    tabWidth: 4,
    // 不使用 tab 缩进,而使用空格
    useTabs: false,
    // 行尾需要有分号
    semi: true,
    // 使用单引号代替双引号
    singleQuote: false,
    // 对象的 key 仅在必要时用引号
    quoteProps: "as-needed",
    // jsx 不使用单引号,而使用双引号
    jsxSingleQuote: false,
    // 对象或者数组的最后一个元素后面不要加逗号
    trailingComma: "none",
    // 大括号内的首尾需要空格 { 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",
    overrides: [
        {
            files: "*.html",
            options: {
                parser: "html"
            }
        }
    ]
};


修改.eslintrc.cjs文件

module.exports = {
    env: {
        browser: true,
        es2021: true,
        node: true
    },
    globals: {
        // writable:可被重写。 readonly:只读。 off:禁用.
        // 系统框架级全局变量只能是readonly,
        // 如果vue3项目使用了auto-import插件 这里可以不用写,直接在extends字段里继承插件的globals。
        defineProps: "readonly",
        defineEmits: "readonly",
        defineExpose: "readonly",
        withDefaults: "readonly",
        ref: "readonly",
        onMounted: "readonly",
        reactive: "readonly",
        nextTick: "readonly"
    },
    extends: [
        "eslint:recommended",
        "plugin:vue/vue3-essential",
        // prettier 必须放在最后面
        "prettier",
        "plugin:prettier/recommended"
    ],
    parser: "vue-eslint-parser",
    parserOptions: {
        ecmaVersion: "latest",
        sourceType: "module",
        ecmaFeatures: {
            jsx: false
        }
    },
    plugins: ["vue"],
    rules: {
        // 规则值:
        // "off" or 0 - 关闭规则,不启用该规则
        // "warn" or 1 - 将规则视为一个警告(不会影响退出码)
        // "error" or 2 - 将规则视为一个错误 (退出码为1)
        "prettier/prettier": "error",
        indent: ["error", 4, { SwitchCase: 1 }],
        "no-console": process.env.NODE_ENV === "production" ? 1 : 0,
        "no-debugger": process.env.NODE_ENV === "production" ? 1 : 0,
        "vue/multi-word-component-names": "off",
        "consistent-return": 0, // 要求 return 语句要么总是指定返回的值,要么不指定
        camelcase: 0, // 强制使用骆驼拼写法命名约定
        "no-redeclare": 1, // 禁止多次声明同一变量
        "default-case": 1, // 要求 switch 语句中有 default 分支
        "no-fallthrough": 1, // 禁止 case 语句落空
        "no-lonely-if": 1, // 禁止 if 作为唯一的语句出现在 else 语句中.如果一个if陈述是该else块中唯一的陈述,那么使用一个else if表格通常会更清晰。
        "no-irregular-whitespace": 1, // 禁止在字符串和注释之外不规则的空白
        "prefer-const": 1, // 要求使用 const 声明那些声明后不再被修改的变量.如果一个变量从不重新分配,使用const声明更好。const 声明告诉读者,“这个变量永远不会被重新分配,”减少认知负荷并提高可维护性。
        "no-use-before-define": 2, // 禁止在变量定义之前使用它们
        "no-constant-condition": 2,
        "no-empty": 2,
        "vue/comment-directive": "off"
    }
};


3.Stylelint

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

根目录新建.stylelintrc.cjs

// .stylelintrc.cjs
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'
      ]
    }
  }


vscode安装Stylelint插件,至此,每次保存代码的时候编辑器都会自动格式&排序样式代码。

根目录增加.vscode/settings.josn文件,并写入如下内容:

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


重启编辑器,至此,所有人的代码编辑环境都处于一致

4.Husky+Lint-staged


虽然上面已经完成了eslint+prettier+stylelint的配置,可以在保存的时候自动格式化代码,但是可能会存在一些粗心的同学,编辑器没有安装上述插件,就不能很好的保证代码格式质量。

pnpm add husky lint-staged -D  

Husky 是一款管理 git hooks 的工具,可以让我们更方便的管理 git hooks 脚本。它将在我们提交代码时触发不同的钩子,执行不同脚本,帮忙我们自动化的处理一些任务,比如执行 eslint 命令等。

但它存在一个问题,就是每次git提交都会对整个项目src中的所有文件都进行检测,很多时候这是不需要的,最好的方法就是对新修改的代码进行检测。
lint-staged 工具就是基于此,只针对提交的代码文件进行检查处理。


package.json-->scripts增加命令

"scripts": {
        "dev": "vite",
        "build": "vite build",
        "preview": "vite preview",
        +"prepare": "husky install",
        +"eslint": "eslint . --ext .vue,.js,.ts,.jsx,.tsx --fix",
        +"prettier": "prettier --write ./**/*.{html,vue,ts,cjs,json,md}",
        +"stylelint": "stylelint ./**/*.{css,less,vue,html} --fix",
        +"format": "npm run eslint && npm run stylelint && npm run prettier"
    },


新增四条命令,从上至下分别是:

prepare:该命令会在instll后自动执行,用来配置项目husky环境

eslint:对js代码进行格式化处理

prettier:对代码进行格式化处理

stylelint:对样式代码进行格式化处理

format:依次运行以上三条格式化命令

因为我们前面已经执行了instll命令了,所以这里我们直接运行pnpm prepare

运行完毕后会发现根目录增加了一个.husky目录,执行命令:

npx husky add .husky/pre-commit "npx --no-install lint-staged"

执行完命令后.husky文件夹生成pre-commit文件

package.json增加配置:

"lint-staged": {
        "*.{js,ts,jsx,tsx}": [
            "prettier --write",
            "eslint --fix"
        ],
        "*.{css,less,scss}": [
            "stylelint --fix"
        ],
        "*.{html,vue}": [
            "prettier --write",
            "stylelint --fix",
            "eslint --fix"
        ]
    },


至此,我们在编写代码,以及提交代码的时候都会自动的检查&格式化代码。

结束~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uni-app 中如何实现触底加载功能

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是全栈 …

队列与C++中的std::queue详解(多图超详细)

文章目录 队列(Queue)什么是队列队列的基本操作和应用1. 入队2. 出队3. 入队出队的复杂度和应用 类模板std::queue形参T和Container成员函数1. 元素访问2. 容量3. 队列的修改 用法示例 队列(Queue) 什么是队列 队列就是一种线性…

单模光纤三维模场分布动画的MATLAB实现

利用MATLAB的动画功能,我们可以把上一篇中绘制的三维分布图变为动画 clear close all clcV 2.4000; U 1.6453; W 1.7473;Npoint 501; Rx 5; Ry 5; x linspace(-Rx,Rx,Npoint); y linspace(-Ry,Ry,Npoint); [X Y] meshgrid(x,y); R sqrt(X.^2Y.^2);E1 …

Android自定义View:超过最大高度时支持滚动并且解决滑动冲突的TextView

VerticalScrollTextView:超过最大高度时支持滚动并且解决滑动冲突的TextView 正如标题所说,这个自定义TextView在它的行数超过最大行数或是高度超过最大高度限制时,会将TextView设置为可纵向滑动的状态,如果没有超过限制&#xf…

python 的APScheduler配置的定时任务会被Miss掉

背景 python 的APScheduler配置的定时任务会被Miss掉,经常在控制台收到一些Miss的告警信息,就觉得是任务太多导致的,为了定位到具体的原因,看了一些源码,了解到了定时任务的6大模块的协同工作模式。异常信息及来源 异…

01.GATK人种系变异最佳实践SnakeMake流程:WorkFlow简介

<~生~信~交~流~与~合~作~请~关~注~公~众~号生信探索> 学习的第一个GATK找变异流程&#xff0c;人的种系变异的短序列变异&#xff0c;包括SNP和INDEL。写了一个SnakeMake分析流程&#xff0c;从fastq文件到最后的vep注释后的VCF文件&#xff0c;关于VCF的介绍可以参考上一…

Windows 安装 GCC

文章目录 GCC 是什么&#xff1f;GCC 和 gcc 什么关系&#xff1f;Windows 安装 GCC选型下载安装配置环境变量验证 参考文献 GCC 是什么&#xff1f; GCC&#xff08;GNU Compiler Collection&#xff09;是一个开源的编译器套件&#xff0c;由 GNU 项目开发和维护。 GNU 编译…

悠可集团再获金鼠标3项大奖,自研营销工具助推全渠道数字营销

5月19日,第14届金鼠标数字营销大赛评选结果揭晓,悠可集团斩获3项大奖,其中悠可集团被评为“年度数字营销杰出代理商”,悠可DTC团队自主研发的智能广告投放引擎Turbo Media及点正科技申报的KOL优先自动化工具均荣获“年度最佳数字营销工具”奖项。 据主办方介绍,本届金鼠标数字营…

java基础 - jvm 堆、栈、方法区 java 内存模型

一、 概览 在进入主题前&#xff0c;我们先了解一些相关的知识&#xff0c;方面后面对运行时数据区进行分类。 进程中&#xff0c;有很多数据是多线程之间共享的&#xff0c;线程在执行时&#xff0c;会先从主存中读取数据&#xff0c;然后复制一份到高速缓存中&#xff0c;当…

【Docker容器】Docker安装Kibana详细步骤(看完这一篇就够啦!)

前言 安装Kibana的版本一定要跟ElaticSearch的版本是一样的&#xff0c;这样才不会容易出问题。 安装ElasticSearch请点击以下链接前去学习。 【Docker容器】Docker安装ElasticSearch详细步骤(看这一篇就够啦&#xff01;) 安装 1.访问镜像官网 https://hub.docker.com/ 搜索…

Java的内存模型(Java Memory Mode,JMM)

并发编程模型的两个关键问题 线程之间如何通信及线程之间如何同步。 线程之间如何通信&#xff1a;共享内存&#xff0c;消息传递线程之间如何同步通信是指线程之间以何种机制来 交换信息同步是指程序中用于控制不同线程间 操作发生相对顺序 的机制在共享内存的并发模型里&a…

【PHP图片托管】免费CFimagehost图床源码搭建私人图床 - 无需数据库

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

C#入门:编写运行第一个Windows窗体应用程序Helloworld_WinForm

下载及安装Visual Studio的链接&#xff0c;具体见C#入门&#xff1a;编写运行第一个C#程序Helloworld 目录 下载.NET桌面开发组件创建新项目添加控件编辑程序运行查看效果补充 下载.NET桌面开发组件 Visual Studio中需下载安装.NET桌面开发组件。 创建新项目 创建项目&…

【2】Jmeter获取token,模拟多用户并发及token存储文本文件

按以下步骤来&#xff0c;以下各种处理程序的放置位置很重要&#xff01;&#xff01;不然会出现各种问题&#xff1a; 1、setup线程组 前置获取token的接口&#xff08;login&#xff0c;以下都用login表示获取token接口&#xff09;请求&#xff0c;获取类似token等后续需要…

10 个对 Android 开发者有用的 Kotlin 扩展函数 #2

10 个对 Android 开发者有用的 Kotlin 扩展函数 #2 通过出色的 Kotlin 扩展提高您的工作效率 EditText 通过EditText的“text”属性&#xff0c;您可以快速获取EditText中的文本。但是&#xff0c;这个文本是“可编辑”的&#xff0c;因此每次都需要将其转换为字符串才能获…

前端食堂技术周刊第 83 期:TS 5.1 RC、Nuxt 3.5、INP、Knip、管理 GitHub 通知、WebXR

By Midjournery 美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;杏花乌龙拿铁 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 本期摘要 TypeScript 5.1 RCNuxt 3.5INP 将成为新的 Core Web…

SSM 如何使用 Seata 框架实现分布式事务?

SSM 如何使用 Seata 框架实现分布式事务&#xff1f; 分布式事务是现代分布式系统中必不可少的一部分&#xff0c;而 Seata 框架是一种常用的分布式事务处理方式。在 SSM 框架中&#xff0c;我们可以使用 Seata 框架来管理分布式事务。本文将介绍如何在 SSM 框架中使用 Seata …

好用工具第2期:手机电脑传文件LocalSend

1. 概要 LocalSend 是一个跨平台的 AirDrop替工具软件。 适用于手机电脑之间的数据文件传输&#xff0c;不需要互联网连接或第三方服务器&#xff0c;是局域网本地通信的快速可靠解决方案。 LocalSend 是一个开源项目, 项目地址是: https://github.com/localsend/localsend …

webpack简单的搭建和使用

随便创建一个空的文件夹&#xff0c;例如说&#xff1a;explore 然后我们测试一下我们的node是否存在 可以正确打印出版本 我们再次输入&#xff1a;npm init -y 创建一个package.json文件 出现这样的情况就成功了 然后我们要安装webpack在终端上输入命令&#xff1a; npm i …

辅助生成: 低延迟文本生成的新方向

大型语言模型如今风靡一时&#xff0c;许多公司投入大量资源来扩展它们规模并解锁新功能。然而&#xff0c;作为注意力持续时间不断缩短的人类&#xff0c;我们并不喜欢大模型缓慢的响应时间。由于延迟对于良好的用户体验至关重要&#xff0c;人们通常使用较小的模型来完成任务…