广告
广告
广告
前言最近发现动态去拼接资源路径还是挺常用的,于是把我之前封装的hooks单独分享出来。教程useAssets.tsexport function useAssets() { /** 前缀补路径斜杠 */ // eslint-disable-next-line @typescript-eslint/no-unused-vars function addPrefixSlash(path: string) { return path.startsWith("/") ? path : `/${path}`; } /** ...
前言这段时间对接了下web版的谷歌登录,总体来说坑非常多,即便到现在,我都感觉这个教程都只能算是一个应急处理方案,并不完美,缺点如下:文档稀少,官方提供的教程自由度很差ui不可控,前端无法自定义触发按钮不多说,开搞!教程官方文档和流程官方文档:web谷歌登录流程:我们需要先去将需要web登录的域名去向谷歌申请一个客户端id,用于在客户端登录处理。申请地址:开发者后台创建凭据 --- 选择OAuth 客户端ID --- 应用类型选择 web应用 --- 自己填写一个名称已获授权的 JavaScript 来源这个选项意思就是你允许使用这个客户端id对应的网站域名,添加对应的网站地址,个人测试...
前言在pinia中使用setup语法是非常舒服的一件事情,但是也会有一些坑点,其中就是当我们使用store.$reset()进行重置的时候会发生报错:Store "xxxx" is built using the setup syntax and does not implement $reset()意思是$reset并没有实现,我们需要自己手动实现这个。教程解决办法我是从stackoverflow看到的,这里放出出处:《Pinia: $reset alternative when using setup syntax》我们需要创建一个插件去实现这个功能:stores...
前言一直很想体验下websocket,苦于一直没有机会,乘着这次优化,封装了一个原生的websocket处理类,本来是想用Socket.io的,但是它只能和它配套的server端使用,对于一些非封装的服务端,没法直接使用,于是只能自己封装了。功能:支持失败重连支持心跳支持重新初始化事件订阅ts愉悦的类型推断,传入事件名和回调函数,能自动推断出结果类型支持手动断卡,重新初始化即可重新连接为什么需要重新初始化,因为我们的spa项目中,用户退出登录需要断开socket连接,用户登录后又需要重新连接,所以重新初始化承接的是切换用户重连的功能。事件订阅是由于socket传递消息全靠原生的onmes...
any类型在ts中我们只有有很多类型,比如:string、number、boolean等等,那么any这个类型怎么去理解呢?我们可以将其看做是一个超级类型集合,下面举个例子:type A = string; type B = number; type C = string | number; type D = string | number | boolean;可以看到,C和D里面都包含了string和number,那么他们都可以包含类型A和类型B,而any类型则是一个包含都有类型的一个集合。因为包含了所有,所以它可以很自由的去使用,从某种角度来看,any就是告诉ts,不需要来检测我...
前言最开始的时候写ts的时候遇到过这种问题,为什么String类型不能赋值给string类型,他们不都是字符串吗?在js中不是万物皆对象吗?同类型为什么不可以?const a: string = "a"; const b: String = a; const c: string = b;可以看到string类型可以赋值给String,而String类型不能赋值给string。解惑在JavaScript中,String、Number这种被称为包装器,你可以理解为他是一个类或者是构造函数,它返回的是一个对象,而string是一个字面量,被称为原始数据类型。原始数据类型(P...
前言pinia的作者最近在博客上放出了一篇pinia的使用文章:《My Top 5 Tips for using Pinia》,里面讲述了5个一般不怎么知道的使用技巧,但是由于讲的很浅,我这边自己理解了一下,做了一些解释,顺带记个笔记。不要创建无用的 getter这点我感同身受,在最初学习vuex的时候,前辈们总是会说,getter有缓存,性能会更好,于是,在大多数的教程中,我们总是能看到这种示例写法:export default Vuex.Store({ state: () => ({ counter: 0 }), getters: { ...
前言本来debian在安装的时候就可以选择国内的源,本来我以为这样就行了,不用自己在手动换,结果今天在使用更新命令时就给我卡住了,开始请求官方源了。难崩,还得自己换源解决问题。教程我们需要打开源文件:/etc/apt/sources.list ,你可以使用nano编辑或者ssh软件自带的文件管理功能修改文件。将里面deb和dep-src全部注释,注意这个注释是在每行前面加#号,大概如下:# deb http://mirrors.ustc.edu.cn/debian/ bookworm main non-free-firmware # deb-src http://mirrors.ustc...
前言最近新学到一招,利用原生css实现首屏骨架,这样即可以省去在Home.vue组件中单独创建骨架,而且对html结构是0添加。先看看预览图:效果还是可以的。教程原理就是利用background-image的多重渐变实现骨架占位,配合background-size和background-position进行精准定位,如果你的骨架是大量重复内容,还可以配置background-repeat: repeat-y;进行y轴重复渲染,效果更佳。然后通过动画控制整体的透明度变化实现动效。再通过:empty伪类实现对#app是否渲染的判断。:empty会在对应的元素内部没有任何内容时生效。不多说,直...
前言多页面其实可以理解为多个独立的业务之间共享部分代码逻辑的实现。业务之间是相对独立的,只是小部分或者大部分的代码是可以共用的,常见的一个场景就是:改头换面形式的换肤。不同的皮肤之间毫无可复用组件代码的情况下,我们只能将通用的业务逻辑抽离成可复用的部分,简单点来说就是将数据与ui分离,数据是共用部分,ui是各自独立。最终衍生出的多页面结构大体如下:pages ├── pageA │ ├── App.vue │ ├── index.html │ ├── main.ts └── pageB ├── App.vue ├── index.html └── ma...
inherit 继承关键字这是一个从IE8就开始支持的关键词,用于继承上层的样式效果,比如字体大小,字体颜色等,也是用的比较多的一个关键词,这里就不多说。initial 初始值关键词initial可以把css的属性还原成css语法中规定的初始值,但是需要注意的是这里的初始的值不是元素默认的值,而是css语法规范中定义的初始值。p { display: initial; }p元素默认是block盒子,但是当我们使用initial时你会发现它变成了一个inline盒子了,所以不要搞混了这个关键词的作用。unset 不固定值关键词如果当前使用的css属性是具有继承特性的,unset就等同于...
前言在越来越深入使用ts的时候,我们会遇到这种痛点,有人声明了一个类型A,然后另一个人声明了B类型,此时我需要将A、B类型交叉起来,再增加一些新属性,这很好,但是当我们将鼠标移动到定义的新类型C上面的时候,你会发现你只能看到自己新增的属性,A、B类型只能看到一个名字,你无法感知到它们具体都有哪些属性。当然,这在开发中并不会有多大的影响,大不了跳转查看就是了,但是我们能不能不跳转进行预览呢?于是晚上刷小破站看到国外的一个大神的视频,讲述了一个有趣的分享,他分享了一个自定义的Prettify类型,通过使用这个类型我们就能查看到完整的属性了。 不多说,上教程。教程interface Test ...
前言由于最近研究了下br和gzip的配置,个人对于这个压缩处理推荐的逻辑是这样的:当访问的资源本地存在br文件的时候,优先使用br,br不存在的时候,访问gz文件,如果gz还不存在,就走默认资源处理或者返回源文件那么这套该怎么配置呢?教程全局nginx配置:gzip on; gzip_static on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript applica...
前言网上充斥着各种cv的教程,看的我真的要吐了,在国内环境下,根本没法正确编译brotli,为此我自己写一篇完全可用的教程。首先说一下流程:我们需要先卸载nginx,然后通过安装宝塔的服务器,用git拉取一个ngx_brotli项目,然后进入该项目,调用git submodule update --init,当内容返回checkout的时候才算扩展拉取成功。但是大部分人都会卡在这里,因为国情的原因,我们没法正确的拉取到项目。当我们拉取完毕后在宝塔点击安装nginx,选择编译安装,将刚刚拉取的模块加载进来一起编译安装。然后就等待安装完成即可。解决ngx_brotli拉取问题[hide]首先...
前言最近遇到这么一个头疼的需求,第三方提供了两份sdk,一个是针对安卓端使用的,一个是针对ios端使用的,但是他们都会在全局window上挂载同名属性对象,这就让我很难受了。<script src="/sdk/sdk.min.js"></script> <script src="/sdk/ios_sdk.min.js"></script>前端如果想要使用这个sdk就必须在head引入它,但是它又有两个脚本,后来的脚本又会覆盖上一个脚本在全局挂载的对象。理论上一个优秀的sdk不应该出现这种问题,它应该自...
前言通过vite官方的多页面打包示例,我发现它不会将html文件进行压缩处理,使用了一些第三方插件处理多页面,也都无法对html文件进行压缩处理,于是只能自己想办法了。效果图教程[hide]依赖安装pnpm i posthtml htmlnano cssnano terser svgo -D其中主力是posthtml和htmlnano,其它依赖都是他们的子依赖。编写插件创建文件:vite-plugin-html.tsimport type { Plugin } from "vite"; import posthtml from "posthtml"...
前言用了1天发现NFS的共享对windows来说真的是噩梦,权限问题太多了,最后在共享的磁盘中处理git仓库操作,各种问题,最后选择放弃,还是使用windows更加友好的SMB共享。对于linux之间的磁盘共享,通过NFS可以提供性能,对于windows的共享,还是得SMB。教程pve通过ssh连接,安装依赖:[hide]apt-get install samba samba-client理论上将pve自己是smb提供方,应该是不需要安装samba-client客户端的,但是由于又要在数据中心挂载目录,所以还是装一下吧。安装完成后我们配置一下smb配置。首先我们的共享目录就以上次挂载的磁...
上一章我们挂载了一个磁盘,但是这个磁盘如果要给其他虚拟机使用,粗暴的方式就是给其他虚拟机直接在硬件那添加一个磁盘,但是这种方式并不是共享,而是占用指定的空间,显然这并不方便。于是我选择了NFS的方式进行共享,这样linux系统可以使用,windows系统也可以使用。[hide]pve安装NFS通过ssh连接pve。apt-get update apt-get install nfs-kernel-server上一篇我们挂载的磁盘创建的目录是mnt/sda1,我们继续使用它。nano /etc/exports添加一行:/mnt/sda1 *(rw,sync,no_root_squash)...
擦除磁盘对于新的硬盘来说,其实没啥必要擦除,但是如果你是一个已经格式化过的硬盘,你希望重新开始,或者说你的磁盘格式不对,可以先用pve的可视化操作快速擦除一下。擦除完我们还需要进行格式化分区并挂载目录。分区格式化[hide]先输入:fdisk /dev/sda 打开指定的分区表并准备操作格式化处理,其中的sda就是上面我们通过pve查看到的新增的磁盘设备,如果你不知道,你可以通过下面这个命令去查看所有磁盘设备:fdisk -l可以看到用我这里已经有两块已经格式化的磁盘分区。其中sda就是本次教程完成后的效果。找到你需要格式化处理的分区输入fdisk 分区路径进入help界面。先输入n再输...
搞不懂为啥安装最新版的Debian12后就无法像之前那样通过sudo进行提权处理,解决方法如下:先通过普通用户登入,ssh连接或者Debian本地终端也行,输入以下命令:su -此时我们输入root账号的密码就不会提示不是 sudoers 文件了,但是这并不能解决问题,我们继续:visudo此时会打开一个文件,我们往下翻找到root ALL=(ALL:ALL) ALL 这行字符,在它的下一行我们输入一行文本:你当前用于提权的账号 ALL=(ALL:ALL) ALL如果你当前用于提权的账号是aaaa,那么实际文本内容就是:aaaa ALL=(ALL:ALL) ALL输入完毕后CTRL...
前言其实也没有真正意义上的同步,当我们在远程仓库删除了某个分支,通过git命令只能将本地origin/xxx的分支删除,实际上本地还有对应的分支没有被删除。为此我们还需要手动删除本地对应的分支。教程git remote update origin --prune这个命令是git fetch和git remote prune的组合操作。它会更新所有远程分支,并删除本地已经不存在于远程仓库的分支。此时我们查看本地分支,假设你删除的是test分支,你会发现本地对应的origin/test确实没有了,但是还存在一个test分支。这个没办法只能手动删除了。git branch -d test然后就行了。
依赖{ "scripts": { "type-check": "vue-tsc --noEmit -p tsconfig.app.json --composite false", "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore" }, "devDependencies": { "...
前言随着日常代码的产出,有些时候我们希望代码的注释能够区分一下优先级和类型,比如我发现了一个问题,但是这个问题可能需要以后有时间再修复,又或许为了实现某个功能,我使用了hack的方式,我希望能够给后来者一个提醒,方便接手人的维护,基于这些需求,我找到了一个插件:TODO Highlight它可以很方便的实现注释上的高亮处理,因为我暂时还不需要去大量查询todo,所以就没安装TODO Tree这个插件。实现看下效果图:由于官方默认只预设了TODO:和FIXME:,其他是我自己拓展的,大家可以按照下面的教程配置一下。自定义扩展TODOvscode -> 文件 -> 首选项 -&g...
最近评论