返回首页

开发技巧

分类:elysia
发布于:
阅读时间:14 分钟

在前端开发中,除了处理好 RPC 错误和类型安全,还有很多能显著提升代码质量性能可维护性的进阶技巧。

以下从四个维度为你梳理的实战方案:


1. 架构与逻辑解耦:逻辑抽离(Headless 思想)

不要把所有的 API 调用和数据处理都写在 .vue.tsx 文件里。

  • 技巧:使用 Custom Hooks (React)Composables (Vue)

  • 好处:组件只负责“怎么画”,逻辑函数负责“怎么做”。

  • 示例

    TypeScript

    // useHeroCards.ts (Composable)
    export function useHeroCards() {
      const cards = ref([]);
      const loading = ref(false);
    
      const fetchCards = async () => {
        loading.value = true;
        try {
          cards.value = await handleEden(rpc.api.get());
        } finally {
          loading.value = false;
        }
      };
    
      return { cards, loading, fetchCards };
    }
    

2. TypeScript 进阶:利用 satisfies 关键字

在 TS 4.9+ 中,satisfies 是神技。它既能校验类型,又能保留对象最原始、最精确的字面量类型。

  • 场景:定义配置对象或主题。

    TypeScript

    const config = {
      endpoint: "https://api.com",
      retries: 3
    } satisfies Record<string, string | number>;
    
    // 此时 config.retries 依然被精确推导为 number,而不是 string | number
    

3. 性能优化:防抖与节流的“原生化”

现在的开发中,不要到处引入 Lodash。

  • 技巧:利用 AbortController 优雅地取消请求。

  • 场景:用户连续点击搜索,或者在输入时快速触发请求。

    JavaScript

    let controller = new AbortController();
    
    const fetchData = async () => {
      controller.abort(); // 取消上一次未完成的请求
      controller = new AbortController();
    
      const res = await fetch(url, { signal: controller.signal });
    };
    

4. UI 交互体验:骨架屏与占位符

不要直接从“白屏”跳到“内容”,这会给用户带来视觉抖动(Layout Shift)。

  • 技巧:使用 Skeleton Screen 或 CSS aspect-ratio 预留空间。

  • 工具:如果你用 Tailwind,可以简单地用 animate-pulse 类快速实现骨架效果。


5. 调试神技:console.tablemonitorEvents

  • console.table(list):当你在 handleEden 拿到一个数组数据时,用 table 打印比直接 log 嵌套对象要清晰百倍。

  • monitorEvents(document.body, 'click'):在 Chrome 控制台直接输入,可以监控页面上所有的点击事件,找 Bug 极快。

6. 状态管理:从全局转向 URL

  • 技巧URL is the single source of truth.

  • 场景:分页、筛选、搜索关键字。

  • 做法:不要把这些存在 refstate 里,而是存在 URL 的 Query Parameter 中。这样用户刷新页面或分享链接时,页面状态能完美复原。


7. 安全防御:防御式编程

针对你之前关心的 error.message

  • 技巧:永远假设接口返回的数据结构会变。

  • 可选链 (?.)空值合并 (??) 是你的好伙伴,但不要滥用。在关键节点(如 handleEden)做断言,比在 UI 层到处写 if (data?.xxx) 要高效得多。


总结建议

你已经开始封装 handleEden 这种工具函数,这说明你正在从“写代码”向“写架构”转型。接下来的重点可以放在:

  1. 标准化:统一所有请求的 Loading、Error 处理。

  2. 自动化:根据后端 API 自动生成 TypeScript 定义。

你想深入了解哪一部分?比如如何利用 AbortController 结合你的 RPC 做自动请求取消?

一句话总结: 如果你希望 TS 帮你检查类型,但又不希望它把你的变量类型变模糊,那就用 satisfies