为了让线上代码可追溯, 我开发了这个vite插件

news2024/11/26 10:32:20

人生的第一个vite插件

前言

想在控制台输出一下前端代码的一些构建信息, 比如打包时间、打包的人, 代码分支、commit是那个,方便在控制台追溯。

背景

遇到的问题

1、场景一

前端多人协同开发的情况下,比方测试站, 你发的代码, 貌似被人覆盖了,测试说不对啊, 你很烦, 这时你问: 谁发过吗, 没人说话, 倘若控制台可以追溯 谁 在几点 发布了什么 commit信息等等...那就不用迷茫了

2、打印出来可以帮助排查问题

开发说: 代码发了, 客户说: 我这边还是不行。

开发说: 刷新试试, 客户说: 我都刷了好几次了还是不行。

开发陷入了沉思

这是经常会有的对话

倘若控制台有打包信息,倘若控制台可以追溯 谁 在几点 发布了什么 commit信息等等...那就可以确定代码是发成功了

插件介绍

vite-plugin-aliyun-flow 流水线打印构建信息插件, 可以准确的在前端控制台看到当前运行代码的构建人、构建时间、分支、最新的COMMIT信息等, 方便追溯线上代码。

插件效果 

使用

阿里云效流水线flow

安装

www.npmjs.com/package/vit…

npm i vite-plugin-aliyun-flow --D
复制代码

在vite.config.js/ts中配置

import vitePluginAliFlow from "vite-plugin-aliyun-flow";

// plugins
plugins: [
    // 这里只需配置项目名称即可,其他信息都会从流水线自动抓取
    vitePluginAliFlow({ projectName: '绩效'}),
    ...
]
复制代码

插件参数

目前版本只有一个项目名称配置

interface options {
    projectName?: string; // 项目名称 没有配置的话会取 package.json里的name字段
}
复制代码

实现思路

确定输出的信息列表

1、打包时间 buildTime

我的思路是vite插件执行的时候获取当前时间就可以, 就是打包时间。

2、构建时nodejs的版本

这个我们用的是阿里云流水线, 我在想应该可以在流水线的运行时,全局变量获取到。

3、分支信息

同上

4、commit信息

同上

5、流水线执行人

同上

从流水线运行时, 获取环境变量里用的到的数据

1、打印一下 process.env 查看有哪儿些信息

信息量有点大呀

或者查看阿里云文档也可以 help.aliyun.com/document_de…

2、 找寻我们需要的子段

CI_RUNTIME_VERSION // 构建时nodejs的版本
EXECUTOR_NAME // 流水线执行人
CI_COMMIT_REF_NAME // 分支名
CI_COMMIT_TITLE // commit信息中文
CI_COMMIT_ID // commit哈希
复制代码

写vite插件

vite插件文档 cn.vitejs.dev/guide/api-p…

我这个用一句话概括就是在打包的时候拿到了我要的信息,然后组装成了js字符串,插到了index.htmlscript标签里,运行中的时候可以执行就行了。

1、代码中获取流水线环境变量

process.env 为什么可以获取,因为打包的时候是用nodejs打包, process.env就是获取执行时环境变量的

const env = process.env
复制代码

2、创建输出的js文件

这边单独写了个js文件, 写这些个输出

内容如下, 并且通过style给console加了颜色 背景 字体大小

最后通过插件读取这个js字符串, 和变量拼在一起。

// 1. 将css样式内容放入数
const styles = [
    'color: white',
    'background: green',
    'font-size: 19px',
    'border: 1px solid #fff',
    'text-shadow: 2px 2px black',
    'padding: 5px',
].join(';');

console.log(`%c${__APP_INFO__.projectName}, 当前版本: V${__APP_INFO__.pkg.version}`, styles);

console.log(
    `%c打包时间: ${__APP_INFO__.lastBuildTime}`,
    styles,
);
console.log(__GLOBAL_ENV_, __GLOBAL_ENV_);

console.log(`%c构建Node.js版本: ${__GLOBAL_ENV_.CI_RUNTIME_VERSION || '-'}`, styles);

console.log(`%c流水线执行人: ${__GLOBAL_ENV_.EXECUTOR_NAME || '-'}`, styles);

console.log(`%c分支: ${__GLOBAL_ENV_.CI_COMMIT_REF_NAME || '-'}`, styles);
console.log(
    `%cCOMMIT信息: ${__GLOBAL_ENV_.CI_COMMIT_TITLE || '-'} ${
        __GLOBAL_ENV_.CI_COMMIT_ID || '-'
    }`,
    styles,
);
复制代码

3、拿到需要的信息, 拼接js字符串

extStr 就是上一步的js字符串

而后通过 htmlStr 把 __APP_INFO____GLOBAL_ENV_ (这两是咱们要的信息)和 extStr 组装了起来。

// 获取环境变量
const env = process.env
// 获取当前项目包信息
const pkg: any = fs.readFileSync(process.cwd() + '/package.json', 'utf-8')
// 获取输出的js文件
const extStr: string = fs.readFileSync(path.join(__dirname, '../src/external.js'), 'utf-8')

const { name, version } = JSON.parse(pkg);
// 项目名称、 版本号、打包时间
const __APP_INFO__ = {
    projectName: options.projectName || name,
    pkg: { name, version },
    lastBuildTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
};
// 把输出的变量一起拼接js字符串
const HtmlStr: string = `const __GLOBAL_ENV_ = ${JSON.stringify(env)};
const __APP_INFO__ = ${JSON.stringify(__APP_INFO__)};
\n ${extStr}`
复制代码

4、输出到index.html的body下面

transformIndexHtml vite暴露的方法,可以修改输出的index.html

如下就是 把HtmlStr放在script标签里输出到html的body下


transformIndexHtml(html): HtmlTagDescriptor[] {
    return [
        {
            tag: 'script',
            attrs: { defer: true },
            children: HtmlStr,
            injectTo: 'body'
        },
    ]
}
复制代码

完整代码

import type { Plugin, HtmlTagDescriptor } from 'vite';
import dayjs from 'dayjs';
import path from 'path';
import fs from 'fs';

interface AliflowOptions {
    projectName?: string
}

export default function Aliflow(options: AliflowOptions): Plugin {
    // 流水线环境变量
    const env = process.env
    // 当前项目包信息
    const pkg: any = fs.readFileSync(process.cwd() + '/package.json', 'utf-8')
    // 输出的js
    const extStr: string = fs.readFileSync(path.join(__dirname, '../src/external.js'), 'utf-8')

    const { name, version } = JSON.parse(pkg);
    // 项目名称、包版本、打包时间等
    const __APP_INFO__ = {
        projectName: options.projectName || name,
        pkg: { name, version },
        lastBuildTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
    };
    // 拼接输出的js字符串 最后查到script标签里
    const HtmlStr: string = `const __GLOBAL_ENV_ = ${JSON.stringify(env)};
    const __APP_INFO__ = ${JSON.stringify(__APP_INFO__)};
    \n ${extStr}`

    return {
        name: 'vite-plugin-aliuyun-flow',
        apply: 'build',
        transformIndexHtml(html): HtmlTagDescriptor[] {
            // 将htmlStr插到body里
            return [
                {
                    tag: 'script',
                    attrs: { defer: true },
                    children: HtmlStr,
                    injectTo: 'body'
                },
            ]
        }

    };
}
复制代码

总结

以上我们通过写vite插件注入打包信息, 让线上项目控制台可以追溯构建信息, 更好的排查问题。

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

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

相关文章

Java 反射系列 —— 学习笔记

Java 反射系列 1. 类成员 为了更好的描述,我们做个约定个通配符 XXXX, 如果是成员变量就代表 Field,如果是类方法就代表 Method,如果是构造器就代表 Constructor。 1.1 获取方法 那么怎么获取到这三类成员呢? 获…

逆势涨薪3k!新媒体运营毅然转行测试,我的入行秘籍是什么?

不尝试永远都不会成功,勇敢的尝试是成功的一半。 大学毕业做运营,业务难精进,薪资难提升 “你大学专业是商务英语,为什么毕业后会选择做新媒体运营呢?” 其实我当时没有想那么多的,商务英语的就业方向一个…

苹果电容笔值得买吗?2022最新电容笔推荐

如今,许多人都喜欢用IPAD来学习记录,或是安静地作画。很多ipad的用户,都很重视它的实用性,因为他们发现,如果有一款功能不错的电容笔来搭配ipad,那么ipad的实用性就会得到极大的提高。事实上,如…

开发 Chrome 扩展程序的利弊

作为一名软件开发人员,您总是希望从事能够提高您的技术技能并赚钱的项目。有什么比开发现金流 chrome 扩展程序更好的方法呢? 在本文中,我将从软件开发人员的角度概述开发 chrome 扩展程序的一些优点和缺点。 开发 Chrome 扩展程序的好处 Chrome 扩展程序是软件开发人员接…

基于遗传算法与神经网络的测井预测(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

【序列召回推荐】(task4)多兴趣召回MIND模型

note Hinton在2011年提出的capsule network,通过EM期望值最大化算法,用动态路由代替反向传播进行更新参数,学习不同capsule之间的连接权重,实现比CNN更优秀的空间关系建模效果(CNN可能对同一个图像的旋转版本识别错误…

Java笔记(十四)

文献种类:专题技术总结文献 开发工具与关键技术: IntelliJ IDEA、Java 语言 作者: 方建恒 年级: 2020 撰写时间: 2022 年 11 月 28 日 Java笔记(十四) 今天我给大家继续分享一下我的Java笔记, 我们继续来…

终于读完了阿里云p9专家分享云原生Kubernetes全栈架构师实战文档

都说程序员工资高、待遇好, 2022 金九银十到了,你的小目标是 30K、40K,还是 16薪的 20K?作为一名 Java 开发工程师,当能力可以满足公司业务需求时,拿到超预期的 Offer 并不算难。然而,提升 Java…

Linux便捷操作

1. Tab 这是你不能没有的 Linux 快捷键。它将节省你 Linux 命令行中的大量时间。 只需要输入一个命令,文件名,目录名甚至是命令选项的开头,并敲击 tab 键。它将自动完成你输入的内容,或为你显示全部可能的结果。 如果你只记一个…

中国住宅设施杂志中国住宅设施杂志社中国住宅设施编辑部2022年第9期目录

景观园林《中国住宅设施》投稿:cnqikantg126.com 市政园林景观工程施工项目管理的基本方法与措施 蒋伟;刘巍;张辉; 1-3 低成本风景园林设计与相关问题分析 魏小静; 4-6 城市文化公园景观设计探究——以临夏河州牡丹文化公园为例 姜丽; 7-9 建筑设计 …

一文读懂:低代码和无代码的演进历程、应用范围

低代码和无代码技术的演进发展 整个软件开发的演进路径大致可以分为四个阶段:第一代程序设计语言;第二代是汇编语言;第三代是现在常见的高级语言,比如 Python、Java 等;第四代就是低代码和无代码技术。低代码、无代码…

Pro_11丨跟踪+目标出场自适应切换

量化策略开发,高质量社群,交易思路分享等相关内容 『正文』 ˇ 大家好,今天我们分享第11期策略——跟踪目标出场自适应切换策略。本期策略是2022年度倒数第2期策略,2023年度松鼠俱乐部内容会更加丰富,12月出预告敬请…

【Vagrant】使用 Vagrant 快速创建多台 centos7 虚拟机

问题场景: 最近在学习数据库的主从复制,因此需要安装两个虚拟机,一个放主数据库,一个放从数据库(不会用 Docker ,咱就多搭几个虚拟机吧 ),因此记录使用 Vagrant 快速搭建两个 CentOS 7 的教程&a…

Python海龟turtle基础知识大全与画图集合

Turtle图形库 Turtle 库是 Python 内置的图形化模块,属于标准库之一,位于 Python 安装目录的 lib 文件夹下,常用函数有以下几种: 一.Turtle绘图的基础知识 画布是turtle用于绘图区域,我们可以设置它的大小和初始位置。…

使用支持向量机的基于异常的入侵检测系统

使用支持向量机的基于异常的入侵检测系统使用支持向量机的基于异常的入侵检测系统学习目标:学习内容:1.⼀种智能⼊侵检测系统第⼀阶段第⼆阶段:分类总结2.使用支持向量机的基于异常的入侵检测系统1.预处理入侵数据集2.基于信息增益的特征排名…

c++ CJsonObject 读写json

CJsonObject简介 CJsonObject是Bwar基于cJSON全新开发一个C版的JSON库,CJsonObject的最大优势是简单、轻量、跨平台,开发效率极高,尤其对多层嵌套json的读取和生成、修改极为方便。CJsonObject比cJSON简单易用得多,且只要不是有意…

Linux —— 文件操作

目录 1.内核提供的文件系统调用 1.1open和close 1.2write和read 2.文件描述 2.1文件描述符 2.2文件描述符分配规则 3.重定向 3.1最“挫”的重定向 3.2使用系统调用 3.3重定向原理 3.4让我们的"shell"支持重定向操作 4.一切皆文件 1.内核提供的文件系统调用…

什么是杜邦分析?杜邦分析法的公式及示例

什么是杜邦分析? 杜邦分析也称为杜邦恒等式、杜邦方程、杜邦框架、杜邦模型或杜邦方法,是一个多步骤的财务方程式,可以深入了解企业的基本绩效。杜邦模型对影响公司股本回报率 (ROE) 的关键指标进行了全面分析。杜邦分析的另一个术语是杜邦模型。这些名…

做app的测试,你大概率会用到这个命令,尤其是做monkey测试

1.普通命令 1.1 devices命令 语法格式 :adb devices [-l] # 作用 :返回已连接设备的信息 # 示例 :adb devices : 返回设备的信息adb devices -l : 返回设备的详细信息1.2 help命令 语法格式 :adb --help # 作用 &#xff1…

人工智能:人工神经网络的应用场景

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…