用 import.meta.url 作为唯一标识打点统计模块初始化耗时最可靠:顶层同步打 start,导出入口打 end,measure 自动关联,校验后上报完整 url 上下文。

用 import.meta 标识模块边界,再结合 performance.mark() 打点,是统计子模块初始化耗时最干净、可追溯的方式。关键不在“怎么记”,而在于“在哪打”——必须确保标记发生在模块脚本执行的最早有效时机,且不被异步延迟或条件分支干扰。
在模块顶层同步打 mark,绑定 import.meta.url
每个模块在解析执行时,import.meta.url 是唯一、稳定、不可伪造的标识符。把它作为 mark 名称的基础,能天然避免命名冲突,也方便后续聚合分析。
- 在模块最顶部(无任何前置逻辑处)调用
performance.mark(`mod:${import.meta.url}#init_start`) - 若模块有默认导出函数或需等待 DOM 就绪,可在其执行入口再打一个
end标记,例如:performance.mark(`mod:${import.meta.url}#init_end`) - 不要用
import.meta.url.split('/').pop()等方式截取文件名——路径可能含 hash 或 query,截取后失去唯一性
用 measure 自动关联起止,支持跨模块依赖链
当模块 A 依赖模块 B,B 的初始化完成应早于 A 的初始化结束。用命名规范统一的 mark,就能让 performance.measure() 自动串起依赖耗时。
- 统一使用
mod:${import.meta.url}#init_start和mod:${import.meta.url}#init_end两个标记 - 在模块末尾调用:
performance.measure(`mod:${import.meta.url}#init`, `mod:${import.meta.url}#init_start`, `mod:${import.meta.url}#init_end`) - 这样生成的
PerformanceMeasure条目自带完整 URL 上下文,DevTools 的 Performance 面板中可直接按模块过滤
上报前做轻量清洗,避免污染和误报
模块加载可能因动态导入、缓存、预加载等产生重复执行或提前打点,需简单校验再上报。
- 检查
performance.getEntriesByName(`mod:${import.meta.url}#init_start`, 'mark').length === 1,否则跳过 measure - 用
performance.getEntriesByName(`mod:${import.meta.url}#init`, 'measure')获取结果,只取第一条(避免多次热更新导致重复) - 上报 payload 示例:
{ url: import.meta.url, duration: entry.duration, timestamp: entry.startTime }
配合构建工具注入自动埋点(可选进阶)
如果项目使用 Vite 或 Webpack,可在构建阶段自动为每个模块注入初始化计时代码,无需手动编写。
- Vite 插件中匹配
.js(x)?|.ts(x)?文件,在其内容开头插入performance.mark(...start),结尾插入measure调用 - 注意排除
node_modules和类型声明文件,防止污染第三方模块行为 - 该方式适合中大型项目统一管控,但调试期建议仍保留手写打点以便精准控制时机
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










