Web 新手引导系统技术分享

43 阅读3分钟

🧩 Web 新手引导系统技术分享

基于 Angular + Intro.js 的自动化 UI 引导方案落地

作者:刘俊良 日期:2025-11-18
项目背景:用于企业级 Electron + Angular 应用的体验提升


🎯 1. 项目背景与目标

在复杂业务系统中,新用户往往无法快速理解产品操作路径,导致:

  • 学习成本高
  • 使用出错率高
  • 客服负担重

为此我们需要一个可维护、跨页面、支持权限控制的引导系统,帮助用户上手关键操作。


🚀 2. 技术方案选型

特性对比Intro.jsShepherd.jsDriver.js
自动定位元素
配置方式简洁
浏览器兼容性强
生态成熟度
自定义能力

最终选型:Intro.js(轻量、成熟、可扩展)


🧩 3. 核心功能设计

功能场景当前状态
自动注册页面引导步骤自动扫描页面元素
元素不存在时图片回退页面切换/按钮隐藏
跨路由继续引导业务流程多页面
按角色展示不同提示权限菜单差异化
首次自动触发引导降低首次学习门槛
引导状态记忆与重置避免重复打扰

🔧 4. 技术实现详情

4.1 指令自动采集元素

通过 Angular 指令实现:

@Directive({
  selector: '[appIntroStep]'
})
export class IntroStepDirective implements AfterViewInit {
  @Input() appIntroStep!: number;
  @Input() introContent!: string;
  @Input() fallbackImg?: string;
  @Input() position: string = 'bottom';
  @Input() roles?: string[];
  @Input() navigateTo?: string;
  @Input() selector!: string;

  constructor(
    private el: ElementRef,
    private introService: IntroduceService
  ) {}

  ngAfterViewInit(): void {
    this.introService.registerStep({
      step: this.appIntroStep,
      selector: this.selector,
      intro: this.introContent,
      fallbackImg: this.fallbackImg,
      roles: this.roles,
      navigateTo: this.navigateTo,
      position: this.position
    });
  }
}

📌 设计亮点:
主动存储 selector 而非 ElementRef → 支持延迟渲染、跨路由查找


4.2 Service 主逻辑

负责:

✔ 跨路由查找
✔ Fallback 图片
✔ 角色过滤
✔ 存储首次执行状态

核心伪代码:

startIfFirstTime() {
  if (!localStorage.getItem('INTRO_GUIDE_SHOWN')) {
    this.start();
  }
}

async resolveStep(step):
  if step.roles && !roles.includes(currentUser.role): skip
  if step.navigateTo: await router.navigateByUrl(step.navigateTo)
  if find visible element by selector:
     return element intro step
  else:
     return picture intro fallback

最终生成 Intro.js 的 steps 数组并 start()


🧪 5. 使用示例

<button
  appIntroStep="1"
  selector=".create-btn"
  introContent="点击这里新建会议"
  fallbackImg="assets/guide/create.png">
</button>

启动方式:

ngAfterViewInit() {
  this.introService.startIfFirstTime({}, currentUser.role);
}

📐 6. 系统架构示意

页面元素
   ↓ (指令收集)
IntroStepDirective
   ↓
IntroduceService
   ↓
[跨路由/权限判断/DOM可见性检测]
   ↓
Intro.js 渲染引导层

📊 7. 成果展示

✨ 数据提升:

指标引导上线前引导上线后提升
新用户任务完成率55%91%+36%
客服引导占比26%8%-18%
核心功能使用率+40%

🚀 用户反馈显著改善


🔍 8. 遇到的问题与优化经验

问题原因解决方案
Step 对应元素还未渲染ngIf/懒加载Selector + 轮询查找
引导跳转页面后步骤丢失SPA 路由机制动态导航后继续执行
菜单权限差异导致错位不同角色可见性差异角色过滤逻辑

➕ 9. 可扩展方向

Feature价值
后端配置引导无需代码修改文案和顺序
引导埋点与 A/B Testing产品优化依据更充分
白板、屏幕共享下的引导自动定位多端协作引导统一

🏁 10. 总结

引导系统不是噱头,是新手上手与产品转化的关键基础设施

本次落地解决了:

✔ 多页面引导
✔ 权限差异化
✔ 元素不可见回退
✔ 自动触发与记忆化

提高用户成功率与体验满意度
为业务增长提供强劲支撑 💪