ReactJS 动态模板(例如用于 A/B 测试 Web 应用程序)

标签 reactjs

在 ReactJS 中拥有动态模板的最佳方式是什么,以便相同的布局组件可以根据某些 JSON 响应加载不同的模板(可以在本示例中进行模拟)?

最佳答案

有多种方法可以处理这个问题:

由于您使用的是react-router,您的路由可以包含包含a/b测试参数的信息,因此将为不同的A/B测试呈现不同的模板。

render((
  <Router>
    <Route path="/" component={App}>
      <Route path="/pricing-strategy-optimistic/products" component={OptimisticPricingPage}/>
      <Route path="/pricing-strategy-normative/products" component={NormativePricingPage}/>
      <Route path="*" component={NoMatch}/>
    </Route>
  </Router>
), document.body)

您的App组件将负责根据A/B测试确定要重定向到的路由,并相应地重定向到相关的嵌套路由。

但是,如果用户在社交网站上共享页面的 URL,则处理起来会有点棘手。可能不希望在 URL 中留下指示不同用户在各种上下文中呈现不同内容的指示。

出于这个原因,我通常不喜欢依赖 URL 进行 A/B 测试,而且如果测试经常更改,它会破坏书签。查询参数缓解了这个问题,但上述问题仍然存在。我更喜欢 url 作为标识页面的明确标识符 - 无论嵌入实体的具体细节如何变化。

另一个缺点是,不向用户显示的组件也会加载到页面中。如果应用程序很小,这通常不是问题,但对于较大的网站,这可能是优化的潜在范围。

可以说更好的策略是使用 webpack definePlugin通过 A/B 测试特定变量,这些变量将在构建时在代码中替换,创建多个构建,为同一组路由呈现不同的组件。

例如,如果您的代码包含:

if(PRICING_STRATEGY == 'optimistic')
    console.log('optimistic')
if(PRICING_STRATEGY == 'normative')
    console.log('normative')

将 PRICING_STRATEGY 定义为“乐观”的 Webpack 构建会将上述内容编译为:

if('optimistic' == 'optimistic')
    console.log('optimistic')
if('optimistic' == 'normative') 
  console.log('normative')

像 uglifyjs 这样的压缩器可以检测死代码并将上面的代码减少为:

console.log('optimistic')

这种方法当然必须通过一些额外的服务器端逻辑来增强,以确定将哪个 Assets 交付给用户。

关于ReactJS 动态模板(例如用于 A/B 测试 Web 应用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34230615/

相关文章:

reactjs - 是否可以永久编辑node_modules中的文件?

javascript - 如何使用 react-responsive-carousel 和 react-image-magnifiers 映射自定义缩略图的值?

javascript - React hooks - 从数组中删除多个对象并更新状态

javascript - 警告 : validateDOMNesting(. ..) : <body> cannot appear as a child of <div> in React. js

reactjs - React PropTypes.oneOf 指定枚举不起作用

javascript - React - 当按钮增加并在另一个页面中呈现结果时增加计数器的最佳方法?

javascript - 带有在 React 中导入的图像的 Particles.js

javascript - React - Axios 正在将未定义的文件数据发送到 Node 服务器

reactjs - 无法在 Vite list : resources/js/app. jsx 中找到文件。 (npm 运行构建)

reactjs - 无法确定如何在同一组件上使用 Redux 和 React-router