”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 了解功能标志:简单指南

了解功能标志:简单指南

发布于2024-11-02
浏览:384

Understanding Feature Flags: A Simple Guide

构建软件时,快速发布新功能而不破坏任何内容可能很棘手。功能标志使这变得更容易。在阅读了 Vercel 的功能标志 SDK 后,我认为进一步研究功能标志并解释它们是什么、它们如何工作以及如何自己构建一个功能标志会很有帮助。

什么是功能标志?

功能标志(也称为功能切换)允许开发人员打开或关闭功能,而无需更改代码或重新部署应用程序。这意味着您可以:

  • 逐步发布功能:只让部分用户看到新功能,慢慢向所有人推出。
  • 在生产环境中测试新功能:您可以为自己或一小群测试人员启用该功能,而不需要将其提供给所有用户。
  • 快速回滚功能:如果新功能导致问题,您可以禁用它而无需重新部署。

使用功能标志,您可以控制用户何时可以访问功能,与部署代码的时间分开。

为什么要使用功能标志?

  1. 持续交付

    功能标志帮助团队更频繁地发布代码。您可以将未完成的工作合并到主代码库中,将其隐藏在标志后面,然后在不影响用户的情况下进行部署。

  2. A/B 测试

    您可以使用不同的用户组测试某个功能的两个版本,看看哪个版本性能更好。这有助于基于真实数据改善用户体验。

  3. 受控部署

    您可以向一小群用户发布一项功能,监控其性能,然后将其发布给其他所有人。

  4. 快速回滚

    如果出现问题,关闭功能标志比恢复代码更改要快得多,有助于保持应用程序稳定。

将 Next.js 中的功能标志与 Vercel 的 Flags SDK 结合使用

flags.ts(服务器端)

import { unstable_flag as flag } from "@vercel/flags/next";

export const showBanner = flag({
  key: "banner",
  decide: () => false,
});

决定函数确定标志的值,该值可以从各种来源提供,例如:

  • 环境变量
  • 其他功能标志提供商
  • Vercel 的 Edge Config(数据配置存储)
  • 数据库等

app/page.tsx

import { showBanner } from "../flags";

export default async function Page() {
  const banner = await showBanner();
  return (
    
{banner ? : null} {/* other components */}
); }

由于标志是函数,我们可以轻松地更改实现,而无需修改调用方的任何内容。这种灵活性使您的应用程序能够适应新的要求,而无需更改标志逻辑的核心结构。

如何构建您自己的功能标记系统

让我们构建一个简单的功能标记系统,您可以随着时间的推移对其进行改进。

第 1 步:创建用于检索功能标志的自定义挂钩

此步骤涉及创建一个自定义挂钩,该挂钩将允许您动态检索功能标志。您可以轻松地在 React 应用程序的任何部分重用此钩子来检查某个功能是否启用或禁用。

import { useState, useEffect } from 'react';

export const useFeatureFlag = (key: string): boolean => {
  const [isEnabled, setIsEnabled] = useState(false);

  useEffect(() => {
    const fetchFeatureFlag = async () => {
      try {
        const response = await fetch(`http://localhost:3001/api/feature-flags/${key}`);
        if (response.ok) {
          const data = await response.json();
          setIsEnabled(data.is_enabled);
        }
      } catch (error) {
        console.error('Failed to fetch feature flag:', error);
      }
    };

    fetchFeatureFlag();
  }, [key]);

  return isEnabled;
};

第2步:反应组件

接下来,创建一个组件,该组件使用自定义挂钩根据该标志是启用还是禁用来呈现不同的功能。这将使您的应用程序能够在新旧功能之间无缝切换,而不会对用户体验造成任何干扰。

import React from 'react';
import { useFeatureFlag } from './useFeatureFlag';

const FeatureFlaggedComponent: React.FC = () => {
  const isNewFeatureEnabled = useFeatureFlag('new-feature');

  return (
    

Feature Flag Example

{isNewFeatureEnabled ? (

New Feature

This is the new feature enabled by the feature flag.

) : (

Old Feature

This is the old feature displayed when the new feature is disabled.

)}
); }; export default FeatureFlaggedComponent;

市场上的其他功能标记解决方案

构建您自己的功能标记系统对于小型项目很有用,但如果您与更大的团队合作或需要更高级的控制,有几种工具提供功能标记作为服务:

  1. Vercel 功能标志

    Vercel 提供与其平台集成的功能标志,允许实时控制哪些用户看到哪些功能。

  2. 启动Darkly

    LaunchDarkly 是一种用于大规模管理功能标志的流行工具。它支持复杂的部署,根据位置或行为等属性定位用户。

  3. 优化

    优化专注于实验和 A/B 测试,使用功能标志来测试不同的功能并改善用户体验。

  4. Split.io

    Split.io 允许团队在不同功能版本之间划分流量并实时跟踪性能指标。

  5. Hypertune

Hypertune 是功能标记领域的新玩家,专注于高性能实验和功能切换。它使团队能够以最小的延迟运行复杂的实验,确保实时的性能洞察。 Hypertune 的独特方法将功能标记与机器学习模型相集成,从而可以在功能推出和用户定位方面做出更智能的决策。

结论

功能标志是安全发布功能、在生产中测试以及快速更改而无需重新部署代码的绝佳方式。您可以使用 JavaScript 构建一个简单的功能标记系统,或者针对大型项目使用 Vercel、LaunchDarkly 或 Optimizely 等更高级的工具。

使用功能标志将使您的开发过程更加灵活和高效,使您能够更快、更自信地交付新功能。

感谢您的阅读,欢迎留言分享您的意见!

版本声明 本文转载于:https://dev.to/ramk777stack/understanding-feature-flags-a-simple-guide-4on6?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-06-09
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-06-09
  • 在GO中构造SQL查询时,如何安全地加入文本和值?
    在GO中构造SQL查询时,如何安全地加入文本和值?
    在go中构造文本sql查询时,在go sql queries 中,在使用conting and contement和contement consem per时,尤其是在使用integer per当per当per时,per per per当per. [&​​&&&&&&&&&&&&&&&默元组方法在...
    编程 发布于2025-06-09
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    编程 发布于2025-06-09
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-06-09
  • 在C#中如何高效重复字符串字符用于缩进?
    在C#中如何高效重复字符串字符用于缩进?
    在基于项目的深度下固定字符串时,重复一个字符串以进行凹痕,很方便有效地有一种有效的方法来返回字符串重复指定的次数的字符串。使用指定的次数。 constructor 这将返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.Wr...
    编程 发布于2025-06-09
  • 切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    无法连接到mySQL数据库:故障排除错误消息要调试问题,建议将以下代码添加到文件的末尾.//config/database.php并查看输出: ... ... 回声'... echo '<pre>'; print_r($db['default']); echo '</pr...
    编程 发布于2025-06-09
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-06-09
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-06-09
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_rename() runkit_function_redefine() //重新定义'this'以返回“新和改...
    编程 发布于2025-06-09
  • 在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    mysql-python安装错误:“ mysql_config找不到”“ 由于缺少MySQL开发库而出现此错误。解决此问题,建议在Ubuntu上使用该分发的存储库。使用以下命令安装Python-MysqldB: sudo apt-get安装python-mysqldb sudo pip in...
    编程 发布于2025-06-09
  • 反射动态实现Go接口用于RPC方法探索
    反射动态实现Go接口用于RPC方法探索
    在GO 使用反射来实现定义RPC式方法的界面。例如,考虑一个接口,例如:键入myService接口{ 登录(用户名,密码字符串)(sessionId int,错误错误) helloworld(sessionid int)(hi String,错误错误) } 替代方案而不是依靠反射...
    编程 发布于2025-06-09
  • 将图片浮动到底部右侧并环绕文字的技巧
    将图片浮动到底部右侧并环绕文字的技巧
    在Web设计中围绕在Web设计中,有时可以将图像浮动到页面右下角,从而使文本围绕它缠绕。这可以在有效地展示图像的同时创建一个吸引人的视觉效果。 css位置在右下角,使用css float and clear properties: img { 浮点:对; ...
    编程 发布于2025-06-09

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3