Vue3组件库开发项目实战——02项目搭建(配置Eslint/Prettier/Sass/Tailwind CSS/VitePress/Vitest)

摘要:在现代前端开发中,构建一个高效、可维护且易于协作的开发环境至关重要。特别是在开发Vue3组件库时,我们需要确保代码的质量、一致性和文档的完整性。本文将带你从0搭建vue3组件库开发环境,以下是配置代码规范、格式化、CSS样式工具、文档工具、单元测试技术选型的必要性。

为什么引入ESLint和Prettier

  • ESLint:它是一个代码检查工具,可以帮助我们在编译前就能发现代码中的潜在问题,如未使用的变量、可能的逻辑错误等。通过配置ESLint,我们可以强制执行团队的代码风格和最佳实践,从而提高代码质量。
  • Prettier:作为一个代码格式化工具,Prettier可以自动调整代码的格式,确保所有代码遵循统一的格式标准。这不仅有助于提升代码的可读性,还能减少因格式问题引起的代码审查冲突。

为什么引入Sass和Tailwind CSS

  • Sass:作为一种CSS预处理器,Sass提供了变量、嵌套规则、混合(mixins)等特性,使得CSS的编写更加高效和模块化。它有助于我们更好地组织和管理样式代码。
  • Tailwind CSS:这是一个实用程序优先的CSS框架,它提供了一系列的类,可以直接在HTML中使用,快速构建界面。Tailwind CSS的灵活性和响应式设计使其成为快速原型开发和迭代的理想选择。

使用VitePress编写组件文档

  • VitePress:Vue.js的官方静态站点生成器,专为文档和博客设计。它基于Vue3和Vite,提供了简洁的Markdown语法和Vue组件的集成,使得编写和维护组件文档变得简单直观。良好的文档对于组件库的用户来说至关重要,它可以帮助用户快速理解和使用组件。

配置单元测试工具Vitest

  • Vitest:这是一个基于Vite的测试框架,它提供了快速的测试运行速度和良好的开发体验。通过编写单元测试,我们可以确保组件的每个部分都能按预期工作,减少bug的产生,提高代码的健壮性。

通过引入这些工具和库,我们不仅能够提升开发效率,还能确保代码的质量和一致性。ESLint和Prettier保证了代码风格的一致性,Sass和Tailwind CSS加速了样式开发,VitePress简化了文档编写,而Vitest则确保了组件的可靠性。这些工具的结合使用,为Vue3组件库的开发提供了一个全面、高效的解决方案。

 假设在本博客前你已经看过必备知识导学了

Vue3组件库开发项目实战——01组件开发必备知识导学-CSDN博客

创建vite项目

用vite首先创建一个支持ts的项目:使用命令 npm create vite或yarn create vite

设置一个项目名称,并选择Vue+TypeScript

安装JSX

在Vite项目中引入JSX,我们可以通过@vitejs/plugin-vue-jsx插件实现,首先安装它:

使用命令:npm i @vitejs/plugin-vue-jsx -D 或 yarn add @vitejs/plugin-vue-jsx -D

配置JSX

配置一下该插件,在vite.config.ts配置文件中

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import vueJsx from "@vitejs/plugin-vue-jsx";// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(), vueJsx()],
});

安装ESLint

ESLint:用于代码风格检查和规范。使用下面命名:确保不会因为版本号冲突

npm install @typescript-eslint/eslint-plugin@^5.7.0 @typescript-eslint/parser@^5.7.0 eslint@^8.5.0 eslint-plugin-vue@^8.2.0 --save-dev

配置.eslintrc.js

在项目根目录创建一个 .eslintrc.js

module.exports = {env: {browser: true,es2021: true,node: true,"vue/setup-compiler-macros": true,},extends: ["eslint:recommended","plugin:vue/essential","plugin:@typescript-eslint/recommended","plugin:vue/vue3-recommended",],parserOptions: {ecmaVersion: 13,parser: "@typescript-eslint/parser",sourceType: "module",},plugins: ["vue", "@typescript-eslint"],rules: {"no-console": process.env.NODE_ENV === "production" ? "warn" : "off","no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off","vue/no-multiple-template-root": "off","vue/max-attributes-per-line": "off","vue/singleline-html-element-content-newline": "off","vue/multiline-html-element-content-newline": "off","vue/html-self-closing": "off",},
};

运行ESlint

然后在 package.jsonscripts 中添加 ESLint 的运行命令 "lint": "eslint . --ext .ts,.vue"

运行npm run lint

将第五行删除,解决报错

安装Prettier

使用命令:npm i -d prettier eslint-plugin-prettier eslint-config-prettier

或者

yarn add -D prettier eslint-plugin-prettier eslint-config-prettier

配置.prettierrc.js

创建一个 prettier.config.js 文件

module.exports = {// printWidth: 80,// tabWidth: 2,// useTabs: false,semi: false, // 未尾逗号, default:  truesingleQuote: true, // 单引号 default: false// quoteProps: 'as-needed',// jsxSingleQuote: false,trailingComma: "none", // 未尾分号 default: es5    all | none | es5// bracketSpacing: true,// bracketSameLine: false,// jsxBracketSameLine: false,arrowParens: "avoid", // default: always// insertPragma: false,// requirePragma: false,proseWrap: "never",// htmlWhitespaceSensitivity: 'css',// vueIndentScriptAndStyle: false,  // .vue 缩进endOfLine: "auto", // default lf
};

修改.eslintrc.js文件

module.exports = {env: {browser: true,es2021: true,node: true,'vue/setup-compiler-macros': true},extends: ['eslint:recommended','plugin:vue/essential','plugin:@typescript-eslint/recommended','plugin:vue/vue3-recommended','plugin:prettier/recommended'],parserOptions: {ecmaVersion: 13,parser: '@typescript-eslint/parser',sourceType: 'module'},plugins: ['vue', '@typescript-eslint'],rules: {'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off','no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off','vue/no-multiple-template-root': 'off','vue/max-attributes-per-line': 'off','vue/singleline-html-element-content-newline': 'off','vue/multiline-html-element-content-newline': 'off','vue/html-self-closing': 'off','prettier/prettier': 'off'}
}

解决可能的 Delete `␍`eslint(prettier/prettier)问题

git config --global core.autocrlf false

 安装VitePress

使用命令:npm add -D vitepress 或 yarn add -D vitepress
Getting Started | VitePress vitepress api文档 Getting Started | VitePress

vitepress目录初始化

使用npx vitepress init命令初始化vitepress项目目录结构

项目目录如下

启动vitepress

初始化后scripts会自动添加如下vitepress启动脚本

{"scripts": {"docs:dev": "vitepress dev docs","docs:build": "vitepress build docs","docs:serve": "vitepress serve docs","docs:preview": "vitepress preview docs"}
}

 

输入命令:npm run docs:dev 

 

 浏览器打开地址,可以看到通过npx vitepress init初始化后的的内容已经渲染到vitepress页面了

 安装Sass + Tailwind CSS

使用命令

npm install -D sass tailwindcss postcss autoprefixer

 tailwindcss配置初始化

npx tailwindcss init -p 

配置Tailwind CSS

/** @type {import('tailwindcss').Config} */
module.exports = {content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],theme: {extend: {}},plugins: []
}

新增src/index.scss文件

/* index.scss */
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';

在main.ts中引入tailwindcss样式文件

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import './index.scss'createApp(App).mount('#app')

可以通过vite的示例components中测试一下tailwind css是否可以用

打开浏览器可以看到样式已经生效了

Tailwind css常用样式

Tailwind CSS 是一个高度可定制的 CSS 框架,提供了丰富的实用类,可以帮助快速构建现代化的网页界面。以下是一些 Tailwind CSS 中常用的样式类:

  1. 布局类

    • container: 设置页面内容的最大宽度并居中显示。
    • mx-auto: 水平居中。
    • my-auto: 垂直居中。
    • flex: 创建弹性布局。
    • grid: 创建网格布局。
  2. 间距类:rem是根元素的fontsize

    • m-4: 设置外边距为 1rem。
    • p-4: 设置内边距为 1rem。
    • mx-8: 设置水平外边距为 2rem。
    • my-8: 设置垂直外边距为 2rem。
  3. 字体类

    • text-sm: 设置字体大小为小号。
    • font-bold: 设置字体为粗体。
    • text-center: 文本水平居中显示。
    • text-gray-500: 设置文本颜色为灰色。
  4. 背景类

    • bg-gray-200: 设置背景颜色为灰色。
    • bg-cover: 背景图像覆盖整个元素。
    • bg-center: 背景图像居中显示。
  5. 边框类

    • border: 添加边框。
    • border-gray-300: 设置边框颜色为灰色。
    • rounded-md: 添加圆角边框。
  6. 响应式类

    • sm:text-lg: 在小屏幕上设置文本大小为大号。
    • md:hidden: 在中等屏幕上隐藏元素。

这些只是 Tailwind CSS 中一部分常用样式类,Tailwind CSS 还提供了许多其他实用类,可以根据具体需求灵活使用。Tailwind CSS 的特点是通过组合这些类来构建界面,避免了手动编写大量的 CSS 样式,提高了开发效率。

安装vitest

npm install -D vitest happy-dom @testing-library/vue

  • vitest: 测试框架,用于执行整个测试过程并提供断言库、mock、覆盖率
  • happy-dom: 是用于提供在 Node 环境中的 Dom 仿真模型

配置vite.config.ts

在配置时,我们发现 ts文件会报错。这是由于 test 属性属于 Vitest 的扩展属性,vite 原生配置中并没有定义这个属性。在vite.config.ts顶部加上///注释

/// <reference types="vitest" />
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(), vueJsx()],test: {globals: true,environment: 'happy-dom',// 支持tsx组件,很关键transformMode: {web: [/\.[jt]sx$/]}}
})

配置vitest启动命令

在script脚本中添加

    "test": "vitest","coverage": "vitest run --coverage"

测试vitest

来测试一下vitest的效果吧,随意创建sum.js文件和sum.test.js文件

 

// sum.js
export function sum(a, b) {return a + b
}
// sum.test.js
import { expect, test } from 'vitest'
import { sum } from './sum'test('adds 1 + 2 to equal 3', () => {expect(sum(1, 2)).toBe(3)
})

简单解析这段代码:

  1. import { expect, test } from 'vitest': 这行代码从 'vitest' 模块中导入了 expecttest 两个函数。expect 用于编写断言,test 用于定义测试用例。

  2. import { sum } from './sum': 这行代码从当前目录下的 sum.js 文件中导入了 sum 函数,以便在测试中使用。

  3. test('adds 1 + 2 to equal 3', () => { ... }): 这是一个测试用例,使用 test 函数定义。第一个参数是测试用例的描述,第二个参数是一个函数,包含了测试用例的具体实现。

  4. expect(sum(1, 2)).toBe(3): 在测试用例的实现中,调用了 sum 函数,并使用 expect 函数对其返回值进行断言。这里断言的意思是调用 sum(1, 2) 的结果应该等于 3

运行vitest查看测试用例是否通过

vitest常用指令

Vitest 的断言方法大致可以分为以下几类:

  1. 基本类型比较:

    • toBenot.toBe: 检查值是否相等或不等。
    • toBeDefinedtoBeUndefined: 检查值是否定义或未定义。
    • toBeNulltoBeTruthy/toBeFalsy: 检查值是否为 null、零、空字符串等。
  2. 值的精确匹配:

    • toEqual: 检查值的精确结构和内容(包括数组和对象)。
    • toBeCloseTo: 检查数值的近似相等。
  3. 类型和实例检查:

    • toBeInstanceOf: 检查值是否是某个构造函数的实例。
  4. 正则表达式匹配:

    • toMatch: 检查值是否匹配给定的正则表达式。
  5. 异常处理:

    • toThrow: 检查函数是否抛出预期的错误。
    • toThrowErrorMatchingSnapshot: 检查错误是否与预期的错误信息一致。
  6. 自定义断言:

    • expect.extend: 用户可以扩展自定义的断言方法。
    • expect.addType: 添加类型检查功能,如检查值是否为特定类型。

这些断言方法是 Vitest 测试框架中的核心工具,用于验证代码的行为是否符合预期。

详细的

  • expect(value).toBe(expected): 检查 value 是否等于 expected。
  • expect(value).not.toBe(expected): 检查 value 是否不等于 expected。
  • expect(value).toBeDefined(): 检查 value 是否已定义。
  • expect(value).toBeUndefined(): 检查 value 是否未定义。
  • expect(value).toBeNull(): 检查 value 是否为 null。
  • expect(value).toBeTruthy(): 检查 value 是否为真值(非空字符串、非零数字、非 false、非 null、非 undefined)。
  • expect(value).toBeFalsy(): 检查 value 是否为假值(空字符串、零、falsenullundefined)。
  • expect(value).toEqual(expected): 检查 value 是否与 expected 相等,包括对象、数组等结构。
  • expect(value).toBeCloseTo(expected, delta): 检查 value 是否与 expected 数值类型相差不超过 delta 的绝对值。
  • expect(value).toBeInstanceOf(constructor): 检查 value 是否为 constructor 的实例。
  • expect(value).toMatch(pattern): 检查 value 是否与 pattern 正则表达式匹配。
  • expect(value).toThrow(error): 检查 value 是否是一个抛出 error 的函数。
  • expect(value).toThrowErrorMatchingSnapshot(): 检查 value 是否是一个抛出错误,并与快照进行比较。

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

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

相关文章

扩散模型diffusion model

一 什么是扩散模型 1.1 现有生成模型 已经有大量的方法证明深度生成模型能够模拟人类的想象思维&#xff0c;生成人类难以分辨真伪的内容&#xff0c;主要方法如下&#xff1a; 1、GAN&#xff1a;用神经网络训练生成器和判别器 GAN 的主要思想&#xff1a; GAN 就是一个互搏的…

49.乐理基础-拍号的类型-单拍子、复拍子

当前写的东西&#xff0c;如果只是想要看懂乐谱的话&#xff0c;它是没什么意义的&#xff0c;就像我们要把 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5。。。称为自然数&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5称为正整…

H5 云商城 file.php 文件上传致RCE漏洞复现

0x01 产品简介 H5 云商城是一个基于 H5 技术的电子商务平台,旨在为用户提供方便快捷的在线购物体验。多平台适配:H5 云商城采用 H5 技术开发,具有良好的跨平台适配性。无论是在电脑、手机还是平板等设备上,用户都可以通过网页浏览器访问和使用云商城,无需安装额外的应用程…

销量?模糊销量?精准销量?如何获取淘宝商品销量数据接口

淘宝爬虫商品销量数据采集通常涉及以下几个步骤&#xff1a; 1、确定采集目标&#xff1a;需要明确要采集的商品类别、筛选条件&#xff08;如天猫、价格区间&#xff09;、销量和金额等数据。例如&#xff0c;如果您想了解“小鱼零食”的销量和金额&#xff0c;您需要设定好价…

vueday1

1.作用&#xff1a;利用表达式进行插值&#xff0c;渲染到页面中 三元表达式、点语法、数组对应项&#xff0c;方法、点语法方法 1.使用的时候需要存在&#xff0c;需要在data里面声明&#xff0c;如果没有声明会报错 2.ifelse不能用 3.不能在标签属性中使用{{}}插值 <!DO…

【前端】打砖块游戏:实现细节介绍

打砖块游戏:实现细节介绍 在本文中,我将详细介绍如何使用HTML、CSS和JavaScript技术构建一个简单的打砖块游戏。我们将重点讨论游戏的三个核心技术方面:碰撞检测、画图和事件监听。 完整代码我放在:github可以直接拉取代码测试。 游戏概览 打砖块游戏中,玩家通过控制底…

静态住宅IP优缺点总结

在进行海外 IP 代理时&#xff0c;了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和&#xff0c;并提供选择建议&#xff0c;帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…

涨点神器:即插即用特征融合模块!超低参数,性能依旧SOTA

在写论文时&#xff0c;一些通用性模块可以在不同的网络结构中重复使用&#xff0c;这简化了模型设计的过程&#xff0c;帮助我们加快了实验的迭代速度。 比如在视觉任务中&#xff0c;即插即用的特征融合模块可以无缝集成到现有网络中&#xff0c;以灵活、简单的方式提升神经…

7.STL中string的一些超常用函数 (附习题)

目录 1.find 2.atoi 3.to_string 4.getline 【leetcode 习题】 387.字符串中的第一个唯一字符 125. 验证回文串 1.find 1.查找第一次出现的目标字符串&#xff1a;说明&#xff1a;如果查找成功则输出查找到的第一个位置&#xff0c;否则返回-1&#xff1b; s1.find(s2…

宇宙(科普)

宇宙&#xff08;Universe&#xff09;在物理意义上被定义为所有的空间和时间&#xff08;统称为时空&#xff09;及其内涵&#xff0c;包括各种形式的所有能量&#xff0c;比如电磁辐射、普通物质、暗物质、暗能量等&#xff0c;其中普通物质包括行星、卫星、恒星、星系、星系…

【目标检测】YOLOv5|YOLOv8模型QT界面可视化部署

YOLO-Deploy-QT_Interface 最近笔者做了YOLO系列算法的部署工作,现做一个总结。主要工作是做了用于部署YOLOv5和YOLOv8的可视化QT界面,可实现图片、文件夹、视频、摄像头的ONNX与OpenVino部署,具体效果如下: 代码链接:https://github.com/Zency-Sun/YOLO-Deploy-QT_Inte…

Centos7 配置 DNS服务器

Centos 7 配置DNS服务器 环境描述&#xff1a; 一台服务器和一台用于测试的客户机 服务器IP&#xff1a;192.168.200.132 客户机IP&#xff1a;192.168.200.143 服务器配置 yum install bind bind-utils -y #安装软件包vim /etc/named.conf //编辑named主配置文件listen-on p…

【Linux】解析键盘组合键产生信号的完整过程:从硬件中断到信号发送

前言 每一个了解Linux的都知道这样一个知识&#xff0c;CtrlC组合键能够终止一个进程。 个人了解进程相关知识之后知道&#xff0c;一个进程被终止只会有有三种情况&#xff1a; 代码运行完毕&#xff0c;结果正确代码运行完毕&#xff0c;结果不正确代码运行异常&#xff…

huggingface 笔记:pipeline

1 介绍 pipeline() 是使用预训练模型进行推理的最简单和最快速的方式。可以针对不同模态的许多任务直接使用 pipeline() 2 举例&#xff1a;情感分析 2.1 创建pipeline实例 from transformers import pipelineclassifier pipeline("sentiment-analysis") #首先创…

SystemC学习使用记录

一、概述 对于复杂的片上系统&#xff0c;在进行RTL编码前&#xff0c;需进行深入的系统级仿真&#xff0c;以确认设计的体系结构是否恰当、总线是否能满足吞吐量和实现性要求以及存储器是否浪费&#xff0c;所进行的这些仿真要求在芯片的仿真模型上运行大量的软件&#xff0c…

跨境必看|TikTok账号运营的八大秘籍

国内的传统生意都是可以在抖音上做&#xff0c;那么也可以在TikTok 上重新做一遍。那该如何才能把握住这片巨大的蓝海&#xff0c;TikTok 账号的运营就成为了主要的关键了&#xff0c;对于TikTok账号运营的八大秘籍&#xff0c;大家一起看看是如何做的&#xff1f; 一、固定节…

为什么需要使用SOCKS5代理?

SOCKS代表Socket Secure&#xff0c;是一种网络协议&#xff0c;能够在网络上进行数据传输。SOCKS5是SOCKS协议的第五个版本&#xff0c;它提供了更加安全和灵活的数据传输方式&#xff0c;因此在网络安全和隐私保护方面被广泛应用。在我们的日常生活中&#xff0c;为什么需要使…

VMware虚拟机安装详细教程

VMware下载安装好后&#xff0c;下载好我们要安装的操作系统的镜像文件后&#xff0c;此处安装的为centos7版本&#xff0c;就可以开始安装了。 1点击下一步 image 2、勾选【我接受条件款协议中的条款】&#xff0c;然后点击【下一步】。 image 3、取消勾选&#xff0c;然后点…

富在术数,不在劳身 财富的积累更多依赖于智慧和策略,而不是单纯的体力劳动 GPT-4o免费用

"富在术数&#xff0c;不在劳身"这句话的意思是财富的积累更多依赖于智慧和策略&#xff0c;而不是单纯的体力劳动。这句话强调了智慧和技巧在获取财富过程中的重要性&#xff0c;提示人们在追求财富时&#xff0c;应注重策略和方法的运用&#xff0c;而不仅仅依靠辛…

prompt工程策略(三:使用 LLM 防护围栏创建系统提示)

原文&#xff1a;我是如何赢得GPT-4提示工程大赛冠军的 原文的原文&#xff1a; How I Won Singapore’s GPT-4 Prompt Engineering Competition &#xff01;&#xff01;本内容仅适用于具有 System Prompt&#xff08;系统提示&#xff09;功能的 LLM。具有这一功能的最著名 …