【常用组件整理】
xgplayer 字节开发的前端视频播放器
xgplayer是一个由字节跳动开发的强大的前端视频播放器,具有稳定性高、文档清晰、支持弹幕和移动端优化
等特点。相较于VideoJs,xgplayer的文档更简洁,自定义插件更为便捷。xgplayer还提供了丰富的插件来扩展功能,例如支持FLV格式的xgplayer-flv插件,支持M3U8格式的
xgplayer-hls.js插件,以及弹幕功能的插件等
npm install xgplayerimport Player from 'xgplayer';
import 'xgplayer/dist/index.min.css';<template><div ref="player"></div>
</template><script>
import Player from 'xgplayer';export default {mounted() {const playerOpts = {id: 'player',url: '//sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-360p.mp4',height: 400,width: 500,autoplay: true,// 其他配置...};const player = new Player(playerOpts);}
}
</script>
vue-types 可配置的父传子prop验证器
vue-types是一个为Vue.js设计的可配置的prop验证器集合,灵感来源于React的prop-types。它提供了一种简洁流畅的接口来定义复杂的组件prop验证,使得在Vue.js中进行细粒度的prop验证变得更加方便和高效。
npm install vue-types --saveimport VueTypes from 'vue-types';// 使用VueTypes定义你的组件props
import Vue from 'vue';
import VueTypes from 'vue-types';export default Vue.extend({name: 'ComplexComponent',props: {name: VueTypes.string.isLength(2, 20).isRequired,age: VueTypes.number.def(0).isGreaterThan(0),isStudent: VueTypes.bool.def(false),address: VueTypes.object.shape({street: VueTypes.string.isLength(3, 50),city: VueTypes.string.isLength(2, 50),country: VueTypes.string.isLength(2, 50),}).def({}),hobbies: VueTypes.array.of(VueTypes.string.isLength(1, 50)).def([]),contactNumber: VueTypes.string.isPhoneNumber.def(''),},
});
}.def 默认值
.isRequired() 必需
vue-json-pretty 将 JSON 数据渲染为树形结构的 Vue 组件
vue-json-pretty 是一个用于将 JSON 数据渲染为树形结构的 Vue 组件。它的主要功能是帮助用户更清晰地查看和理解 JSON 数据。这个组件支持 Vue 3 和 Vue 2,且具备多种配置选项,例如是否显示行号、是否显示图标、是否支持编辑等。
主要功能:
JSON 格式化:将 JSON 数据以树形结构展示,方便用户阅读和理解。
数据选择:支持从 JSON 数据中获取特定节点的数据。
大数据支持:能够处理大规模的 JSON 数据,并提供虚拟滚动功能以优化性能。
可编辑:支持对 JSON 数据进行编辑,并提供多种触发编辑的方式(如单击或双击)。
主题设置:支持 light 和 dark 两种主题,适应不同的界面风格。
事件处理:提供多个事件处理功能,如 nodeClick、bracketsClick 和 iconClick,增强了组件的交互性
npm install vue-json-pretty<VueJsonPrettyv-model:data="localModelValue":deep="deep":show-length="showLength":show-line-numbers="showLineNumbers":show-line-number="showLineNumber":show-icon="showIcon":show-double-quotes="showDoubleQuotes":virtual="virtual":height="height":item-height="itemHeight":root-path="rootPath":node-selectable="nodeSelectable":selectable-type="selectableType":show-select-controller="showSelectController":select-on-click-node="selectOnClickNode":highlight-selected-node="highlightSelectedNode":collapsed-on-click-brackets="collapsedOnClickBrackets":render-node-key="renderNodeKey":render-node-value="renderNodeValue":editable="editable":editable-trigger="editableTrigger"@node-click="nodeClick"@brackets-click="bracketsClick"@icon-click="iconClick"@selected-change="selectedChange"/>
vue-i18n 国际化语言插件
vue-i18n 是一个 Vue.js 的国际化插件,用于实现多语言支持。它允许开发者在应用程序中轻松地添加多语言功能,以便用户可以根据自己的语言偏好选择显示的语言。通过 Vue i18n,开发者可以:
多语言支持:允许应用支持多种语言,使得应用能够适应不同的语言环境,提供更好的用户体验。
文本翻译:提供了一种简单的方式来翻译应用程序中的文本。
语言切换:支持在运行时动态切换应用的语言,而无需重新加载页面。
格式化:支持日期、数字等类型的格式化,这对于构建国际化应用至关重要
npm install vue-i18n
// 创建 Vue i18n 实例
const messages = {en: {message: {hello: 'Hello World!'}},zh: {message: {hello: '你好世界!'}}
};const i18n = new VueI18n({locale: 'en', // 设置默认语言messages // 设置语言消息
});
// 注册 main.jsimport Vue from 'vue';
import VueI18n from 'vue-i18n';
import messages from './locales'; // 引入语言文件Vue.use(VueI18n);const i18n = new VueI18n({locale: 'en', // 设置默认语言messages, // 消息对象
});new Vue({i18n, // 把 i18n 实例传递给根 Vue 实例render: h => h(App),
}).$mount('#app');
// 切换中英文
<template><div><h1>{{ $t('message.hello') }}</h1><button @click="changeLanguage('zh')">切换到中文</button><button @click="changeLanguage('en')">切换到英文</button></div>
</template><script>
export default {methods: {changeLanguage(lang) {this.$i18n.locale = lang;}}
};
</script>// 页面使用
<p>{{ $t('hello') }}</p>
<p>{{ $t('message.hello') }}</p>
全局方法 组件 插件 参数
//全局方法
Vue.prototype.$getDicts = function (key) {return getDicts(key);
};
this.$getDicts(this.key)
//全局参数
Vue.config.globalProperties.$globalParam = 'some value';
this.$globalParam;
//全局组件
Vue.component('my-global-component', MyGlobalComponent);
<my-global-component></my-global-component>
//全局插件
Vue.use(VueI18n);
this.$i18n.locale = lang;
vue-draggable-plus Vue 3 和 Vue 2 的拖拽组件库
vue-draggable-plus 是一个支持 Vue 3 和 Vue 2 的拖拽组件库,基于 Sortable.js,提供高度兼容性和灵活性,适用于多种拖拽场景。它解决了 Sortable.js 官方 Vue 组件在使用上的痛点,使得开发者可以在任何元素上使用拖拽列表,通过指定目标容器,确保了与各种组件库的良好集成。
vue-draggable-plus 还提供了许多其他功能,如滚动支持、悬浮拖拽、拖拽分组和样式自定义等
npm install vue-draggable-plus<template><div><VueDraggable v-model="list" :animation="200"><div v-for="item in list" :key="item.id">{{ item.name }}</div></VueDraggable></div>
</template><script>
import { ref } from 'vue';
import { VueDraggable } from 'vue-draggable-plus';export default {components: {VueDraggable},setup() {const list = ref([{ name: 'Joao', id: 1 },{ name: 'Jean', id: 2 },{ name: 'Johanna', id: 3 },{ name: 'Juan', id: 4 }]);return { list };}
};
</script>
url Node.js的内置模块 解析地址为对象
Node.js的内置模块。这个模块提供了一个简单的工具来解析、构建和修改URLs。
url.parse方法将URL字符串解析为一个对象,该对象包含协议、用户名、密码、主机名、端口、路径和查询参数等部分
const url = require('url');let parsedUrl = url.parse('http://user:pass@google.com:8080/foo?bar=baz#qux');
console.log(parsedUrl);
qs 处理 URL 参数序列化和反序列化的 JavaScript 库
qs 是一个用于处理 URL 参数序列化和反序列化的 JavaScript 库。它提供了一个简单且功能强大的方法来将 JavaScript 对象转换为 URL 参数字符串,以及将 URL 参数字符串解析为 JavaScript 对象
文档
const qs = require('qs');const params = {name: '张三',age: 25,location: '北京'
};const queryString = qs.stringify(params);
console.log(queryString); // 输出: "name=张三&age=25&location=北京"const qs = require('qs');const queryString = 'name=张三&age=25&location=北京';const params = qs.parse(queryString);
console.log(params); // 输出: { name: '张三', age: '25', location: '北京' }
qrcode 生成二维码的库
qrcode主要负责生成二维码。它可以接受文本、URL或其他信息,并生成一个可以扫描的二维码图像。这种二维码通常用于快速访问、存储或分享信息。
npm install qrcode var qrcode = new QRCode(document.getElementById("qrcode"), {text: "https://example.com",width: 200,height: 200,
});
pinia 和 pinia-plugin-persistedstate
pinia 是一个为 Vue.js 应用程序设计的状态管理库。它提供了一种轻量级的、可组合的方式来管理应用中的状态。pinia-plugin-persistedstate 是 pinia 的一个插件,用于实现状态的持久化。
pinia
1、全局状态管理:允许你在应用程序的不同组件之间共享状态。
2、简化 API:与 Vuex 相比,Pinia 提供了更简单的 API,使开发者能够更容易地管理和操作状态。
3、TypeScript 支持:Pinia 完全支持 TypeScript,这意味着你可以利用 TypeScript 的类型检查和自动完成功能来编写更安全的代码。
4、组合式 API:Pinia 支持 Vue 3 的组合式 API,这意味着你可以使用 setup() 函数和 ref、computed 等响应式工具来管理状态。
pinia-plugin-persistedstate 主要负责:
状态持久化:将 Pinia store 中的状态保存到浏览器的本地存储(如 localStorage 或 sessionStorage)中。这样,当页面刷新或用户关闭并重新打开浏览器时,这些状态仍然可以保持。
自动恢复:当应用加载时,从本地存储中恢复之前保存的状态。
// 安装
npm install pinia pinia-plugin-persistedstate
// 配置 Pinia 实例
import { createPinia } from 'pinia';
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';const pinia = createPinia();
pinia.use(piniaPluginPersistedstate());
// 应用 在你的 store 定义中,不需要额外的配置,pinia-plugin-persistedstate 将会自动处理状态的持久化和恢复。
import { defineStore } from 'pinia';export const useMyStore = defineStore('myStore', {state: () => ({count: 0,}),actions: {increment() {this.count++;},},
});
nprogress 进度条库
NProgress 是一个轻量级的进度条库,它可以在单页应用(SPA)的页面加载或 AJAX 请求等操作时显示一个进度条,从而向用户提供加载提示,提升用户体验。
npm install nprogressimport NProgress from 'nprogress';
import 'nprogress/nprogress.css';
NProgress.start();
NProgress.done();
NProgress.configure({easing: 'ease',speed: 200,showSpinner: false
});
monaco-editor 代码编辑器
Monaco Editor 是一个由微软开源的基于浏览器的代码编辑器,它是 Visual Studio Code(VS Code)的核心部分。Monaco Editor 提供了丰富的特性,包括语法高亮、代码折叠、代码提示(IntelliSense)、多光标选择、搜索和替换等。Monaco Editor 支持多种编程语言,包括JavaScript、TypeScript、JSON、HTML、CSS、Less、Sass 等。此外,还可以通过 Monarch 或 Language Server Protocol(LSP)添加对其他语言的支持。Monaco Editor 使用 Web 技术(HTML、CSS 和 JavaScript)开发,可以轻松地集成到 Web 应用中。
npm install monaco-editor//引入monaco-editor
import { createApp } from 'vue';
import MonacoEditor from 'monaco-editor';// 引入必要的monaco-editor的worker文件
import 'monaco-editor/esm/vs/editor/editor.main.nls.js';
import 'monaco-editor/esm/vs/editor/editor.main.css';
import 'monaco-editor/esm/vs/basic-languages/javascript/javascript.contribution.js';// 创建Vue应用
const app = createApp({});// 在Vue组件中使用MonacoEditor
app.component('monaco-editor', {props: ['value', 'language', 'theme', 'options'],template: '<div ref="container"></div>',mounted() {this.editor = MonacoEditor.create(this.$refs.container, {value: this.value,language: this.language,theme: this.theme,...this.options});},watch: {value(newValue) {this.editor.setValue(newValue);},language(newValue) {this.editor.updateOptions({ language: newValue });},theme(newValue) {MonacoEditor.setTheme(newValue);this.editor.updateOptions({ theme: newValue });}},beforeUnmount() {if (this.editor) {this.editor.dispose();}}
});app.mount('#app');
// 使用
<template><div><monaco-editor v-model:value="code" :language="language" :theme="theme" :options="editorOptions" /></div>
</template><script>
export default {data() {return {code: '// 编写你的代码...',language: 'javascript',theme: 'vs-dark',editorOptions: {selectOnLineNumbers: true,roundedSelection: false,readOnly: false,cursorStyle: 'line',automaticLayout: false}};}
};
</script>
mitt 轻量性和简单性 实现任意组件间的通信
实现任意组件间的通信,mitt相当于 上一节自定义事件 的一个规范性包,让我们可以规范写 绑定组件(emitter.on) 和 触发组件(emitter.emitt)
mitt是一个轻量级的事件总线库,用于在应用程序的不同部分之间进行事件驱动的通信。它提供了简单的API来创建、监听和触发事件,使组件间的通信变得简单且易于管理。mitt适用于各种JavaScript环境,包括Vue.js应用。
mitt由于其轻量性和简单性,在Vue.js应用中的组件间通信中是一种非常实用的工具。
npm install mitt// main.js引入
import { createApp } from 'vue';
import App from './App.vue';
import mitt from 'mitt';
const app = createApp(App);
const emitter = mitt();
app.config.globalProperties.$bus = emitter;
app.mount('#app');
//在组件中使用mitt: 在需要通信的组件中,可以通过this.$bus访问全局的事件总线实例。
// 组件A中,使用emit方法触发事件
this.$bus.emit('custom-event', { message: 'Hello from Component A' });// 组件B中,使用on方法监听事件
this.$bus.on('custom-event', (data) => {console.log(data.message); // 输出 'Hello from Component A'
});
//监听和移除事件
import { onMounted, onUnmounted } from 'vue';onMounted(() => {this.$bus.on('custom-event', (data) => {console.log(data.message);});
});onUnmounted(() => {this.$bus.off('custom-event');
});
lodash-es ES6 的函数和工具
lodash-es 是一个 JavaScript 的实用工具库,提供了许多有用的函数和工具,用于处理数组、对象、数字、字符串、函数等。它的目标是为开发者提供一个更简洁、更易于使用的工具集,帮助他们在处理各种常见编程任务时避免复杂的代码。
lodash-es 的 “es” 后缀意味着这个版本的 lodash 是为 ES6 模块系统设计的,更适合现代 JavaScript 项目。
文档
npm install lodash-esimport { map } from 'lodash-es';return map(arr, (item) => item * 2);//对数组进行映射操作
return filter(arr, (num) => num % 2 === 0);//对数组进行过滤操作。
return get(obj, key, 'default value');//从对象中安全地获取属性值。return isEqual(a, b);//判断两个值是否相等。debouncedMethod: debounce(function() {//防抖函数,常用于处理高频事件。// ...}, 300)
echarts-wordcloud 基于 echarts 的一个词云库
echarts-wordcloud 是基于 echarts 的一个词云库,用于在 echarts 可视化图表中创建词云。它能够和 echarts.js 完美融合,使用起来非常方便,支持自定义词云的颜色、形状、布局和样式等多种设置。
npm install echarts echarts-wordcloudimport * as echarts from 'echarts';
import 'echarts-wordcloud';export default {mounted() {this.initEchart();},methods: {initEchart() {var myChart = echarts.init(document.getElementById("wordChart"));let option = {series: [{type: "wordCloud",// ...其他配置,如 sizeRange, rotationRange, data 等}]};myChart.setOption(option);window.addEventListener("resize", function() {myChart.resize();});}}
}
<template><div class="chartBox"><div id="wordChart" style="{ width: '100%', height: '100%' }"></div></div>
</template>
driver.js
driver.js 是一个开源的、轻量级的 JavaScript 库,用于创建引导(tour)和教程。它允许你在网页上添加交互式的引导步骤,帮助用户了解或熟悉网页的某个特定部分。
driver.js 主要负责以下几个功能:
创建引导:允许你定义多个步骤,每个步骤都可以有标题、描述和指向特定元素的箭头。
自定义样式:你可以自定义每个引导步骤的样式,包括颜色、背景、字体等。
交互:用户可以点击“下一步”或“上一步”按钮来导航引导,也可以关闭引导。
兼容性:driver.js 支持现代浏览器,包括 Chrome、Firefox、Safari、Edge 等。
npm install driver.js
import Driver from 'driver.js';export default {mounted() {this.initTour();},methods: {initTour() {const driver = new Driver();driver.defineSteps([{element: '#element1',popover: {title: '标题1',desc: '描述1',position: 'right'},onEnd: function() {// 当步骤结束时,你可以在这里添加额外的逻辑}},// ... 添加更多步骤]);driver.start();}}
}
//在模板中添加元素
<div id="element1">这是一个元素</div>
dayjs 日期库
Day.js 是一个轻量级的 JavaScript 日期库,用于解析、验证、操作和显示日期和时间。它提供了与 Moment.js 类似的 API,但体积更小,加载速度更快。Day.js 专注于日期和时间的计算,不包含时间格式的解析或本地化功能,这使得它在体积上非常小巧,同时保持了高性能。Day.js 支持多种语言,易于定制,非常适合在前端开发中处理日期和时间问题。
npm install dayjsimport dayjs from 'dayjs';
Vue.prototype.$dayjs = dayjs;export default {mounted() {this.initDate();},methods: {initDate() {const currentDateTime = this.$dayjs().format('YYYY-MM-DD HH:mm:ss');// 这里的 currentDateTime 就是格式化后的当前日期和时间}}
}
cropperjs 图像的裁剪
Cropper.js 是一个轻量级的 JavaScript 库,主要用于处理图像的裁剪。它支持各种浏览器,包括 Chrome、Firefox、Safari、Edge 和 IE11 等。Cropper.js 提供了强大的功能,包括裁剪、缩放、旋转和翻转图像,同时还可以自定义样式和配置,以满足不同的需求。
配置:可以配置 VueCropper 组件的属性,如 src(图片源路径)、aspectRatio(裁剪框的宽高比)等。
方法调用:可以通过 $refs 访问 VueCropper 实例,并调用其内部方法,如 rotate(旋转)等
npm install vue-cropperjsimport Vue from 'vue';
import VueCropper from 'vue-cropperjs';
Vue.component('VueCropper', VueCropper);<template><VueCropper ref="cropper" :src="imgSrc" alt="上传图片" />
</template>
animate.css CSS 动画库
animate.css 是一个流行的 CSS 动画库,它包含了一系列预定义的动画效果,可以轻松地应用到 HTML 元素上。这些动画效果包括淡入淡出、滑动、缩放、旋转等。使用 animate.css,你可以为网页上的元素添加动态效果,提升用户体验。
不需要通过 npm 或 yarn 安装。你可以直接从官方网站下载它,或者通过 CDN 链接引入。
animate.css的GitHub仓库地址是:https://github.com/daneden/animate.css。
文档
<div class="animated fadeIn">这是一个带有淡入效果的元素</div><transition name="fade"><div v-if="show">这是一个可以切换的元素</div>
</transition>.fade-enter-active, .fade-leave-active {transition: opacity 1s;
}
.fade-enter, .fade-leave-to {opacity: 0;
}
@zxcvbn-ts/core 密码强度估计器
@zxcvbn-ts/core是一个基于TypeScript的密码强度估计器,它基于zxcvbn密码强度估计器。这个库用于帮助开发者评估用户设置的密码的复杂度和安全性。这个库的计算依据包括密码长度、字符类型、词典攻击检测、评分系统和熵计算。它提供了一个分数系统,从0到4分,分数越高表示密码越安全。
import { zxcvbn } from '@zxcvbn-ts/core';// 使用zxcvbn函数计算密码强度
console.log(zxcvbn('123').score); // 0
console.log(zxcvbn('123123#@!').score); // 1
console.log(zxcvbn('123123#@!').score); // 2
console.log(zxcvbn('123123#@!*a').score); // 3
console.log(zxcvbn('123_a_123#@!').score); // 4
@wangeditor/editor-for-vue 富文本编辑器
@wangeditor/editor-for-vue是一个为Vue.js设计的富文本编辑器组件,它基于wangEditor核心库,提供了一个在Vue应用中易于使用的富文本编辑器。这个组件提供了文本编辑器的所有基本功能,包括文本格式化、插入图片、链接、表格等,并且可以根据需要扩展功能。
npm install @wangeditor/editor @wangeditor/editor-for-vue// 在Vue组件中引入Editor和Toolbar组件
import { Editor, Toolbar } from '@wangeditor/editor-for-vue';
// 配置编辑器: 使用editorConfig选项配置编辑器,包括占位符、是否只读、是否自动聚焦等
const editorConfig = ref({placeholder: '请输入内容...',readOnly: false,autoFocus: true,scroll: true,maxLength: 1000,// 其他配置...
});// 创建编辑器实例: 在Vue组件的setup函数中,创建Editor实例并将其附加到editorRef
const editorRef = shallowRef();
onMounted(() => {editorRef.value.create();
});
// 插入编辑器组件到模板: 在Vue组件的模板中,插入Editor和Toolbar组件,并使用v-model绑定编辑器的内容:
<Toolbar :editor="editorRef" :defaultConfig="toolbarConfig" :mode="mode" />
<Editorv-model="content":defaultConfig="editorConfig":mode="mode"@onCreated="handleEditorCreated"
/>
// 处理编辑器创建完成的事件: 在handleEditorCreated函数中,获取编辑器实例并处理任何需要的初始化操作:
const handleEditorCreated = (editor) => {console.log(editor);// 其他处理...
};
@vueuse/core 组合拳
@vueuse/core 是 Vue 的一个辅助库,它提供了一系列的功能和工具,以帮助你更有效地使用 Vue。这些工具是基于 Vue 的 Composition API 设计的,可以帮助你更好地组织和管理你的代码。
它提供了以下一些功能:
useState:用于创建响应式状态变量。
useRef:用于创建响应式引用,可以引用 DOM 元素或任何其他值。
useContext:用于读取和响应式地跟踪 Vue 3 的 Context API。
useAttrs 和 useProps:用于获取和响应式地跟踪父组件传递的 props 和属性。
useSlots:用于获取和使用插槽。
useExpose:用于在子组件中暴露方法或属性给父组件。
useToggle:用于创建可切换的状态。
useMemo:用于缓存和响应式地返回计算值。
这些功能使得使用 Vue 的 Composition API 变得更为简单和直观。
官网
npm install @vueuse/coreimport { ref, useExpose } from '@vueuse/core'export default {setup() {const count = ref(0)const increment = () => {count.value++}const expose = useExpose({count,increment})return {}}
}
iconify 图标库
@iconify/iconify和@iconify/vue都是用于在Vue.js项目中使用图标的库。它们提供了一种简单、一致的方式来在你的Vue组件中展示不同来源的图标。
@iconify/iconify
@iconify/iconify是Iconify的主要库,它提供了一个统一的API,可以用来访问来自150+图标集的超过200,000个图标。它支持各种图标格式,如SVG、PNG等,并且可以在线或离线使用。
@iconify/vue
@iconify/vue是一个为Vue.js提供的特定组件库,它基于@iconify/iconify,并提供了与Vue.js集成的API。它提供了一个名为Icon的组件,你可以在你的Vue模板中使用这个组件来展示图标。
@iconify/vue还允许你通过Icon组件的其他属性来定制图标的样式,如颜色、大小
主网站
文档和教程
搜索图标:在 Iconify 网站上,你可以通过搜索或浏览来查找和选择所需的图标。
npm install @iconify/vue @iconify/iconify<template><Icon icon="ant-design:search" />
</template><script>
import { Icon } from '@iconify/vue'export default {components: {Icon}
}
</script>
vite-plugin-url-copy 静态资源或文件从源路径复制到目标路径 打包
vite-plugin-url-copy 是一个 Vite 插件,它允许你将静态资源或文件从源路径复制到目标路径。这个插件可能在你想在打包时复制某些静态文件或资源到特定目录时非常有用。
npm install vite-plugin-url-copyimport { defineConfig } from 'vite'
import urlCopy from 'vite-plugin-url-copy'export default defineConfig({plugins: [urlCopy({targets: [{ src: 'src/assets/my-image.png', dest: 'dist/assets/my-image.png' },{ src: 'src/some-file.txt', dest: 'dist/some-directory/some-file.txt' },],}),],
})
vite-plugin-svg-icons 直接使用本地的 SVG 文件
vite-plugin-svg-icons 是一个 Vite 插件,它的主要功能是将本地的 SVG 文件转换为可在 Vue 组件中直接使用的图标。这个插件可以自动扫描指定目录下的 SVG 文件,并将其注册为 Vue 组件,从而简化了在 Vue 项目中使用 SVG 图标的过程。
symbolId 是用来生成 SVG 图标的唯一标识符的格式。在插件配置中,你可以自定义 symbolId 的生成规则。例如,如果你的 SVG 文件名是 home.svg,那么它的 symbolId 将会是 icon-home。
npm install vite-plugin-svg-icons --save-dev// vite.config.js
import { defineConfig } from 'vite'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'export default defineConfig({plugins: [createSvgIconsPlugin({// 指定需要缓存的图标文件夹iconDirs: [path.resolve(process.cwd(), 'src/icons')],// 指定symbolId格式symbolId: 'icon-[name]',}),],
})
// main.js
import { createApp } from 'vue'
import App from './App.vue'
import 'virtual:svg-icons-register' // 引入 SVG 注册脚本createApp(App).mount('#app')<template><div><svg-icon icon-class="home" /></div>
</template>
vite-plugin-style-import 按需导入组件库的样式
vite-plugin-style-import 是一个 Vite 插件,用于按需导入组件库的样式。这个插件的主要目的是解决在 Vite 项目中,当使用诸如 Element Plus、Ant Design Vue 等组件库时,样式文件通常需要手动引入的问题。vite-plugin-style-import 能够自动处理样式文件的引入,使得开发者可以更专注于业务逻辑的实现,而无需手动添加样式文件的导入。
npm install vite-plugin-style-import --save-dev
// 配置插件
import { defineConfig } from 'vite'
import { createStyleImportPlugin, AntDesignVueResolve, VantResolve, ElementPlusResolve } from 'vite-plugin-style-import'export default defineConfig({plugins: [createStyleImportPlugin({resolves: [AntDesignVueResolve(),VantResolve(),ElementPlusResolve(),],}),],
})
//使用插件
<template><el-button type="primary">Primary Button</el-button>
</template>
<script setup>
import { ElButton } from 'element-plus';
</script>
vite-plugin-purge-icons 按需加载 SVG 图标 优化性能
vite-plugin-purge-icons 是一个 Vite 插件,用于按需加载 SVG 图标。它类似于 TailwindCSS + PurgeCSS 的功能,但专门作用于图标。该插件通过分析源代码或打包后的文件,提取出你使用的图标名称,然后将这些需要的图标数据(SVG)打包到你的代码中,减少了不必要的带宽和额外的未使用的图标,从而优化了加载性能。
配合 @iconify/json使用
npm install vite-plugin-purge-icons --save-devimport { defineConfig } from 'vite'
import PurgeIcons from 'vite-plugin-purge-icons'export default defineConfig({plugins: [PurgeIcons(),],
})
@iconify/json 储和管理图标的 JSON 文件
@iconify/json 是一个用于存储和管理图标的 JSON 文件。它是 iconify 系统的一部分,iconify 是一个用于自定义和嵌入图标的开源 JavaScript 库。@iconify 允许开发者使用 JSON 文件来存储图标数据,并将其嵌入到网页或应用程序中。
配合 @iconify/iconify 使用
npm install @iconify/json @iconify/iconify --save-dev{"fa-solid:home": {"source": "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/fonts/fontawesome-solid.woff2","weight": "normal","style": "normal"}
}<div class="iconify" data-icon="fa-solid:home"></div>import 'iconify/dist/iconify.min.js';
import '@iconify/iconify/dist/iconify.css';
import '@iconify/json/dist/iconify-json.min.js';
import './icons.json';
@iconify/json、vite-plugin-purge-icons 和 vite-plugin-svg-icons 配合使用
@iconify/json、vite-plugin-purge-icons 和 vite-plugin-svg-icons 都可以用于图标管理,但它们的功能和使用方式有所不同。
@iconify/json 是一个用于存储和管理图标的 JSON 文件。它主要用于存储图标数据,并可以通过 iconify 系统在网页或应用程序中嵌入这些图标。
vite-plugin-purge-icons 是一个 Vite 插件,用于按需加载 SVG 图标。它会分析源代码或打包后的文件,提取出使用的图标名称,然后只打包你实际使用的图标,从而减少不必要的带宽和未使用的图标。
vite-plugin-svg-icons 是一个 Vite 插件,用于将本地 SVG 文件转换为可直接在 Vue 组件中使用的图标。这个插件可以自动扫描指定目录下的 SVG 文件,并将其注册为 Vue 组件。
这三个工具可以配合使用,以实现更好的图标管理。你可以使用 @iconify/json 来存储和管理你的图标数据,然后使用 vite-plugin-purge-icons 来按需加载和优化这些图标,同时可以使用 vite-plugin-svg-icons 来方便地在你的 Vue 组件中使用 SVG 图标。
具体来说,你可以将你的 SVG 图标存储在一个目录中,并使用 vite-plugin-svg-icons 插件将其注册为 Vue 组件。然后,你可以使用 @iconify/json 来管理这些图标的数据,并使用 vite-plugin-purge-icons 来优化你的构建,只包含你实际使用的图标。
npm install @iconify/json @iconify/iconify vite-plugin-svg-icons --save-dev
// 创建 @iconify/json 文件:
{"fa-solid:home": {"source": "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/fonts/fontawesome-solid.woff2","weight": "normal","style": "normal"}
}
// 配置 Vite 插件
import { defineConfig } from 'vite'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'export default defineConfig({plugins: [createSvgIconsPlugin({iconDirs: ['./src/icons'], // 指定 SVG 图标存放的目录路径symbolId: 'icon-[dir]-[name]', // 图标 symbol 的 id 模式}),],
})
// 使用图标
<div class="iconify" data-icon="fa-solid:home"></div>
// 注册图标
import { createApp } from 'vue'
import App from './App.vue'
import '@iconify/iconify'
import '@iconify/json'createApp(App).mount('#app')
vite-plugin-progress 显示构建进度条
progress 通常指的是一个用于显示构建进度的插件,如 vite-plugin-progress。这个插件在 Vite 构建过程中显示进度条,帮助开发者更直观地了解构建进度,从而提升开发体验。
npm install vite-plugin-progress --save-devimport { defineConfig } from 'vite'
import progressPlugin from 'vite-plugin-progress'export default defineConfig({plugins: [progressPlugin()]
})
vite-plugin-mock 拦截请求 mockjs生成模拟数据返回
vite-plugin-mock 是一个专为 Vite 设计的插件,用于在本地开发环境中创建 API 的 mock 数据。它基于 mockjs 或者自定义的 mock 数据逻辑,让开发者在后端 API 未准备好之前就能模拟出类似的数据响应,从而保证前端开发的顺利进行。
npm install vite-plugin-mock --save-devimport { defineConfig } from 'vite'
import { viteMockServe } from 'vite-plugin-mock'export default defineConfig({plugins: [viteMockServe({mockPath: 'mock', // mock 文件夹的路径localEnabled: true, // 开启本地 mock})]
})export default {url: '/api/getUserList',method: 'get',response: () => {return {code: 0,message: 'success',data: [{ id: 1, name: 'John Doe', age: 25 },{ id: 2, name: 'Jane Doe', age: 24 },],};},
};
mockjs 生成模拟数据
Mock.js 可以快速生成模拟数据,方便前端进行开发和测试。
Mock.js 官方网站
Mock.js 教程和示例
字符串(@string)
@cname 随机的中文姓名
@string(length):生成指定长度的随机字符串。
@cstring(length):生成指定长度的随机中文字符串。
@word(min, max):生成指定范围内的随机汉字。
@sentence(min, max):生成指定范围内的随机句子。
@csentence(min, max):生成指定范围内的随机中文句子。
数字(@integer 和 @float)
@integer(min, max):生成指定范围内的随机整数。
@float(min, max, dmin, dmax):生成指定范围内的随机浮点数,其中 dmin 和 dmax 是小数部分的位数。
金额(@money)
@money(min, max, dmin, dmax):生成指定范围内的随机金额,可以是整数或浮点数。
图片(@image)
@image(width, height, background, foreground, format, text):生成指定大小、背景色、前景色、格式和文本的随机图片。
日期(@date 和 @datetime)
@date(format):生成随机日期。
@datetime(format):生成随机日期和时间。
电话(@phone)
@phone:生成随机电话号码。
邮箱(@email)
@email:生成随机邮箱地址。
npm install mockjs --save-dev// mock.js
import Mock from 'mockjs';Mock.mock('/api/users', 'get', {'list|1-10': [{'id|1-100': 1,'name': '@cname','age|1-100': 20,'email': '@email'}]
});// 在 main.js 或其他合适的入口文件中
import Vue from 'vue';
import App from './App.vue';
import axios from 'axios';
import './mock.js'; // 引入 mock.jsVue.prototype.$axios = axios; // 将 axios 绑定到 Vue 的原型上,方便在组件中调用new Vue({render: h => h(App),
}).$mount('#app');<template><div><button @click="fetchUsers">Fetch Users</button></div>
</template><script>
export default {methods: {fetchUsers() {this.$axios.get('/api/users').then(response => {console.log(response.data);}).catch(error => {console.error(error);});}}
}
</script>
// 用法示例
Mock.mock('/api/users', 'get', {'list|1-10': [{'id|1-100': 1,'name': '@cname','age|1-100': 20,'email': '@email'}]
});
Mock.mock({// 用户名username: '@cname',// 账号account: '@first',// 邮箱email: '@EMAIL',// 创建时间createTime: '@datetime',// 用户idid: toAnyString()})
console.log(Mock.Random.integer(1, 100)); // 生成 1 到 100 之间的随机整数
console.log(Mock.Random.float(1, 100, 2, 4)); // 生成 1 到 100 之间的浮点数,小数部分有 2 到 4 位
console.log(Mock.Random.date()); // 生成随机日期
console.log(Mock.Random.time()); // 生成随机时间
console.log(Mock.Random.color()); // 生成随机颜色
console.log(Mock.Random.email()); // 生成随机邮箱地址Mock.Random.extend({phone: function() {return Mock.Random.integer(13000000000, 18000000000) + '';}
});console.log(Mock.Random.phone()); // 生成随机手机号码Mock.setup({timeout: '300-500'
});// 设置 300 到 500 毫秒的随机响应时间const schema = {'name': '@cname','age|1-100': 1,'email': '@email'
};const data = {name: '张三',age: 25,email: 'zhangsan@example.com'
};if (Mock.validate(data, schema)) {console.log('数据验证通过');
} else {console.log('数据验证失败');
}
unocss 全局配置样式等信息
unocss 是一个高效的原子 CSS 引擎,它提供了一种现代化的方式来管理和应用样式,通过其轻量化、模块化和可扩展的特性,显著提升了项目的开发效率和性能表现。
@unocss/transformer-variant-group 是 UnoCSS 框架的一个扩展,它们之间存在依赖关系
unocss官网
tailwindcss文档
windicss文档
图标库1
图标库2unocss预设支持
vue2
npm install @unocss/webpack unocss --save-devnpm install unocss @unocss/transformer-variant-group --save-dev// vue 2 vue.config.js
const UnoCSS = require('@unocss/webpack').default;module.exports = {configureWebpack: {plugins: [new UnoCSS()]},// ...其他配置
};import UnoCSS from 'unocss/vite'plugins: [UnoCSS()]// 根目录新建 uno.config.js 自定义配置import { defineConfig, presetAttributify, presetUno } from 'unocss';export default defineConfig({presets: [presetAttributify(), presetUno()], // 预设配置。你可以添加一些内置的预设shortcuts: [// 类名快捷方式'btn': 'px-4 py-2 rounded-md text-white bg-blue-500 hover:bg-blue-700 focus:outline-none','dark': 'bg-black text-white',],rules:[// 自定义规则// bg-50 控制元素的背景颜色的透明度[/.*(--)?bg-(\d+)/, (_, { $2 }) => ({'background-color': `rgba(255, 215, 0, ${+$2 / 10})`})],[ // 匹配overflow-ellipsis 赋值 text-overflow: ellipsis;/^overflow-ellipsis$/,([], { rawSelector }) => {const selector = e(rawSelector)return `
${selector} {text-overflow: ellipsis;
}
`}],],transformers: [transformerVariantGroup()],//转换器ignore: [//忽略模式'node_modules','public',// 其他路径],
});
Terser
Terser 是一个流行的 JavaScript 解析器、压缩器、美化器和转译器工具。它主要用于压缩 JavaScript 代码,以减小文件大小,从而提高网页加载速度。Terser 支持最新的 JavaScript 语法,并且可以处理 ES6+ 代码。
前端开发:在前端项目中,为了减少 HTTP 请求的大小,通常会使用 Terser 来压缩 JavaScript 文件。
库和框架开发:开源库和框架的作者通常会使用 Terser 来压缩和发布他们的代码,以优化性能。
构建工具集成:许多现代前端构建工具(如 Webpack、Rollup 和 Gulp)都支持与 Terser 集成,以自动压缩 JavaScript 文件。
代码混淆:虽然 Terser 主要用于压缩,但它也可以在一定程度上混淆代码,增加代码阅读的难度。
npm install terser-webpack-plugin -Dconst TerserPlugin = require('terser-webpack-plugin');module.exports = {mode: 'production',optimization: {minimize: true,minimizer: [new TerserPlugin()],},
};
Rollup 优化模块打包工具
Rollup 是一个 JavaScript 模块打包工具,它将多个模块打包成一个或多个 bundle(包)。Rollup 的主要特点是使用 ES6 模块(import 和 export)作为标准,并且能够生成非常小巧的 bundle。这使得 Rollup 成为构建现代 JavaScript 库和应用的理想选择。
场景
库和框架开发:Rollup 非常适合用于构建和打包 JavaScript 库和框架。它可以将库的各个模块打包成一个文件,从而简化发布和使用的流程。
前端应用开发:Rollup 也可以用于构建前端应用。通过配置适当的插件,你可以使用 Rollup 来处理 CSS、图片等资源,并最终生成用于生产环境的 bundle。
代码拆分:Rollup 支持代码拆分(Code Splitting),可以将应用拆分成多个 bundle,从而实现按需加载,提高应用的加载速度和性能。
树摇(Tree Shaking):Rollup 支持树摇功能,可以移除未使用的代码,进一步减小 bundle 的大小。
"rollup": "^4.18.1",
"rollup-plugin-visualizer": "^5.12.0",import { visualizer } from 'rollup-plugin-visualizer'build: {rollupOptions: {plugins: env.VITE_USE_BUNDLE_ANALYZER === 'true' ? [visualizer()] : undefined}}
rimraf 清理和删除文件目录
rimraf 在 Vue 项目中同样非常有用,主要用于清理和删除不需要的文件或目录。以下是一些常见的使用场景和具体的使用方法。
场景
清理构建目录:在每次构建之前,通常需要清理之前的构建输出目录(如 dist 或 build 目录)。这样可以确保构建输出中没有旧的或残留的文件。
删除临时文件:在开发过程中,可能会生成一些临时文件或目录(如编译过程中的缓存文件)。使用 rimraf 可以方便地删除这些临时文件。
自定义构建脚本:在编写自定义的构建脚本或自动化脚本时,rimraf 可以用于删除不需要的文件或目录。
npm install rimraf -D"build": "rimraf dist && vue-cli-service build"
prettier 代码格式化工具
Prettier 是一个流行的代码格式化工具,它支持多种编程语言和文件格式,包括 JavaScript、TypeScript、CSS、HTML、Vue 等。Prettier 的目标是自动格式化代码,以确保代码风格的一致性,从而提高代码的可读性和维护性。
场景
代码风格一致性:在团队开发中,使用 Prettier 可以确保所有开发者的代码风格一致,避免因个人习惯导致的代码风格差异。
自动格式化:在编写代码时,Prettier 可以自动格式化代码,减少手动格式化的工作量。
代码审查:在代码审查过程中,Prettier 可以帮助快速识别和修复代码格式问题,从而提高代码质量。
持续集成:在持续集成/持续部署(CI/CD)流程中,可以使用 Prettier 来检查代码格式,确保所有提交的代码都符合预定的代码风格.
npm install prettier -D// 创建一个 .prettierrc 文件来配置 Prettier 的规则
{"semi": false,"singleQuote": true,"tabWidth": 2,"useTabs": false,"trailingComma": "none","bracketSpacing": true,"arrowParens": "avoid"
}
semi:是否在语句末尾添加分号。
singleQuote:是否使用单引号。
tabWidth:缩进宽度。
useTabs:是否使用制表符进行缩进。
trailingComma:是否在多行结构的末尾添加逗号。
bracketSpacing:是否在对象字面量的括号之间添加空格。
arrowParens:箭头函数的参数是否总是加括号。
// 通过命令行运行 Prettier 来格式化文件 格式化 src 目录下的所有 .vue 文件。
npx prettier --write src/**/*.vue
postcss 构建过程 转换和优化 CSS 代码
PostCSS 是一个用 JavaScript 工具和插件转换 CSS 代码的工具。它允许你使用 JavaScript 插件来预处理 CSS,添加浏览器前缀,转换现代 CSS 语法等。主要用于在构建过程中转换和优化 CSS 代码
使用场景
自动添加浏览器前缀:使用 autoprefixer 插件自动为 CSS 规则添加浏览器前缀。
CSS 语法转换:使用 postcss-preset-env 插件将现代 CSS 语法转换为广泛支持的 CSS 语法。
CSS 代码优化:使用 cssnano 插件优化和压缩 CSS 代码。
自定义插件开发:开发自定义的 PostCSS 插件,实现特定的 CSS 转换和优化逻辑。
npm install postcss autoprefixer postcss-preset-env cssnano -D创建一个 postcss.config.js 配置文件:
module.exports = {plugins: [require('postcss-less'), // 如果你的项目使用Less,你需要这个插件require('autoprefixer'),require('cssnano')require('postcss-html') // 如果你需要在HTML中处理CSS,你需要这个插件]
};module.exports = {plugins: [require('postcss-html'),require('autoprefixer'),require('postcss-preset-env')({browsers: 'last 2 versions',}),require('cssnano')({preset: 'default',}),],
};package.json
"browserslist": ["last 2 version","> 1%","ie >= 8"
]
module.exports = {plugins: [require("postcss-cssnext"),require("postcss-import"),require('autoprefixer'),],
};
cssnano 优化和压缩CSS 提高性能
CSSNano是一款专门用于优化和压缩CSS文件的PostCSS插件。它可以帮助开发者减少CSS文件的大小,提高加载速度,节省带宽,同时还可以优化CSS代码,例如合并相同的规则,减少代码重复。
CSSNano通常与其他PostCSS插件结合使用,如Autoprefixer,以确保CSS在被压缩之前先经过自动前缀处理,从而实现最佳的兼容性和性能。
npm install cssnano --save-dev//postcss.config.js文件
module.exports = {plugins: [require('cssnano')({preset: 'advanced'})]
}
Autoprefixer
Autoprefixer是一个基于规则的CSS处理器,利用PostCSS解析库和Browserslist数据源,自动为CSS添加浏览器前缀。它简化前端开发流程,提高代码整洁度,适用于Webpack、Gulp等构建工具
npm install autoprefixer --save-dev
//postcss.config.js文件
module.exports = {module: {rules: [{test: /\.css$/,use: ['style-loader','css-loader','postcss-loader']}]}
};module.exports = {plugins: [require('autoprefixer')({// 浏览器支持范围browsers: ['last 2 versions', 'ie >= 8']})require('cssnano')({preset: 'default'})]
};
chalk 终端中生成彩色文本
chalk 是一个流行的 JavaScript 库,用于在命令行或终端中生成彩色文本。虽然 chalk 本身与 Vue.js 无关,但它可以与 Vue.js 项目集成,以在命令行输出中提供彩色文本。
npm install chalkimport chalk from 'chalk';
red, green, blue, yellow, magenta, cyan, white
console.log(chalk.green('这是一条绿色的消息!'));
onsole.log(chalk.blue('这是一条蓝色的消息!'));
chalk.hexColor('#ff0000')('这是一个自定义的红色文本')// 自定义颜色
console.log(chalk.bgRed('这是一个红色背景的文本'));// 背景
// chalk 支持在文本上添加样式,如 bold, italic, underline 等。
console.log(chalk.bold('这是一个粗体文本'));
console.log(chalk.italic('这是一个斜体文本'));
console.log(chalk.underline('这是一个下划线文本'));
// 组合样式和颜色:你可以组合使用样式和颜色。
console.log(chalk.green.bold('这是一个绿色且粗体的文本'));
console.log(chalk.blue.italic.underline('这是一个蓝色斜体且下划线的文本'));
//创建颜色别名:你可以创建自己的颜色别名,并在整个程序中重复使用
const myColor = chalk.hexColor('#ff0000');
console.log(myColor('这是一个自定义的红色文本'));
consola 日志记录器
consola 是一个用于 Node.js 和浏览器的优雅控制台记录器。它可以帮助开发者更方便、更高效地记录和输出日志信息。consola 提供了丰富的日志级别、自定义报告者(Reporter)和标签(Tag)等功能,使得日志管理更加灵活和高效。
npm install consolaimport consola from 'consola';consola.info('这是一条 info 级别的日志信息');
consola.warn('这是一条 warn 级别的日志信息');
consola.error('这是一条 error 级别的日志信息');
你可以通过设置环境变量 CONSOLA_LEVEL 来控制 consola 的日志输出级别。例如,如果你想关闭所有日志输出,可以将 CONSOLA_LEVEL 设置为 -1。
export CONSOLA_LEVEL=-1
esno 加载和执行 TypeScript 和 ESM 模块
esno 是一个基于 esbuild 的 Node.js 运行时,它增强了 Node.js 的能力,可以直接加载和执行 TypeScript 和 ESM 模块。esno 旨在提供一个快速、轻量级的执行环境,特别适用于在开发过程中直接运行 TypeScript 脚本。
npm install esno
"scripts": {"start": "esno ./src/main.ts"
}
husky Git Hooks 工具 Git 事件发生时自动运行脚本
husky 是一个 Git Hooks 工具,它允许开发者在 Git 事件发生时自动运行脚本。Git Hooks 是一种机制,它允许在 Git 执行操作时自动运行特定脚本,以执行自定义操作。husky 支持多种 Git Hooks,包括 pre-commit、pre-push 等,并可以配置多个钩子,以便在多个 Git 事件发生时执行自定义脚本。
npm install husky
配置 pre-commit 钩子:在 .husky 文件夹下的 pre-commit 文件中,你可以添加在提交代码之前需要运行的命令。例如,你可能希望运行 ESLint 或 Prettier 进行代码检查。
npx husky add .husky/pre-commit "npx eslint --fix ."
除了 pre-commit,husky 还支持其他 Git Hooks,如 pre-push、post-commit 等。你可以根据需要添加自定义的钩子。
lint-staged Git 暂存区的文件上运行指定的 lint 工
lint-staged 是一个工具,可以在 Git 暂存区的文件上运行指定的 lint 工具,以便于仅在需要时执行 lint 检查。它通常与 Husky 配合使用,以在提交代码前运行 lint-staged。使用 lint-staged 可以大大提高 lint 检查的效率,因为只需要针对本次提交的文件执行 lint 检查,而不是所有的文件。
npm install lint-staged --save-dev
package.json
"lint-staged": {"*.{js,jsx,ts,tsx,vue}": ["eslint --fix","prettier --write"]
}
修改 pre-commit 钩子:在 .husky 文件夹下的 pre-commit 文件中,将 npm test 修改为 npx lint-staged。
npx husky add .husky/pre-commit "npx lint-staged"
plop
plop 是一个用于生成代码文件的可配置的脚手架工具。它可以帮助开发人员自动创建代码文件、模板和代码片段,从而提高开发效率。plop 的工作原理是通过定义称为“生成器”(generators)的脚本来生成代码文件。每个生成器定义了一组操作和模板,用于生成特定类型的文件或代码片段。当你运行 plop 命令时,它会根据你的选择执行相应的生成器,并根据模板和操作的定义创建文件
npm install plop --save-dev
待学习
@commitlint/cli 校验 Git 提交信息是否符合特定的格式规范
@commitlint/cli 是一个用于校验 Git 提交信息的命令行工具,它通常与 Husky 和 lint-staged 配合使用,以在提交代码前对提交信息进行校验,从而确保提交信息的格式和内容符合项目规范和约定。@commitlint/cli 遵循Conventional Commits规范,并允许开发者自定义配置校验规则。
npm install --save-dev @commitlint/cli
配置校验规则:在项目的根目录下创建一个.commitlintrc.js文件,用于配置校验规则。可以使用默认配置或自定义配置。
module.exports = {extends: ['@commitlint/config-recommended'],rules: {'header-max-length': [2, 'always', 72],'body-max-line-length': [1, 'always', 80],'footer-max-line-length': [1, 'always', 80],'type-enum': [2, 'always', ['feat', 'fix', 'docs', 'style', 'refactor', 'perf', 'test', 'chore', 'revert']],'type-case': [2, 'always', 'lower-case'],'scope-case': [2, 'always', 'lower-case'],'subject-case': [2, 'always', 'sentence-case'],'subject-full-stop': [2, 'always', '.'],'subject-empty': [2, 'never'],'subject-max-length': [2, 'always', 72],'type-empty': [2, 'never']}
};
在pre-commit钩子中集成@commitlint/cli:使用Husky的pre-commit钩子,在提交代码前运行@commitlint/cli进行校验。
npx husky add .husky/pre-commit "npx --no-install commitlint --edit $1"
运行校验:当执行git commit命令时,会自动运行@commitlint/cli进行提交信息校验。如果提交信息不符合校验规则,@commitlint/cli将显示错误信息,阻止提交。
@commitlint/config-conventional 用于定义和提供 commit 信息的格式规范
@commitlint/config-conventional 是一个用于校验 Git 提交信息格式的配置文件,它遵循了 Angular 风格的常规提交信息格式。这个配置提供了一个标准,让团队成员遵循一致的提交信息格式,从而提高代码质量和可维护性。
在Vue环境中使用@commitlint/config-conventional在Vue项目中,使用@commitlint/config-conventional的主要目的是确保提交信息的格式和内容符合项目规范,提高协作开发的效率和代码质量。以下是使用@commitlint/config-conventional的基本步骤:npm install @commitlint/config-conventional @commitlint/cli --save-dev在项目根目录下创建一个.commitlintrc.js文件,配置@commitlint/config-conventional。
module.exports = {extends: ['@commitlint/config-conventional']
};
配置husky:使用Husky的pre-commit钩子,在提交代码前运行@commitlint/cli进行校验。
npx husky add .husky/pre-commit "npx --no-install commitlint --edit $1"
@commitlint/config-conventional 和 @commitlint/cl
@commitlint/config-conventional 和 @commitlint/cli 的作用并不完全相同,尽管它们都与 commitlint 相关,但服务于不同的目的。
@commitlint/config-conventional:
这是一个 commitlint 的配置文件,用于定义和提供 commit 信息的格式规范。
它遵循了常规的 commit 信息格式,如 Angular 的提交规范,该规范通常包含三个部分:类型、描述和可选的范围、问题和引用。
这个配置允许你定义提交信息中应该包含哪些内容,以及这些内容应该如何格式化。
@commitlint/cli:
这是一个命令行工具,用于校验 Git 提交信息是否符合特定的格式规范。
当你在本地运行 git commit 命令时,它可以检查你的提交信息是否符合你在 .commitlintrc 文件中定义的规则。
如果提交信息不符合规则,@commitlint/cli 会显示错误,阻止提交。
简单地说,@commitlint/config-conventional 提供了规范,而 @commitlint/cli 用于确保提交信息符合这些规范。它们通常一起使用,以确保团队遵循一致的提交信息格式
@iconify/json 图标库文件格式
@iconify/json 是一个提供图标数据的 JSON 格式文件。它通常用于与 iconify 结合使用,iconify 是一个用于在网页上加载和使用图标的库。@iconify/json 提供了图标数据的标准格式,使得用户可以轻松地在项目中导入和使用图标。
npm install @iconify/json
import { icon } from '@iconify/json/path/to/icon.json';
@unocss/transformer-variant-group
@unocss/transformer-variant-group 是 UnoCSS 的一个变换器插件。它允许你通过定义一系列的变换规则来将一组相关的类名转换为另一个类名,从而达到合并或简化类名的目的。这对于在组件或组件的不同状态下重用相同的样式非常有用。
npm install unocss --save-dev
在项目的根目录下创建一个 uno.config.js 或 uno.config.ts 文件,并引入必要的模块。
import {defineConfig,transformerVariantGroup,presetUno,// ... 其他你需要的预设和插件
} from 'unocss';export default defineConfig({presets: [presetUno()],transformers: [transformerVariantGroup()],// ... 其他配置
});
在 uno.config.js 或 uno.config.ts 文件中,你可以定义自己的变体组规则。例如:
transformers: [transformerVariantGroup({'active': ['is-active', 'is-selected'],'hover': ['is-hover', 'is-over']})
]
上面的配置将 'active' 转换为 'is-active' 和 'is-selected',将 'hover' 转换为 'is-hover' 和 'is-over'。
在你的 Vue 组件中,你可以使用这些变体组来简化你的类名,例如:
<button class="btn active hover">Click me</button>
<button class="btn is-active is-selected is-hover is-over">Click me</button>
相关文章:
【常用组件整理】
xgplayer 字节开发的前端视频播放器 xgplayer是一个由字节跳动开发的强大的前端视频播放器,具有稳定性高、文档清晰、支持弹幕和移动端优化 等特点。相较于VideoJs,xgplayer的文档更简洁,自定义插件更为便捷。xgplayer还提供了丰富的插件来扩…...
用指针函数寻找数组中的最大值与次大值
#include <stdio.h>// 函数用于找出数组中的最大值和次大值 void LargestTow(int a[], int n, int *pfirst, int *psecond) {*pfirst a[0];*psecond a[1];if (*psecond > *pfirst) {// 如果初始的次大值大于最大值,交换它们int temp *pfirst;*pfirst *…...
原生微信小程序在顶部胶囊左侧水平设置自定义导航兼容各种手机模型
无论是在什么手机机型下,自定义的导航都和右侧的胶囊水平一条线上。如图下 以上图iphone12,13PRo 以上图是没有带黑色扇帘的机型 以下是调试器看的wxml的代码展示 注意:红色阔里的是自定义导航(或者其他的logo啊,返回之…...
Android Gradle自定义任务在打包任务执行完成后执行cmd命令
背景 在每次打包之后需要做某事,例如每次打包后我都会安装某个目录下的一个apk。这个apk是通过一堆shell命令过滤得到一个apk的地址,然后把执行的几个shell命令何必成一个alias指令,在打包后只需要执行alias指令实现功能。当然也可以直接写在…...
http自动发送请求工具(自动化测试http请求)
点击下载《http自动发送请求工具(自动化测试http请求)》 前言 在现代软件开发过程中,HTTP 请求的自动化测试是确保应用程序稳定性和可靠性的关键环节。为了满足这一需求,我开发了一款功能强大且易于使用的自动化 HTTP 请求发送工具。该工具基于 C# 开发…...
解决Docker环境变量的配置的通用方法
我们部署的很多服务都是以Docker容器的形式存在的。 在运行Docker容器前,除了设置网络、数据卷之外,还需要设置各种各样的环境变量。 有时候,由于容器版本的问题,一些文档没有及时更新,可能同时存在多个新旧版本的环…...
SpringBoot3整合Hutool-captcha实现图形验证码
文章目录 验证码需求分析:项目创建import方式的使用说明exclude方式定义接口:接口定义定义 CaptchaController前端代码在整合技术框架的时候,想找一个图形验证码相关的框架,看到很多验证码不在更新了或者是在中央仓库下载不下来,还需要多引入依赖。后面看到了Hutool **图形…...
Spring Boot核心概念:日志管理
日志记录是软件开发的重要组成部分,它帮助开发人员了解应用程序运行时的状态,以及在故障排查和性能监控时提供关键信息。Spring Boot通过提供默认的日志配置,简化了日志管理。 Spring Boot默认日志框架 Spring Boot默认使用Logback作为日志…...
selenium grid 远程webdriver添加上网代理
################## selenium grid config start ####################### # UI自动化测试策略 Grid/Local UIAutomation_TestStrategy Grid selenium_grid_url http://172.16.99.131:4444/wd/hub # Windows XP / linux grid_platformName linux # windows capabilities win…...
Flutter踩坑记录(一)debug运行生成的项目,不能手动点击运行
问题 IOS14设备,切后台划掉,二次启动崩溃。 原因 IOS14以上 flutter 不支持debugger模式下的二次启动 。 要二次启动需要以release方式编译工程安装至手机。 操作步骤 清理项目:在命令行中运行flutter clean来清理之前的构建文件。重新构…...
Spring Boot 项目 myblog 整理
myblog 项目是一个典型的 Spring Boot 项目,主要包括用户注册、登录、文章管理(创建、查询、更新、删除)等功能。 1. 项目结构与依赖设置 项目初始化与依赖 使用 Spring Initializr 创建项目。引入必要的依赖包: Spring Boot W…...
【前端知识】nodejs项目配置package.json深入解读
package.json详细解读 文件解读一、文件结构二、字段详解三、使用场景四、注意事项 组件版本匹配规则 文件解读 package.json 文件是 Node.js 项目中的一个核心配置文件,它位于项目的根目录下,并包含项目的基本信息、依赖关系、脚本、版本等内容。以下是…...
51c嵌入式~IO合集2
我自己的原文哦~ https://blog.51cto.com/whaosoft/11697814 一、STM32串口通信基本原理 通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。并行与串行通信的区别如下表所示。 串行通信的分类 1、按照数据传…...
在应用启动时,使用 UniApp 提供的 API 检查和请求权限。
在使用 UniApp 开发 App 时,如果你需要在应用启动时提示用户获取本地媒体权限,可以按照以下步骤操作: 1. 明确需要的权限 要访问本地媒体(如相机、麦克风或文件存储),需要申请以下权限: Andr…...
前端知识点---伪数组是什么 , 伪数组如何转换为真数组(Javascript)
伪数组是什么 , 伪数组如何转换为真数组(Javascript) 在 JavaScript 中,伪数组对象是具有类似数组特性的对象,但并不是数组(即不继承 Array.prototype)。这些对象通常有一个 length 属性以及以数字索引为键的属性,但不…...
嵌入式 UI 开发的开源项目推荐
嵌入式开发 UI 难吗?你的痛点我懂!作为嵌入式开发者,你是否也有以下困扰?设备资源太少,功能和美观只能二选一?调试效率低,每次调整都要反复烧录和测试?开发周期太长,让你…...
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
在 C编程的世界里,智能指针无疑是管理内存资源的得力助手。它们为我们自动处理内存的分配与释放,极大地减少了因手动管理内存而可能引发的诸如内存泄漏、悬空指针等棘手问题。然而,就像任何工具都有其两面性一样,智能指针在带来便…...
28.<Spring博客系统⑤(部署的整个过程(CentOS))>
引入依赖 Spring-boot-maven-plugin 用maven进行打包的时候必须用到这个插件。看看自己pom.xml中有没有这个插件 并且看看配置正确不正常。 注:我们这个项目打的jar包在30MB左右。 <plugin><groupId>org.springframework.boot</groupId><artif…...
mongodb多表查询,五个表查询
需求是这样的,而数据是从mysql导入进来的,由于mysql不支持数组类型的数据,所以有很多关联表。药剂里找药物,需要药剂与药物的关联表,然后再找药物表。从药物表里再找药物与成分关联表,最后再找成分表。 这里…...
服务器端渲染 (SSR) 与客户端渲染 (CSR)
嘿程序员!我们都知道,新时代的 Javascript 已经彻底改变了现代网站的结构和用户体验。如今,网站的构建更像是一个应用程序,伪装成一个能够发送电子邮件、通知、聊天、购物、支付等的网站。今天的网站是如此先进、互动,…...
【已解决】“EndNote could not connect to the online sync service”问题的解决
本人不止一次在使用EndNote软件时遇到过“EndNote could not connect to the online sync service”这个问题。 过去遇到这个问题都是用这个方法来解决: 这个方法虽然能解决,但工程量太大,每次做完得歇半天身体才能缓过来。 后来再遇到该问…...
HTML5拖拽API学习 托拽排序和可托拽课程表
文章目录 前言拖拽API核心概念拖拽式使用流程例子注意事项综合例子🌰 可拖拽课程表拖拽排序 前言 前端拖拽功能让网页元素可以通过鼠标或触摸操作移动。HTML5 提供了标准的拖拽API,简化了拖放操作的实现。以下是拖拽API的基本使用指南: 拖拽…...
sed使用扩展正则表达式时, -i 要写在 -r 或 -E 的后面
sed使用扩展正则表达式时, -i 要写在 -r 或 -E 的后面 前言 -r 等效 -E , 启用扩展正则表达式 -E是新叫法,更统一,能增强可移植性 , 但老系统,比如 CentOS-7 的 sed 只能用 -r ### Ubuntu24.04-E, -r, --regexp-extendeduse extended regular expressions in the script(fo…...
CSS中Flex布局应用实践总结
① 两端对齐 比如 要求ul下的li每行四个,中间间隔但是需要两段对齐,如下图所示: 这是除了基本的flex布局外,还需要用到:nth-of-type伪类来控制每行第一个与第四个的padding。 .hl_list{width: 100%;display: flex;align-items…...
【前端】CSS修改div滚动条样式
示例 分别是滚动条默认样式和修改后的样式 代码 <div class"video-list"><div class"list-item" onclick"videoinfo(100)"><img src"/index/images/coverimg/方和谦.png"><div class"txt">国医大…...
鸿蒙多线程开发——线程间数据通信对象02
1、前 言 本文的讨论是接续鸿蒙多线程开发——线程间数据通信对象01的讨论。在上一篇文章中,我们讨论了常规的JS对象(普通JSON对象、Object、Map、Array等)、ArrayBuffer。其中讨论了ArrayBuffer的复制传输和转移传输方式。 下面,我们将讨论SharedArra…...
Kotlin的data class
在 Kotlin 中,data class 是一种专门用来存储数据的类。与普通类相比,data class 提供了简化数据存储的语法,并且自动生成了一些常用的方法,例如 toString()、equals()、hashCode() 和 copy()。 1. 定义 data class data class …...
Proxy 在 JavaScript的用法
Proxy 是 JavaScript 提供的一个构造函数,用于创建一个“代理对象”。这个代理对象可以拦截目标对象的基本操作,例如读取属性、赋值、删除、调用函数等。通过它,我们可以修改或扩展对象的默认行为。 Proxy 的基本语法 const proxy = new Proxy(target, handler);target:被…...
vue3的attr透传属性详解和使用法方式。以及在css样式的伪元素中实现
在 Vue 3 和 TypeScript 中,属性透传(attr pass-through)是指将组件的属性传递到其根元素或某个子元素中。这个概念在开发可复用的组件时非常有用,尤其是当你希望将父组件的属性动态地传递给子组件的某个 DOM 元素时。 在 Vue 3 …...
《人工智能深度学习的基本路线图》
《人工智能深度学习的基本路线图》 基础准备阶段 数学基础: 线性代数:深度学习中大量涉及矩阵运算、向量空间等概念,线性代数是理解和处理这些的基础。例如,神经网络中的权重矩阵、输入向量的运算等都依赖于线性代数知识。学习内容…...
Matlab 答题卡方案
在现代教育事业的飞速发展中,考试已经成为现代教育事业中最公平的方式方法,而且也是衡量教与学的唯一方法。通过考试成绩的好与坏,老师和家长可以分析出学生掌握的知识多少和学习情况。从而老师可以了解到自己教学中的不足来改进教学的方式方…...
[Unity]TileMap开发,TileMap地图缝隙问题
环境: windows11 unity 2021.3.14f1c1 tilemap使用的图是美术已经拼接到一起的整图,块与块之间没有留缝隙 问题: TileMap地图直接在Unity中使用时,格子边缘会出现缝隙,移动或缩放地图时较明显。 解决方案&#x…...
pnpm : 无法加载文件 D:\Tool\environment\NodeAndNvm\node\pnpm.ps1,因为在此系统上禁止运行脚本。
问题 在终端(cmd)输入 pnpm -v,报错如下 pnpm : 无法加载文件 D:\Tool\environment\NodeAndNvm\node\pnpm.ps1,因为在此系统上禁止运行脚本。解决 1. 在终端输入get-ExecutionPolicy(查看执行策略/权限) 输出如下: # (受限的) Restricte…...
redis的map底层数据结构 分别什么时候使用哈希表(Hash Table)和压缩列表(ZipList)
在Redis中,Hash数据类型的底层数据结构可以是压缩列表(ZipList)或者哈希表(HashTable)。这两种结构的使用取决于特定的条件: 1. **使用ZipList的条件**: - 当Hash中的数据项(即f…...
通达OA前台submenu.php存在SQL注入漏洞(CVE-2024-10600)
通达OA前台submenu.php存在SQL注入漏洞(CVE-2024-10600) pda/appcenter/submenu.php 未包含inc/auth.inc.php且 $appid 参数未用’包裹导致前台SQL注入 影响范围 v2017-v11.6 fofa app"TDXK-通达OA" && icon_hash"-759108386"poc http://url…...
Flutter:photo_view图片预览功能
导入SDK photo_view: ^0.15.0单张图片预览,支持放大缩小 import package:flutter/material.dart; import package:photo_view/photo_view.dart;... ...class _MyHomePageState extends State<MyHomePage>{overrideWidget build(BuildContext context) {return…...
C++结构型设计模式之使用抽象工厂来创建和配置桥接模式的例子
下面是一个使用抽象工厂模式来创建和配置桥接模式的示例,场景是创建不同操作系统的窗口(Window)及其对应的实现(WindowImpl)。我们将通过抽象工厂来创建不同操作系统下的窗口和实现。 代码示例 #include <iostrea…...
智能合约运行原理
点个关注吧!! 用一句话来总结,智能合约就像是一个自动售货机:你投入硬币(触发条件),选择商品(执行合约),然后机器就会自动给你商品(执行结果&…...
Unity3D基于ECS的游戏逻辑线程详解
前言 Unity3D是一款非常流行的游戏开发引擎,其采用的是组件实体系统(ECS)架构,这种架构可以让游戏开发者更加高效地管理游戏逻辑线程。本文将详细介绍Unity3D基于ECS的游戏逻辑线程,并给出技术详解以及代码实现。 对…...
GIT 操作
全局设置 git config --global user.name "用户名" git config --global user.email "用户邮箱" 创建仓库 mkdir 项目目录 cd 项目目录 git init touch README.md git add README.md git commit -m "first commit" git remote add origin GIT…...
佛山三水戴尔R740服务器黄灯故障处理
1:佛山三水某某大型商场用户反馈一台DELL PowerEdge R740服务器近期出现了黄灯警告故障,需要冠峰工程师协助检查故障灯原因。 2:工程师协助该用户通过笔记本网线直连到服务器尾部的IDRAC管理端口,默认ip 192.168.0.120 密码一般在…...
系统性能优化方法论详解:从理解系统到验证迭代
在当今的企业级和云计算环境中,系统性能优化已成为提升竞争力的关键因素。本文将对系统优化的步骤进行深入解析,帮助读者系统化地进行性能优化,从而显著提升系统的整体表现。 流程概述: 系统性能优化的流程可以分为以下几个关键步骤&#x…...
241120学习日志——[CSDIY] [InternStudio] 大模型训练营 [09]
CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!&…...
MySQL创建和管理触发器
1.在教务管理系统数据库d_eams的course表中,创建一个插入事件触发器tr_course,添加一条课程信息时,显示提示信息。 delimiter %% create trigger tr_course after insert on course for each row begin set tr_i 操作成功!; end…...
uniapp rpx兼容平板
问题: 使用uniapp开发平板端时, rpx/upx 内容过小, 没有适应屏幕 原因: uniapp 默认支持最大设备宽度为960px 而平板宽度超出了960 uniapp官方文档https://uniapp.dcloud.io/collocation/pages?idglobalstyle 解决: // pages.json 文件: {//..."globalSt…...
mysql 唯一键
在数据库中,唯一键(Unique Key)是一种约束条件,用于确保表中的某一列或多列组合的数据具有唯一性。这意味着在这列或这些列中不能有两个相同的值。唯一键的主要目的是保证数据的完整性和准确性,防止重复记录的插入。 …...
C++设计模式行为模式———迭代器模式
文章目录 一、引言二、迭代器模式三、总结 一、引言 迭代器模式是一种行为设计模式, 让你能在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素。C标准库中内置了很多容器并提供了合适的迭代器,尽管我们不…...
Flutter:SlideTransition位移动画,Interval动画延迟
配置vsync,需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// 定义 AnimationControllerlate AnimationController _controller;overridevoid initState() {super.…...
Ruby Socket 编程
Ruby Socket 编程 Ruby 是一种动态、开放源代码的编程语言,以其简洁明了的语法和强大的功能而受到许多开发者的喜爱。在 Ruby 中,Socket 编程是一种重要的网络编程技术,它允许程序员创建可以在网络中通信的程序。本文将详细介绍 Ruby Socket 编程的基础知识,包括如何创建 …...
内容安全与系统构建加速,助力解决生成式AI时代的双重挑战
内容安全与系统构建加速,助力解决生成式AI时代的双重挑战 0. 前言1. PRCV 20241.1 大会简介1.2 生成式 Al 时代的内容安全与系统构建加速 2. 生成式 AI2.1 生成模型2.2 生成模型与判别模型的区别2.3 生成模型的发展 3. GAI 内容安全3.1 GAI 时代内容安全挑战3.2 图像…...