【前端埋点】纯前端实现 A/B Test

“纯前端实现 A/B Test”,意思就是 没有后端分流、也不依赖流量网关,那么只能靠前端逻辑来做“流量切分”。


🎯 目标

  • 80% 的用户 → A 页面
  • 20% 的用户 → B 页面
  • 且要保证 同一个用户每次访问结果一致(否则用户刷新页面时 A/B 会跳来跳去,没意义)。

✅ 实现思路

方法一:基于随机数 + 本地存储(推荐)

function assignABTest() {// 先看本地是否已有分组结果let group = localStorage.getItem('ab_group')if (!group) {// 随机生成一个 [0,1) 的数const rand = Math.random()// 按比例分配group = rand < 0.8 ? 'A' : 'B'localStorage.setItem('ab_group', group)}return group
}// 使用
const group = assignABTest()
if (group === 'A') {window.location.href = '/pageA.html'
} else {window.location.href = '/pageB.html'
}

👉 特点:

  • 第一次访问时随机分配。
  • 后续访问保持一致(因为结果存了 localStorage)。
  • 不需要后端,不需要流量标识。

方法二:基于用户特征(比如 UA / IP Hash)

如果你不想依赖 localStorage(例如用户清理缓存后可能变化),可以用一些用户环境特征来算哈希值:

function hashCode(str) {let hash = 0for (let i = 0; i < str.length; i++) {hash = (hash << 5) - hash + str.charCodeAt(i)hash |= 0}return Math.abs(hash)
}function assignABTestByUA() {const ua = navigator.userAgentconst hash = hashCode(ua)const ratio = hash % 100 // 映射到 0-99return ratio < 80 ? 'A' : 'B'
}

👉 特点:

  • 同一设备 UA → 分组稳定。
  • 但不同浏览器、换设备就会变组。

方法三:基于 Cookie(和 localStorage 类似)

function getCookie(name) {const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'))return match ? match[2] : null
}function setCookie(name, value, days) {const d = new Date()d.setTime(d.getTime() + days * 24 * 60 * 60 * 1000)document.cookie = `${name}=${value};expires=${d.toUTCString()};path=/`
}function assignABTest() {let group = getCookie('ab_group')if (!group) {group = Math.random() < 0.8 ? 'A' : 'B'setCookie('ab_group', group, 30) // 保存30天}return group
}

👉 特点:

  • 可以跨刷新稳定,甚至跨子页面。
  • 但 cookie 会随请求发给后端,不太纯粹。

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

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

相关文章

Day22_【机器学习—集成学习(3)—Boosting—Adaboost算法】

Adaptive Boosting(自适应提升)是基于 Boosting思想实现的一种集成学习算法&#xff0c;核心思想是通过逐步提高那些被前一步分类错误的样本的权重来训练一个强分类器。一、Adaboost算法直线相当于一个弱学习器&#xff0c;正确的数据权重减小&#xff0c;错误的数据权重增加二…

C#语言入门详解(18)传值、输出、引用、数组、具名、可选参数、扩展方法

C#语言入门详解&#xff08;18&#xff09;传值、输出、引用、数组、具名、可选参数、扩展方法一、传值参数1. 值类型2. 引用类型&#xff0c;并且创建对象3. 引用类型&#xff0c;不创建对象二、引用参数1. 值类型2. 引用类型&#xff0c;创建新对象3. 引用类型&#xff0c;不…

模型部署:(二)安卓端部署Yolov5-v6.0目标检测项目全流程记录

模型部署&#xff1a;&#xff08;二&#xff09;安卓端部署Yolov5-v6.0目标检测项目全流程记录1、下载NCNN项目2、下载基于安卓的yolov5项目3、修改相应的配置文件4、将项目打包成apk包5、部署自己训练的yolov5模型6、相关资料下载&#xff1a;1、下载NCNN项目 # 链接地址 ht…

图形基础算法:如何将点与带曲线边的多边形位置关系算法做稳定

简介判断点与多边形位置关系算法是几何算法中最基础的算法之一&#xff0c;包括布尔运算在内的非常非常多的算法都会用到它。它的稳定是算法库稳定的关键。下面我们从一个边都是直线的多边形开始了解射线法的原理。然后看看引入曲线后会带来哪些问题&#xff0c;以及在实际应用…

react的filber架构

好问题 &#x1f44d; 你问的是 React Fiber 架构。这是 React 16 引入的核心机制&#xff0c;用来解决 React 在大规模更新时的性能问题。下面我给你从 背景 → Fiber 是什么 → 原理 → 优点 → 流程 来系统讲。一、为什么需要 Fiber&#xff1f;在 React 15 及以前&#xff…

Lucky STUN穿透结合群晖NAS实现docker下transmission监听端口动态更新

参考文章 LCUKY系列教程 一 「LUCKY STUN穿透」使用 cURL 自动修改 Transmission 的监听端口 二 「LUCKY STUN穿透」使用 Webhook 自动修改 qbittorrent 的监听端口 三 LUCKY STUN穿透在Windows上使用UPnP工具为BT客户端自动添加内外端口号不同的映射规则 四「LUCKY STUN穿透」…

如何在Ubuntu畅玩鸣潮等游戏

本教程只包括Steam上的游戏。# 更新软件源 sudo apt update # 安装Steam sudo apt install steam首先&#xff0c;在Ubuntu的snap商店安装Steam&#xff0c;启动&#xff0c;登陆&#xff0c;下载游戏。到这里的操作都比较简单&#xff0c;对于没有反作弊的游戏&#xff0c;往往…

机器学习09——聚类(聚类性能度量、K均值聚类、层次聚类)

上一章&#xff1a;机器学习08——集成学习 下一章&#xff1a;机器学习10——降维与度量学习 机器学习实战项目&#xff1a;【从 0 到 1 落地】机器学习实操项目目录&#xff1a;覆盖入门到进阶&#xff0c;大学生就业 / 竞赛必备 文章目录一、聚类任务&#xff08;无监督学习…

解决 Docker 构建中 Python 依赖冲突的完整指南

问题背景 在基于 registry.cn-shenzhen.aliyuncs.com/all_dev/dev:invoice-base 镜像构建 Docker 容器时,我们遇到了一个常见的 Python 依赖管理问题: ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution/#dealing-…

光子计算芯片实战:Lightmatter Passage互连架构性能评测

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 摘要 随着人工智能计算需求呈指数级增长&#xff0c;传统电子计算…

基于树莓派与Jetson Nano集群的实验边缘设备上视觉语言模型(VLMs)的性能评估与实践探索

概述 2018年&#xff0c;TensorFlow Lite团队的Pete Warden曾提出&#xff1a;“机器学习的未来在于微型化”。如今&#xff0c;随着人工智能向高性能视觉强大的视觉语言模型&#xff08;Vision-language models, VLMs&#xff09;发展&#xff0c;对高性能计算资源的需求急剧…

华为Ai岗机考20250903完整真题

华为Ai岗机考20250903 华为自26届秋招&#xff08;2025年起&#xff09;对AI岗位机考进行了改革&#xff0c;考试题型调整为20道选择题&#xff08;15道单选(6分)5道不定项选择(12分)&#xff09;2道编程题(150300)。 题目核心围绕人工智能技术&#xff08;如Transformer架构…

k8s+jenkins+harbor构建Devops平台

一、环境准备1、准备一主一从k8s机器&#xff0c;&#xff08;设备好可以一主多从也行&#xff09;2、一台harbor仓库机器&#xff08;dockerhub访问不了&#xff09;二、安装nfs服务1、在k8s机器上yum install nfs-utils -y systemctl start nfs systemctl enable nfs2、创建共…

为什么 socket.io 客户端在浏览器能连上,但在 Node.js 中报错 transport close?

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

人才教育导向下:老年生活照护实训室助力提升学生老年照护服务能力

一、老年生活照护实训室建设背景与意义 &#xff08;一&#xff09;适应老龄化社会需求 我国老龄化程度持续加深&#xff0c;老年照护服务人才缺口不断扩大。培养专业照护人才成为当务之急&#xff0c;职业教育需承担重要责任。点击获取实训室建设方案 &#xff08;二&…

我在嘉顺达蓝海的安全坚守

作为嘉顺达蓝海的资深安全员&#xff0c;每天清晨 6 点&#xff0c;我都会站在物流基地的入口处&#xff0c;看着一队队橙色的嘉顺达蓝海危险品运输车整齐列队。那抹醒目的橙色&#xff0c;不仅是嘉顺达蓝海的标志&#xff0c;更是我和 200 多名同事坚守 12 年的安全承诺。今天…

云原生监控系统 Prometheus大总结 20250909

本章内容如下&#xff1a; Prometheus 介绍 Prometheus 部署和配置 Node Exporter 采集数据 Pushgateway 采集数据 PromQL 查询语言 Grafana 图形化展示 Prometheus 标签管理 Prometheus 告警机制 Prometheus 服务发现 各种Exporter 高级功能 Prometheus 实现容器监控 Promethe…

EPNN:基于嵌入式偏振神经网络的水下成像增强方法(未做完)

Enhancing Underwater Imaging for Robot through Embedded Polarization Neural Network EPNN:基于嵌入式偏振神经网络的水下成像增强方法 1 论文核心概念 本文提出了一种名为嵌入式偏振神经网络(Embedded Polarization Neural Network, EPNN) 的方法,用于显著提升水下…

基于单片机冷藏运输车环境检测/水产品运输环境检测设计

传送门 &#x1f449;&#x1f449;&#x1f449;&#x1f449;单片机作品题目速选一览表&#x1f680; &#x1f449;&#x1f449;&#x1f449;&#x1f449;单片机作品题目功能速览&#x1f680; &#x1f525;更多文章戳&#x1f449;小新单片机-CSDN博客&#x1f68…

基于STM32设计的人体健康监护系统(华为云IOT)_280

文章目录 一、前言 1.1 项目介绍 【1】项目开发背景 【2】设计实现的功能 【3】项目硬件模块组成 【4】设计意义 【5】国内外研究现状 【6】摘要 1.2 设计思路 1.3 系统功能总结 1.4 开发工具的选择 【1】设备端开发 【2】上位机开发 1.5 参考文献 1.6 系统框架图 1.7 系统原理…