从零搭建一个组件库(二)创建代码规范

news/2024/11/29 4:51:54/

文章目录

    • 前言
    • 集成`eslint`
      • 1.安装
      • 2.替换默认解析器
      • 3.创建`.eslintrc.yml`配置文件
      • 4.创建忽略文件`.eslintignore`
    • 集成 `prettier`
      • 1.安装
      • 2.创建配置文件`.prettierrc`
    • 集成# `commitizen`
      • 1.安装
      • 2.修改package.json
      • 3.测试
    • className的BEM规范
      • 1.安装
      • 2.BEM概述
      • 3.创建hooks函数
      • 4.使用hooks函数
      • 5.封装scss函数
      • 6.使用scss函数
    • 总结

前言

上节我们搭建了组件库的基本环境架构,这节我们来对项目的代码规范和git提交规范进行配置。

集成eslint

1.安装

pnpm i eslint eslint-plugin-vue -D -w

2.替换默认解析器

因为EsLint默认使用ESpree解析器进行解析,无法识别一些特定的TypeScript语法,因此使用@typescript-eslint/parser替换默认的解析器。

pnpm i @typescript-eslint/parser -D -w

同时,作为eslint的补充,@typescript-eslint/eslint-plugin还提供了一些额外的TypeScript语法支持。

pnpm i @typescript-eslint/eslint-plugin -D -w

3.创建.eslintrc.yml配置文件

## .eslintrc.yml
env:browser: truees2021: truenode: true
extends:- plugin:vue/vue3-essential- standard-with-typescript- prettier
overrides: []
parser: '@typescript-eslint/parser'
parserOptions:ecmaVersion: latestsourceType: module
plugins:- vue- '@typescript-eslint'# - import- prettier
rules: {eqeqeq: offcurly: errorquotes:- error- double
}

4.创建忽略文件.eslintignore

## .eslintignore
node_modules/
dist/
index.html

集成 prettier

1.安装

pnpm i prettier eslint-config-prettier eslint-plugin-prettier --save-dev

2.创建配置文件.prettierrc

## .prettierrc
{"printWidth": 120, // 一行打最大字符数"semi": true, // 行尾添加分号"trailingComma": "all", // 末尾使用逗号"singleQuote": true, // 使用单引号"arrowParens": "always", // 箭头函数只有一个参数时添加括号"bracketSpacing": true // 大括号首位添加空格
}

集成# commitizen

1.安装

pnpm install -D commitizen cz-conventional-changelog @commitlint/config-conventional @commitlint/cli commitlint-config-cz cz-customizable

2.修改package.json

{"script": {..."cz": "git-cz"},"config": {"commitizen": {"path": "./node_modules/cz-conventional-changelog"}}
}

3.测试

image.png

className的BEM规范

1.安装

我们结合sass进行使用

pnpm i sass -D -w

2.BEM概述

BEM分别指的是Block、Element和Modifier。其中,Block描述的是一个元素本身,比如table、button;Element指的是元素的一部分,比如table__item、button__inner;Modifier则是描述了元素的外观、状态和行为,比如button–success、input–disabled。

3.创建hooks函数

// useNameSpace.ts
export const defaultNamespace = 'vl';
const statePrefix = 'is-';const _bem = (namespace: string, block: string, blockSuffix: string, element: string, modifiter: string) => {let className = `${namespace}-${block}`;if(blockSuffix) {str += '-' + blockSuffix;}if(element) {str += '__' + block;}if(midifiter) {str += '--' + midifiter;}
}export const useNamespace = (block: string) {const namespace = defaultNamespace;const b = (blockSuffix = '') => {return _bem(namespace, block, blockSuffix, '', '')}const e = (element = '') => {return _bem(namespace, '', '', element, '')}const m = (modifiter = '') => {return _bem(namespace, '', '', '', modifiter);}const bem = (namespace, block, blockSuffix = '', element= '', modifiter = '') => {return _bem(namespace, block, blockSuffix, element, modifiter);}return {namespace,b,e,m,bem}
}

4.使用hooks函数

// button.vue
<templete><button :class="nc.b()">按钮</button>
</templete><script setup lang="ts">
import { useNamespace } from './useNamespace.ts'const nc = useNamespace('button');
</script>

使用效果:

image.png

5.封装scss函数

// config.scss
$namespace: 'vl' !default;
$common-separator: '-' !default;
$element-separator: '__' !default;
$modifiter-separator: '--' !default;
$state-prefix: 'is-' !default;
// mixins.scss
@use 'config.scss' as *;
@use 'function.scss' as *;@mixin b($block) {$B: $namespace + '-' + $block !defalut;#{$B} {@content;}
}@mixin e($element) {$E: $element !default;$selector: &;$currentSeletor: '';@each $item in $element {$currentSelector: #{$currentSeletor + '.' + $B + $element-separator + $unit + ','};}// 如果父级选择器包含任意一种特殊规则,将样式放置在该父级选择器内@if hitAllSpecialNestRule($selector) {@at-root {#{$selector} {#{$currentSelector} {@content;}}}} @else {@at-root {#{$currentSelector} {@content;}}}
}@mixin m($modifier) {$selector: &;$currentSelector: '';@each $unit in $modifier {$currentSelector: #{$currentSelector + $selector + $modifier-separator + $unit + ','};}@at-root {#{$currentSelector} {@content;}}
}@mixin when($state) {@at-root {&.#{$state-prefix + $state} {@content;}}
}
// 将选择器转换为字符
@function selectorToString($selector) {$selector: inspect($selector);$selector: str-slice($selector, 2, -2);@return $selector;
}
// 判断父级选择器是否包含'--'
@function containsModifier($selector) {$selector: selectorToString($selector);@if str-index($selector, config.$modifier-separator) {// str-index 返回字符串的第一个索引@return true;} @else {@return false;}
}
// 判断父级选择器是否包含'.is-'
@function containWhenFlag($selector) {$selector: selectorToString($selector);@if str-index($selector, '.' + config.$state-prefix) {@return true;} @else {@return false;}
}
// 判断父级是否包含 ':' (用于判断伪类和伪元素)
@function containPseudoClass($selector) {$selector: selectorToString($selector);@if str-index($selector, ':') {@return true;} @else {@return false;}
}
// 判断父级选择器,是否包含`--` `.is-`  `:`这三种字符
@function hitAllSpecialNestRule($selector) {@return containsModifier($selector) or containWhenFlag($selector) or containPseudoClass($selector);
}

6.使用scss函数

// button.scss
@use 'mixins.scss' as *;@include b(button) {display: inline-flex;justify-content: center;align-items: center;background: #fff;line-height: 1;font-size: 14px;color: #000;border: 1px solid #000;border-radius: 3px;
}

使用效果:

image.png

总结

通过对代码规范的配置,极大地提升了我们开发的效率和体验。正所谓,工欲善其事必先利其器。对于一个团队,尤其是一个刚组建的团队来说,对代码格式的约束是尤为重要的,因为大家在组成一个团队之前,代码风格和编码习惯都各不相同,如果不进行相应的约束,将会造成维护困难、代码难以复用、代码维护困难等问题。而如果事先对这些地方都进行了约束,就能在很大程度上避免这些问题。


http://www.ppmy.cn/news/19282.html

相关文章

Cesium:Indexed 3D Scene Layers (I3S)加载

点击此处,查看完整的OGC标准列表项。Indexed 3D Scene Layers(I3S)标准官网介绍地址为:I3S,相关的GitHub主页地址为:Esri/i3s-spec,其详细介绍文档地址可点击此处查阅。我们的核心点在于介绍如何通过Cesium.js开发框架加载I3S三维场景服务。 目录 Cesium.js:I3S支持情…

springboot中restful风格请求的使用

springboot中restful风格请求的使用restful风格springboot中的使用1.创建html表单页面2.在yml配置文件中开启rest表单支持3.编写controller层及对应映射处理4.启动服务&#xff0c;逐个访问restful风格 Rest风格支持&#xff08;使用HTTP请求方式动词来表示对资源的操作&#…

Leetcode:93. 复原 IP 地址(C++)

目录 问题描述&#xff1a; 实现代码与解析&#xff1a; 回溯&#xff1a; 原理思路&#xff1a; 问题描述&#xff1a; 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。…

19、Javaweb案例-登录功能

项目导入 选择travel项目的pom.xml文件&#xff0c;点击ok&#xff0c;完成项目导入。需要等待一小会&#xff0c;项目初始化完成。 启动项目 方式一&#xff1a; 方式二&#xff1a;配置maven快捷启动 技术选型 Web层 Servlet&#xff1a;前端控制器html&#xff1a;视图Fi…

(十五)ForkJoin框架

ForkJoinPoolForkJoinPool是一种“分治算法”的多线程并行计算框架&#xff0c;自Java7引入。它将一个大的任务分为若干个子任务&#xff0c;这些子任务分别计算&#xff0c;然后合并出最终结果。ForkJoinPool比普通的线程池可以更好地实现计算的负载均衡&#xff0c;提高资源利…

用户画像增量更新系列二

进行用户日志数据处理 原始日志数据 结果: 思路&#xff1a;按照user_id的行为一条条处理&#xff0c;根据用户的行为类型判别。 由于sqlDF每条数据可能会返回多条结果&#xff0c;我们可以使用rdd.flatMap函数或者yield 格式&#xff1a;["user_id", "action…

Springboot+vue基于java的家教管理平台

系统分为用户和管理员&#xff0c;教师三个角色 用户的主要功能有&#xff1a; 1.用户注册和登陆系统 2.查看系统的公告信息 3.用户查看家教教师简历信息 4.用户查看课程信息 5.用户查看招聘教师信息&#xff0c;在线应聘教师 6.用户个人中心修改个人资料&#xff0c;修改密码…

Linux常用命令——sort命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) sort 将文件进行排序并输出 补充说明 sort命令是在Linux里非常有用&#xff0c;它将文件进行排序&#xff0c;并将排序结果标准输出。sort命令既可以从特定的文件&#xff0c;也可以从stdin中获取输入。 语法…