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

了解功能标志:简单指南

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

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]删除
最新教程 更多>
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在Silverlight应用程序中,尝试使用LINQ建立LINQ连接以错误而实现的数据库”,无法找到查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中...
    编程 发布于2025-04-17
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-04-17
  • 切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    编程 发布于2025-04-17
  • 如何配置Pytesseract以使用数字输出的单位数字识别?
    如何配置Pytesseract以使用数字输出的单位数字识别?
    Pytesseract OCR具有单位数字识别和仅数字约束 在pytesseract的上下文中,在配置tesseract以识别单位数字和限制单个数字和限制输出对数字可能会提出质疑。 To address this issue, we delve into the specifics of Te...
    编程 发布于2025-04-17
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-04-17
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-04-17
  • 如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    编程 发布于2025-04-17
  • 如何检查对象是否具有Python中的特定属性?
    如何检查对象是否具有Python中的特定属性?
    方法来确定对象属性存在寻求一种方法来验证对象中特定属性的存在。考虑以下示例,其中尝试访问不确定属性会引起错误: >>> a = someClass() >>> A.property Trackback(最近的最新电话): 文件“ ”,第1行, AttributeError: SomeClass...
    编程 发布于2025-04-17
  • Java字符串非空且非null的有效检查方法
    Java字符串非空且非null的有效检查方法
    检查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。isement(Isement() trim whitespace whitesp...
    编程 发布于2025-04-17
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-04-17
  • 哪种在JavaScript中声明多个变量的方法更可维护?
    哪种在JavaScript中声明多个变量的方法更可维护?
    在JavaScript中声明多个变量:探索两个方法在JavaScript中,开发人员经常遇到需要声明多个变量的需要。对此的两种常见方法是:在单独的行上声明每个变量: 当涉及性能时,这两种方法本质上都是等效的。但是,可维护性可能会有所不同。 第一个方法被认为更易于维护。每个声明都是其自己的语句,使其...
    编程 发布于2025-04-17
  • 正则表达式能否匹配嵌套括号,无需递归或平衡组?
    正则表达式能否匹配嵌套括号,无需递归或平衡组?
    在不使用递归或平衡群体的情况下可以将嵌套的支架与正则群体相匹配?在引人入胜的正则表达世界中,解析复杂性的复杂性是Suigns Suigns Sierpreme,匹配嵌套的架子的挑战,而无需辅助组成或平衡的小组佳肴。我们敢于征服这一复杂的追求,征服了以下方的坚定不移的深度,在一个通常依靠构造的领域中...
    编程 发布于2025-04-17
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法表示的字符串时,您可能会遇到错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && ...
    编程 发布于2025-04-17
  • 在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
    编程 发布于2025-04-17
  • 使用jQuery如何有效修改":after"伪元素的CSS属性?
    使用jQuery如何有效修改":after"伪元素的CSS属性?
    在jquery中了解伪元素的限制:访问“ selector 尝试修改“:”选择器的CSS属性时,您可能会遇到困难。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    编程 发布于2025-04-17

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

Copyright© 2022 湘ICP备2022001581号-3