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

news2024/11/13 11:04:06

文章目录

    • 前言
    • 集成`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: true
  es2021: true
  node: true
extends:
  - plugin:vue/vue3-essential
  - standard-with-typescript
  - prettier
overrides: []
parser: '@typescript-eslint/parser'
parserOptions:
  ecmaVersion: latest
  sourceType: module
plugins:
  - vue
  - '@typescript-eslint'
  # - import
  - prettier
rules: {
  eqeqeq: off
  curly: error
  quotes:
    - 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.coloradmin.cn/o/177845.html

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

相关文章

Vuex里面四个map方法(mapState、mapGetters、mapActions、mapMutation)

本章节主要讲述Vuex里面的四个优化代码的map方法&#xff0c;mapState、mapGetters、mapActions、mapMutation 一、store文件夹下面index.js主要内容&#xff0c;包含state(用于存储数据)、getters(计算属性)、mutatiions(加工数据)、actions(相应组件动作、写逻辑) 二、四个ma…

多个盒子排列规则(视觉格式化模型) 多个盒子的排列 页面布局

目录常规流常规流布局块盒的排列规则常规流 盒模型&#xff1a;规定单个盒子的规则 视觉格式化模型&#xff08;布局规则&#xff09;&#xff1a;页面中的多个盒子排列规则 视觉格式化模型&#xff0c;大体上将页面中盒子的排列分为三种方式&#xff1a; 常规流浮动定位 …

react源码:目录结构、调试源码

我的技术栈是React,最近在整理react的源码,react版本是18.1.0,之前版本,没有看过,就此略过。 源码目录 从github将源码下载后,先看看源码目录结构,如下图所示: fixtures:代码贡献者提供的测试react package:react源码的主要部分,包含了Schedule、reconcile等等 s…

RadSystems Studio 8.1.8 Crack

RadSystems Studio 是一个用于快速开发和交付自定义应用程序的环境&#xff0c;快速应用开发环境&#xff0c;更快生成完整应用。RadSystems为生成现代应用程序和 API 提供了无数的设计选项和组件。很少或没有编码。无需专门的编程知识。可通过减少冗余编码时间来促进应用程序开…

Centos7 安装SkyWalking

Centos7 安装SkyWalkingCentos7 安装SkyWalking1 基础介绍1.1 概念1.2 核心三部分1.3 架构图2 快速安装2.1 前提条件2.2 拉取镜像2.3 启动SkyWalking2.4 访问SkyWalking UI界面Centos7 安装SkyWalking 1 基础介绍 1.1 概念 SkyWalking是一个国产的开源框架&#xff0c;2015年…

计算机组成原理3个实验-logisim实现“七段数码管”、“有限状态机控制的8*8位乘法器”、“单周期MIPS CPU设计”。

目录 标题1.首先是七段数码管 标题二&#xff1a;有限状态机控制的8*8位乘法器 标题三&#xff1a;单周期MIPS CPU设计 标题1.首先是七段数码管 1看一下实验要求&#xff1a; 2.接下来就是详细设计&#xff1a; 1. 组合逻辑设计 由于7段数码管由7个发光的数码管构成&#x…

信息论复习—率失真理论

目录 失真的概念&#xff1a; 信息率与失真的关系&#xff1a; 信息率失真理论&#xff1a; 失真函数矩阵&#xff1a; 平均失真度定义为&#xff1a; 平均失真度与信道转移概率的关系&#xff1a; 率失真函数&#xff1a; 率失真函数的物理意义&#xff1a; 率失真函数…

05 |「链表」必刷题

前言 前言&#xff1a;刷链表面试高频题。 文章目录前言一. 基础回顾二. 高频考题1、例题例题1&#xff1a;LeetCode 206 反转链表1&#xff09;题目链接2&#xff09; 算法思路3&#xff09;源码剖析4&#xff09;时间复杂度例题2&#xff1a;LeetCode 92 反转链表II1&#xf…

C++编译之(3)-camke/CMakeLists.txt的编译使用教程

引言 上一节介绍了前面我们介绍了make/Makefile来对c项目进行编译&#xff0c;我们继续以该项目为例讲解&#xff1b; C编译之(1)-g单/多文件/库的编译 C编译之(2)-make及makefile编译过程 我们先看看上一节的实战的目录结构如下&#xff1a; - mutilFilesDemo- include // 头…

Docker入门与应用

Docker入门与应用1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结1.2.Docker和虚拟机的区别1.3.Docker架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker架构1.3.4.小结1.4.安装Docker2.Docker的…

“华为杯”研究生数学建模竞赛2005年-【华为杯】D题:仓库容量有限条件下的随机存贮管理(附获奖论文)

赛题描述 工厂生产需定期地定购各种原料,商家销售要成批地购进各种商品。无论是原料或商品,都有一个怎样存贮的问题。存得少了无法满足需求,影响利润;存得太多,存贮费用就高。因此说存贮管理是降低成本、提高经济效益的有效途径和方法。 问题2 以下是来自某个大型超市的…

全链路追踪 jaeger

Jaeger 概述 Jaeger 是 Uber 开发并开源的一款分布式追踪系统&#xff0c;兼容 OpenTracing API&#xff0c;适用于以下下场景&#xff1a; 分布式跟踪信息传递分布式事务监控问题分析服务依赖性分析性能优化 特性 高扩展性 Jaeger后端的设计没有单点故障&#xff0c;可以…

大数据 | 《Riffle:Optimized Shuffle Service for Large-Scale》论文阅读

1. 简介 1.1. 近期工作 研究工作鼓励运行大量小任务 小任务能提高并行性&#xff0c;减少端到端耗时工程经验反对运行过多的任务 过多的task在shuffle阶段会引入大量IO开销&#xff0c;根本原因在于map和reduce阶段之间的shuffle IO请求数量随着任务数量的增长呈现指数级的增…

emoji 符号大全,给各位程序员增加一些奇怪的知识点

这篇博客非常有意思&#xff0c;我将为大家整理和罗列一些好用的 emoji 表情站点。 文章目录EmojiXDcarpedm20emoji-cheat-sheetemojiterrafsymbols符号大全unicode.orgemojiallemojiguideemojipediaemoji696 编辑器emoji.inkEmoji Artemojifinderemoji 可以在许多社交媒体平台…

Redis 持久化-AOF

Redis 持久化-AOF 1.官方资料 在线文档 : https://redis.io/topics/persistence 2.AOF 是什么? 1、AOF(Append Only File) 2、以日志的形式来记录每个写操作(增量保存)&#xff0c;将 Redis 执行过的所有写指令记录下来(比 如 set/del 操作会记录, 读操作 get 不记录) 3、…

【大数据趋势】1月24日 美元关键位置上,应该不会一次破,纳指有概率反弹,人民币结汇行情结束在即。

确定市场形态 - 美元指数 关键位置大概率不会一次就破&#xff0c;有较强反弹 作为长期的关键位置101-103这个区域&#xff0c;没有可能一次性涨破&#xff0c;或者一次性跌破&#xff0c;所以大概率有一次反弹出现。作为趋势线&#xff08;红色&#xff09;来看&#xff0c…

十大经典排序算法(动态演示+代码)-冒泡算法

时间、空间复杂度比较 排序算法平均时间复杂度最差时间复杂度空间复杂度数据对象稳定性冒泡排序O(n2)O(n2)O(1)稳定选择排序O(n2)O(n2)O(1)数组不稳定、链表稳定插入排序O(n2)O(n2)O(1)稳定快速排序O(n*log2n)O(n2)O(log2n)不稳定堆排序O(n*log2n)O(n*log2n)O(1)不稳定归并排序…

万能四码(0126版本)之分析

万能四码&#xff08;0126版本&#xff09;之分析一、万能四码的重新排列原版是这样的&#xff1a;0126&#xff0c;0134&#xff0c;0159&#xff0c;0178&#xff0c;0239&#xff0c;0247&#xff0c;0258&#xff0c;0357&#xff0c;0368&#xff0c;0456&#xff0c;0489…

【进阶C语言】程序环境与预处理

文章目录一.程序环境1.翻译环境编译器1.预处理2.编译3.汇编链接器2.运行环境总图解二.预处理1.预定义符号2.define1.define的定义2.替换规则3.定义的建议和使用的缺点1.加括号2.避免使用带有副作用的符号3.命名约定4.#和##1.#2.##5.宏和函数的对比6.undef3.条件编译1.常量表达式…

趣味三角——第3章——6个三角函数的成熟过程

目录 3.1 6个三角函数的演化进程简述 3.2 Johann Muller(别名Regiomontanus)的贡献 第3章 6个三角函数的成熟过程 It is quite difficult to describe with certainty the beginning of trigonometry . . . . In general, one may say that the emphasis was placed first …