来源:互联网 更新时间:2026-06-16 13:51
export interface RequestInceptor2. **具体实现** 每个RequestInceptor都是一个函数,根据环境返回不同的处理逻辑:> { (): { nodeEnv: (config: T, runtimeConfig?: RunTimeConfig) => Promise | T; clientEnv: (config: T, runtimeConfig?: Pick ) => Promise | T; }; }
const h5CommonHeaders: RequestInceptor = () => ({
nodeEnv: config => {
config.headers['reqEnv'] = 'node';
return config;
},
clientEnv: async config => {
config.headers['appid_org'] = 'wxapp';
return config;
},
});
const yunDunSDK: RequestInceptor = () => ({
nodeEnv: config => config,
clientEnv: async config => {
await yunDunLoad;
return config;
},
});
3. **inceptorsLoader和requestInceptorsCreator**
`inceptorsLoader`接收初始配置和拦截器数组,按顺序依次处理;`requestInceptorsCreator`是工厂函数,组合常见的拦截器。
const inceptorsLoader = async (initialConfig, inceptors) => {
const promiseList = map(inceptors, interceptor => {
return async config => {
const { nodeEnv, clientEnv } = interceptor();
if (isInWindow) {
return clientEnv(config, config?.runTimeConfig);
} else {
return nodeEnv(config, config?.runTimeConfig);
}
};
});
const promiseListResult = await promiseList.reduce((promise, fn) =>
promise.then(config => fn(config)), Promise.resolve(initialConfig));
return promiseListResult;
};
export const requestInceptorsCreator = config =>
inceptorsLoader(config, [
h5CommonHeaders,
yunDunSDK,
]);
4. **使用方式**
通过工厂函数,灵活添加、删除或修改拦截器,保证特定顺序执行。调用时传入初始配置,得到优化后的请求配置,然后传给HTTP客户端(如axios)发起请求。
const generateTrackConfig = (trackSend) => {
return function createTrackConfig() {
const names = trackSend.map(item => item.name);
const extractEventData = (current) => {
const nameSplit = current.split('_');
const [page, block] = nameSplit.slice(-2);
const isBlockTypePresent = /\d+/.test(page);
const event = nameSplit.slice(0, isBlockTypePresent ? -2 : -1).join('_');
return { event, current_page: isBlockTypePresent ? page : block, block_type: isBlockTypePresent ? block : '' };
};
return names.reduce((total, current) => {
const eventData = extractEventData(current);
total[current] = (platform, { transParams }) => createEventObject(eventData, platform, transParams);
return total;
}, {});
};
};
2. `useProTrack`函数核心代码:
export const useProTrack = (
{ props, functionalRef },
trackSendProps
) => {
useWithReactFunctionalTrack({
functionalRef: functionalRef,
functionalProps: functionalPropsRef.current,
useEffect,
createTrackConfig: generateTrackConfig(trackSendRef.current),
});
useEffect(() => {
ObserveTrackRef.current = new IntersectionObserver(handleIntersection);
return () => { ObserveTrackRef.current?.disconnect(); };
}, []);
const trackFuncMemo = useMemo(() => {
return trackSendRef.current.reduce((result, item) => {
result[item.name] = (trackParams, options) => {
if (!options?.ele) {
track(item.name)(trackParams);
return;
}
const { ele } = options;
startToObserveMap.current[item.name]();
};
return result;
}, {});
}, []);
return trackFuncMemo;
};
**埋点Hook应用层**
1. 从埋点任务中复制埋点名,不要手动拼写:
2. 组件内引用useProTrack并注册埋点名:
const proTrack = useProTrack({ props, functionalRef }, [
{ name: 'trackEvent_1234' },
{ name: 'trackEvent_2345' },
]);
3. 主动上报例子:
proTrack.trackEvent_1234({
button_title: '我知道了',
});
埋点名会有完整类型提示。
4. 曝光上报例子:
在HTML元素的ref钩子中注册,语法相比主动曝光多了一个配置。 **重构收益** - 节省前端工时,减少心智负担:无需手动配置trackConfig文件,无需感知/调用埋点SDK内部 - 减少流程,避免埋点验证返工:复制埋点系统埋点名即可创建函数,不再担心event/current_page/block_type写错,TS类型提示完备trackFn?.trackEvent_1234_3210({ trade_type_list: tradeTypeListStr, }, { ele })}>
《Off Campus》第二季官宣:这对CP还在,但不再是主角
和平精英如何做到压枪稳-和平精英怎样才能压枪稳
客单价碾压宝马奥迪!极氪5月交付新车34377辆:连续4个月双增长
HBO 奇幻剧《龙之家族》第三季定档 6 月 22 日,最终预告片曝光喉道海战
DOTA2 TI时隔七年重返上海!门票6月10日开抢,国服享受优先购买!
网络热词聊污是什么意思
帅气继父网名女生可爱英文(精选100个)
抖音最火沙雕男生网名(精选100个)
蒙古上单是什么梗
帅到极致的网名女生霸气(精选100个)
韦一敏是什么梗
作家助手如何上传自制封面 作家助手如何设置小说的封面
免费看电影的软件推荐
金铲铲之战s17六暗星卡莎阵容玩法构筑指南
因空难被判“过失杀人罪” 空客、法航均被顶格处罚22.5万欧元
SpaceX狂揽AI人才,马斯克亲自面试且不看简历背景
阿里发布Qwen3.7-Max大模型,全球第五、国产第一
网石18禁MMO《RAVEN2:渡鸦》大型更新推出全新职业“军阀”
有寓意的易经网名男生(精选100个)
韩漫小少爷网名大全女生(精选100个)
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc