手把手写一个vue3的组件库,在指定dom中生成水印

简介: 本次手把手记录的是一个vue3的给dom生成水印的指令,这里把他封装成一个组件,下一次直接拉下来就可以使用。这个可以用在移动端或者是pc端上防止数据被人截屏。效果如下:

在工作的途中,很多时候会发现一些特别使用的组件。我们需要把我们有用的组件分享给大家,如果大家都这么做,何愁国家的科技实力不强。(也可能导致行业更加内卷)


效果


本次手把手记录的是一个vue3的给dom生成水印的指令,这里把他封装成一个组件,下一次直接拉下来就可以使用。这个可以用在移动端或者是pc端上防止数据被人截屏。效果如下:


887bd04d2d2c2b07ba03d7e6db96462c.png


源码仓库:github.com/cll123456/v…


准备工作


这里我们可以思考下,写一个组件的步骤是啥?


第一步:配置环境


配置环境,在这个组件中,要做的是项目如何打包,使用的语言等?


安装依赖


在开发环境需要把代码进行打包,测试。这里使用rollup进行打包,如果对rollup有疑问的,可以查看往期的文章


    "@types/jest": "^27.0.2",                ### jest的类型检查库
    "@vue/test-utils": "^2.0.0-rc.16",       ### vue官方的测试工具
    "eslint": "^8.1.0",                      ### 代码检查
    "jest": "^27.3.1",                       ### jest 是一个令人愉快的 JavaScript 测试框架
    "prettier": "^2.4.1",                    ### 代码格式的检查工具,和esline类似
    "rollup": "^2.59.0",                     ### 代码进行打包的工具
    "rollup-plugin-typescript2": "^0.30.0",  ### rollup 转义typescript 的插件
    "ts-jest": "^27.0.3",                    ### jest在测试ts代码的预处理库
    "typescript": "^4.3.5",                  ### 强大的类型检查库
    "vue": "^3.2.16",                        ### vue3
    "@vue/vue3-jest": "^27.0.0-alpha.3"      ### jest 测试vue的代码
    "rollup-plugin-dts": "^4.0.0"            ### rollup 自动生成类型文件
    "rollup-plugin-terser": "^7.0.2"         ### rollup 对代码进行压缩
复制代码


安装完成上面的依赖后,咋们就需要开始进行配置文件了。


新建tsconfig.json用于编写ts的规则


{
  "compilerOptions": {
    "target": "es6",     // 编译的模板是es6,                                    
    "moduleResolution": "node",  // 模块解析策略是node
    "strict": true, // 启动严格模式
    "importHelpers": true, // 开启模块导入助手
    "esModuleInterop": true, // 开启模块的相互转换
    "allowSyntheticDefaultImports": true, // 允许异步导入
    "noImplicitThis": false, // 允许隐士的this
    "declaration": true, // 需要生成.d.ts的类型文件 
    "baseUrl": "./", // 根路径
    "lib": ["esnext", "dom", "dom.iterable", "scripthost"], // 需要使用的资源库
    "paths": { 
      "@/*": ["src/*"]  // 相对路径的指向
    }
  },
  "include": ["src/**/*.ts", "tests/**/*.ts"],  // 检查这里包含的文件
  "exclude": ["node_modules","dist"] // 这里包含的文件不进行检查
}
复制代码


有了类型检查,接下来配置一下rollup的默认配置


这里只说明几个关键的点,在rollup中使用插件的顺序需要注意,不然容易报错,在本项目中, 插件的顺序应该是先进行 ts的转换, 然后进行代码压缩,最后是生成声明文件,具体的文件配置文件内容查看: github.com/cll123456/v…


接下来就是eslint,prettier,jest的配置了,这两个配置也是比较简单的,一个是配置代码的检查规则,另一个是配置测试代码的规则。


  • eslint配置请查看:github.com/cll123456/v…
  • prettier的配置请查看: github.com/cll123456/v…
  • jest的配置请查看: github.com/cll123456/v…


如果看到这里的话。恭喜你,你的环境就好了,接下来请尽情的撸代码吧!


第二步: 在环境中写代码


思路分析


需要在dom中生成水印,无非就是在dom中加入一张背景图片,然后在背景图片中加入想要的内容。


/**
 * 添加水印
 * @param str  水印的内容
 * @param parentNode  父节点
 * @param font 水印文字大小
 * @param textColor 水印颜色
 * @param rowLength 一个水印的宽度是多少
 * @param colLength 一个水印的长度是多少
 */
function addWaterMarker(str: string, parentNode: HTMLDivElement, font: string, textColor: string, rowLength: number, colLength: number) {// 水印文字,父元素,字体,文字颜色
  let can = document.createElement('canvas');
  parentNode.appendChild(can);
  can.width = parentNode.offsetWidth;
  can.height = parentNode.offsetHeight;
  can.style.display = 'none';
  let cans = can.getContext('2d');
  cans?.rotate(-10 * Math.PI / 180);
  cans!.font = font || "16px Microsoft JhengHei";
  cans!.fillStyle = textColor || "rgba(180, 180, 180, 0.3)";
  cans!.textAlign = 'left';
  cans!.textBaseline = 'middle';
  // 需要遍历添加文字
  for (let row = 0; row < can.height / rowLength; row++) {
    for (let col = 0; col < can.width / colLength; col++) {
      cans?.fillText(str, col * colLength, row * rowLength);
    }
  }
  // 在节点中添加内容
  parentNode.style.backgroundImage = "url(" + can.toDataURL("image/png") + ")";
}
复制代码


上面是生成水印的核心代码,就看你放在哪里了


测试代码


代码写好后,测试也是很关键的、本项目使用了两种测试方法


  • jest 测试: 这个测试过程也是很简单,只是简单测试,属性存在与否。


e7ae68c65cf88367fb25e89c00c469f2.png


  • 建立项目的方式进行测试,这里涉及一个知识点,请查看


测试的结果如下:


855bb0ab0ec167c5e48efd1065c1dd3c.png


第三步:分享到npm上


当测试完成时候,就需要发布了。发布流程如下:


1.使用命令npm login登录


cc24d7649beaf2189c26c9436e85808f.png


2. 使用命令npm publish发布包


d0dc3910d122b23a8032ef721dc4484f.png

相关文章
|
4月前
|
缓存 JavaScript PHP
斩获开发者口碑!SnowAdmin:基于 Vue3 的高颜值后台管理系统,3 步极速上手!
SnowAdmin 是一款基于 Vue3/TypeScript/Arco Design 的开源后台管理框架,以“清新优雅、开箱即用”为核心设计理念。提供角色权限精细化管理、多主题与暗黑模式切换、动态路由与页面缓存等功能,支持代码规范自动化校验及丰富组件库。通过模块化设计与前沿技术栈(Vite5/Pinia),显著提升开发效率,适合团队协作与长期维护。项目地址:[GitHub](https://github.com/WANG-Fan0912/SnowAdmin)。
719 5
|
1月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
222 1
|
1月前
|
缓存 JavaScript UED
除了循环引用,Vue3还有哪些常见的性能优化技巧?
除了循环引用,Vue3还有哪些常见的性能优化技巧?
137 0
|
2月前
|
JavaScript
vue3循环引用自已实现
当渲染大量数据列表时,使用虚拟列表只渲染可视区域的内容,显著减少 DOM 节点数量。
89 0
|
4月前
|
JavaScript API 容器
Vue 3 中的 nextTick 使用详解与实战案例
Vue 3 中的 nextTick 使用详解与实战案例 在 Vue 3 的日常开发中,我们经常需要在数据变化后等待 DOM 更新完成再执行某些操作。此时,nextTick 就成了一个不可或缺的工具。本文将介绍 nextTick 的基本用法,并通过三个实战案例,展示它在表单验证、弹窗动画、自动聚焦等场景中的实际应用。
393 17
|
5月前
|
JavaScript 前端开发 算法
Vue 3 和 Vue 2 的区别及优点
Vue 3 和 Vue 2 的区别及优点
|
5月前
|
存储 JavaScript 前端开发
基于 ant-design-vue 和 Vue 3 封装的功能强大的表格组件
VTable 是一个基于 ant-design-vue 和 Vue 3 的多功能表格组件,支持列自定义、排序、本地化存储、行选择等功能。它继承了 Ant-Design-Vue Table 的所有特性并加以扩展,提供开箱即用的高性能体验。示例包括基础表格、可选择表格和自定义列渲染等。
384 6
|
4月前
|
JavaScript 前端开发 API
Vue 2 与 Vue 3 的区别:深度对比与迁移指南
Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架,在过去的几年里,Vue 2 一直是前端开发中的重要工具。而 Vue 3 作为其升级版本,带来了许多显著的改进和新特性。在本文中,我们将深入比较 Vue 2 和 Vue 3 的主要区别,帮助开发者更好地理解这两个版本之间的变化,并提供迁移建议。 1. Vue 3 的新特性概述 Vue 3 引入了许多新特性,使得开发体验更加流畅、灵活。以下是 Vue 3 的一些关键改进: 1.1 Composition API Composition API 是 Vue 3 的核心新特性之一。它改变了 Vue 组件的代码结构,使得逻辑组
1473 0
|
6月前
|
JavaScript 前端开发 UED
vue2和vue3的响应式原理有何不同?
大家好,我是V哥。本文详细对比了Vue 2与Vue 3的响应式原理:Vue 2基于`Object.defineProperty()`,适合小型项目但存在性能瓶颈;Vue 3采用`Proxy`,大幅优化初始化、更新性能及内存占用,更高效稳定。此外,我建议前端开发者关注鸿蒙趋势,2025年将是国产化替代关键期,推荐《鸿蒙 HarmonyOS 开发之路》卷1助你入行。老项目用Vue 2?不妨升级到Vue 3,提升用户体验!关注V哥爱编程,全栈开发轻松上手。
417 2
|
6月前
|
JavaScript 前端开发 算法
高效工作流:用Mermaid绘制你的专属流程图;如何在Vue3中导入mermaid绘制流程图
mermaid是一款非常优秀的基于 JavaScript 的图表绘制工具,可渲染 Markdown 启发的文本定义以动态创建和修改图表。非常适合新手学习或者做一些弱交互且自定义要求不高的图表 除了流程图以外,mermaid还支持序列图、类图、状态图、实体关系图等图表可供探索。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~