customer-chat-sdk 1.0.65 → 1.0.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScreenshotManager.d.ts","sourceRoot":"","sources":["../../src/core/ScreenshotManager.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAA;IACtC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,mBAAmB,GAAG,SAAS,GAAG,aAAa,CAAA;IACxD,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,cAAc,GAAG,QAAQ,GAAG,YAAY,CAAA;IAC3F,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,aAAa,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;IACvC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;CACjB;AA4BD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAyH;IACxI,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,kBAAkB,CAAI;IAC9B,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,SAAS,CAAQ;IAGzB,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,mBAAmB,CAA4B;IACvD,OAAO,CAAC,oBAAoB,CAAqC;IAGjE,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,eAAe,CAA8B;IAGrD,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,qBAAqB,CAAY;IACzC,OAAO,CAAC,aAAa,CAAe;IAGpC,OAAO,CAAC,sBAAsB,CAAQ;IAGtC,OAAO,CAAC,eAAe,CAAqE;IAC5F,OAAO,CAAC,iBAAiB,CAAQ;IAGjC,OAAO,CAAC,cAAc,CAA8D;IAGpF,OAAO,CAAC,eAAe,CAAsB;IAG7C,OAAO,CAAC,eAAe,CAA8B;IAGrD,OAAO,CAAC,eAAe,CAA4D;IAGnF,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,cAAc,CAAQ;IAG9B,OAAO,CAAC,oBAAoB,CAAoC;IAChE,OAAO,CAAC,oBAAoB,CAAyB;IAGrD,OAAO,CAAC,YAAY,CAAQ;IAG5B,OAAO,CAAC,kBAAkB,CAAqC;IAC/D,OAAO,CAAC,eAAe,CAAoB;IAC3C,OAAO,CAAC,2BAA2B,CAAI;IAGvC,OAAO,CAAC,kBAAkB,CAA6C;IACvE,OAAO,CAAC,sBAAsB,CAAwD;gBAE1E,aAAa,EAAE,WAAW,GAAG,IAAI,EAAE,OAAO,GAAE,iBAAsB,EAAE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI;IAqElH;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAsBnD;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAgE5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACH,OAAO,CAAC,6BAA6B;IAcrC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA6F3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8BzB;;OAEG;IACH,eAAe,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"ScreenshotManager.d.ts","sourceRoot":"","sources":["../../src/core/ScreenshotManager.ts"],"names":[],"mappings":"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"}
|
package/dist/customer-sdk.cjs.js
CHANGED
|
@@ -14683,12 +14683,18 @@ class ScreenshotManager {
|
|
|
14683
14683
|
// 这样可以避免 setInterval 不等待异步完成的问题
|
|
14684
14684
|
const scheduleNext = async () => {
|
|
14685
14685
|
if (this.isRunning && this.isEnabled && !document.hidden) {
|
|
14686
|
+
// 记录定时开始时间
|
|
14687
|
+
const scheduleStartTime = performance.now();
|
|
14688
|
+
if (!this.options.silentMode) {
|
|
14689
|
+
console.log(`📸 [定时开始] 开始新一轮截图任务`);
|
|
14690
|
+
}
|
|
14686
14691
|
try {
|
|
14687
|
-
await this.takeScreenshot();
|
|
14692
|
+
await this.takeScreenshot(scheduleStartTime);
|
|
14688
14693
|
// 如果配置了二进制模式,发送二进制数据
|
|
14689
14694
|
// 注意:如果启用了压缩,会在 Worker 压缩完成后自动发送(在 onmessage 中处理)
|
|
14690
14695
|
// 如果没有启用压缩,立即发送
|
|
14691
14696
|
if (this.currentBinaryConfig && !this.options.compress) {
|
|
14697
|
+
const sendStartTime = performance.now();
|
|
14692
14698
|
const latestScreenshot = this.getLatestScreenshot();
|
|
14693
14699
|
if (latestScreenshot) {
|
|
14694
14700
|
try {
|
|
@@ -14696,14 +14702,20 @@ class ScreenshotManager {
|
|
|
14696
14702
|
const base64Data = latestScreenshot.split(',')[1] || '';
|
|
14697
14703
|
const base64Size = base64Data.length;
|
|
14698
14704
|
// 将截图转换为 ArrayBuffer
|
|
14705
|
+
const convertStartTime = performance.now();
|
|
14699
14706
|
const imageBuffer = this.dataUrlToArrayBuffer(latestScreenshot);
|
|
14700
14707
|
const imageBufferSize = imageBuffer.byteLength;
|
|
14708
|
+
const convertTime = performance.now() - convertStartTime;
|
|
14701
14709
|
// 构建配置的二进制结构
|
|
14710
|
+
const buildConfigStartTime = performance.now();
|
|
14702
14711
|
const configBuffer = this.buildBinaryConfig(this.currentBinaryConfig);
|
|
14703
14712
|
const configBufferSize = configBuffer.byteLength;
|
|
14713
|
+
const buildConfigTime = performance.now() - buildConfigStartTime;
|
|
14704
14714
|
// 合并配置字节和图片字节(配置在前)
|
|
14715
|
+
const combineStartTime = performance.now();
|
|
14705
14716
|
const combinedBuffer = this.combineBinaryData(configBuffer, imageBuffer);
|
|
14706
14717
|
const combinedBufferSize = combinedBuffer.byteLength;
|
|
14718
|
+
const combineTime = performance.now() - combineStartTime;
|
|
14707
14719
|
// 打印大小信息
|
|
14708
14720
|
if (!this.options.silentMode) {
|
|
14709
14721
|
console.log('📸 [轮询-大小统计]');
|
|
@@ -14711,16 +14723,26 @@ class ScreenshotManager {
|
|
|
14711
14723
|
console.log(` 图片字节大小: ${(imageBufferSize / 1024).toFixed(2)} KB (${imageBufferSize} 字节)`);
|
|
14712
14724
|
console.log(` 配置字节大小: ${configBufferSize} 字节`);
|
|
14713
14725
|
console.log(` 拼接后总大小: ${(combinedBufferSize / 1024).toFixed(2)} KB (${combinedBufferSize} 字节)`);
|
|
14726
|
+
console.log(` ⏱️ 数据转换耗时: ${convertTime.toFixed(2)}ms`);
|
|
14727
|
+
console.log(` ⏱️ 构建配置耗时: ${buildConfigTime.toFixed(2)}ms`);
|
|
14728
|
+
console.log(` ⏱️ 合并数据耗时: ${combineTime.toFixed(2)}ms`);
|
|
14714
14729
|
}
|
|
14715
14730
|
// 发送二进制数据到 iframe
|
|
14716
14731
|
if (this.sendToIframeCallback) {
|
|
14732
|
+
const sendCallbackStartTime = performance.now();
|
|
14717
14733
|
const message = {
|
|
14718
14734
|
type: 'screenshotBinary',
|
|
14719
14735
|
data: combinedBuffer
|
|
14720
14736
|
};
|
|
14721
14737
|
this.sendToIframeCallback(message);
|
|
14738
|
+
const sendCallbackTime = performance.now() - sendCallbackStartTime;
|
|
14739
|
+
const totalSendTime = performance.now() - sendStartTime;
|
|
14740
|
+
const totalTime = performance.now() - scheduleStartTime;
|
|
14722
14741
|
if (!this.options.silentMode) {
|
|
14723
14742
|
console.log('📸 [轮询] ✅ 二进制数据已发送到 iframe');
|
|
14743
|
+
console.log(` ⏱️ 发送回调耗时: ${sendCallbackTime.toFixed(2)}ms`);
|
|
14744
|
+
console.log(` ⏱️ 发送阶段总耗时: ${totalSendTime.toFixed(2)}ms`);
|
|
14745
|
+
console.log(` ⏱️ 从定时开始到发送完成总耗时: ${totalTime.toFixed(2)}ms`);
|
|
14724
14746
|
}
|
|
14725
14747
|
}
|
|
14726
14748
|
}
|
|
@@ -14780,25 +14802,41 @@ class ScreenshotManager {
|
|
|
14780
14802
|
/**
|
|
14781
14803
|
* 执行截图
|
|
14782
14804
|
*/
|
|
14783
|
-
async takeScreenshot() {
|
|
14805
|
+
async takeScreenshot(scheduleStartTime) {
|
|
14784
14806
|
if (!this.targetElement) {
|
|
14785
14807
|
console.warn('📸 目标元素不存在');
|
|
14786
14808
|
return false;
|
|
14787
14809
|
}
|
|
14810
|
+
// 记录截图开始时间
|
|
14811
|
+
const screenshotStartTime = performance.now();
|
|
14788
14812
|
this.setupGlobalErrorHandlers();
|
|
14789
14813
|
try {
|
|
14790
14814
|
if (!this.options.silentMode) {
|
|
14791
14815
|
console.log(`📸 开始截图 #${this.screenshotCount + 1}...`);
|
|
14816
|
+
if (scheduleStartTime) {
|
|
14817
|
+
const waitTime = screenshotStartTime - scheduleStartTime;
|
|
14818
|
+
console.log(` ⏱️ 定时到截图开始耗时: ${waitTime.toFixed(2)}ms`);
|
|
14819
|
+
}
|
|
14792
14820
|
}
|
|
14793
14821
|
// 等待 CSS 和字体加载完成
|
|
14822
|
+
const waitStylesStartTime = performance.now();
|
|
14794
14823
|
await Promise.all([
|
|
14795
14824
|
this.waitForStylesAndFonts(),
|
|
14796
14825
|
this.waitForFonts()
|
|
14797
14826
|
]);
|
|
14827
|
+
const waitStylesTime = performance.now() - waitStylesStartTime;
|
|
14828
|
+
if (!this.options.silentMode) {
|
|
14829
|
+
console.log(` ⏱️ 等待样式和字体加载耗时: ${waitStylesTime.toFixed(2)}ms`);
|
|
14830
|
+
}
|
|
14798
14831
|
// 等待元素完全渲染(特别是对于 modern-screenshot)
|
|
14832
|
+
const waitRenderStartTime = performance.now();
|
|
14799
14833
|
await new Promise(resolve => requestAnimationFrame(() => {
|
|
14800
14834
|
requestAnimationFrame(() => resolve());
|
|
14801
14835
|
}));
|
|
14836
|
+
const waitRenderTime = performance.now() - waitRenderStartTime;
|
|
14837
|
+
if (!this.options.silentMode) {
|
|
14838
|
+
console.log(` ⏱️ 等待渲染完成耗时: ${waitRenderTime.toFixed(2)}ms`);
|
|
14839
|
+
}
|
|
14802
14840
|
// 选择截图引擎
|
|
14803
14841
|
const selectedEngine = this.options.engine || 'modern-screenshot';
|
|
14804
14842
|
if (!this.options.silentMode) {
|
|
@@ -14825,6 +14863,7 @@ class ScreenshotManager {
|
|
|
14825
14863
|
}
|
|
14826
14864
|
let dataUrl;
|
|
14827
14865
|
// 根据选择的引擎进行截图
|
|
14866
|
+
const engineStartTime = performance.now();
|
|
14828
14867
|
if (selectedEngine === 'html2canvas') {
|
|
14829
14868
|
// html2canvas 需要更长的等待时间确保样式加载
|
|
14830
14869
|
// 额外等待样式和字体加载完成
|
|
@@ -14847,6 +14886,10 @@ class ScreenshotManager {
|
|
|
14847
14886
|
await new Promise(resolve => setTimeout(resolve, 50));
|
|
14848
14887
|
dataUrl = await this.takeScreenshotWithModernScreenshot(this.targetElement);
|
|
14849
14888
|
}
|
|
14889
|
+
const engineTime = performance.now() - engineStartTime;
|
|
14890
|
+
if (!this.options.silentMode) {
|
|
14891
|
+
console.log(` ⏱️ 截图引擎执行耗时: ${engineTime.toFixed(2)}ms`);
|
|
14892
|
+
}
|
|
14850
14893
|
const timestamp = Date.now();
|
|
14851
14894
|
// 更新状态
|
|
14852
14895
|
this.screenshotCount++;
|
|
@@ -14880,6 +14923,8 @@ class ScreenshotManager {
|
|
|
14880
14923
|
break;
|
|
14881
14924
|
}
|
|
14882
14925
|
}
|
|
14926
|
+
// 计算截图总耗时
|
|
14927
|
+
const screenshotTotalTime = performance.now() - screenshotStartTime;
|
|
14883
14928
|
// 打印基本信息
|
|
14884
14929
|
const base64Data = dataUrl.split(',')[1] || '';
|
|
14885
14930
|
if (!this.options.silentMode) {
|
|
@@ -14888,6 +14933,7 @@ class ScreenshotManager {
|
|
|
14888
14933
|
console.log(`📸 时间: ${new Date(timestamp).toLocaleTimeString()}`);
|
|
14889
14934
|
console.log(`📸 原始大小: ${Math.round(base64Data.length * 0.75 / 1024)} KB`);
|
|
14890
14935
|
console.log(`📸 Base64 长度: ${base64Data.length} 字符`);
|
|
14936
|
+
console.log(` ⏱️ 截图总耗时: ${screenshotTotalTime.toFixed(2)}ms`);
|
|
14891
14937
|
// 完整打印压缩前的 base64
|
|
14892
14938
|
console.log(`📸 [压缩前] 完整 Base64:`);
|
|
14893
14939
|
console.log(base64Data);
|
|
@@ -14910,12 +14956,16 @@ class ScreenshotManager {
|
|
|
14910
14956
|
}
|
|
14911
14957
|
}
|
|
14912
14958
|
if (this.worker) {
|
|
14959
|
+
// 记录压缩开始时间
|
|
14960
|
+
const compressStartTime = performance.now();
|
|
14913
14961
|
if (!this.options.silentMode) {
|
|
14914
14962
|
console.log('📸 发送到 WebWorker 进行压缩...');
|
|
14915
14963
|
}
|
|
14916
14964
|
// 保存原始 dataUrl 用于后续对比(在 Worker 压缩完成后)
|
|
14917
14965
|
// 注意:此时 screenshotHistory 中已经保存了原始的 dataUrl
|
|
14918
14966
|
const originalDataUrlForCompression = dataUrl;
|
|
14967
|
+
this.worker.__compressStartTime = compressStartTime;
|
|
14968
|
+
this.worker.__scheduleStartTime = scheduleStartTime;
|
|
14919
14969
|
this.worker.postMessage({
|
|
14920
14970
|
type: 'COMPRESS_IMAGE',
|
|
14921
14971
|
data: {
|
|
@@ -15207,8 +15257,12 @@ class ScreenshotManager {
|
|
|
15207
15257
|
const options = {
|
|
15208
15258
|
// 基本配置
|
|
15209
15259
|
backgroundColor: '#ffffff',
|
|
15210
|
-
//
|
|
15211
|
-
|
|
15260
|
+
// 缩放比例:用户配置优先,否则使用默认值(移动设备 0.5,桌面设备 0.6)
|
|
15261
|
+
// scale 越大越清晰,但文件也越大
|
|
15262
|
+
// 1.0 = 原始分辨率,2.0 = 2倍分辨率(超清晰)
|
|
15263
|
+
scale: this.options.scale !== undefined
|
|
15264
|
+
? this.options.scale // 用户明确配置了 scale(包括 1.0),使用用户配置
|
|
15265
|
+
: (isMobile ? 0.5 : 0.6), // 用户未配置,使用默认值
|
|
15212
15266
|
useCORS: this.options.enableCORS,
|
|
15213
15267
|
allowTaint: !this.options.enableCORS, // 如果启用 CORS,不允许 taint
|
|
15214
15268
|
logging: !this.options.silentMode,
|
|
@@ -17048,6 +17102,11 @@ class ScreenshotManager {
|
|
|
17048
17102
|
const { type, data } = e.data;
|
|
17049
17103
|
if (type === 'SCREENSHOT_RESULT' && data?.compressed) {
|
|
17050
17104
|
const compressed = data.compressed;
|
|
17105
|
+
const compressEndTime = performance.now();
|
|
17106
|
+
// 获取压缩开始时间
|
|
17107
|
+
const compressStartTime = newWorker.__compressStartTime || compressEndTime;
|
|
17108
|
+
const scheduleStartTime = newWorker.__scheduleStartTime;
|
|
17109
|
+
const compressTime = compressEndTime - compressStartTime;
|
|
17051
17110
|
// 获取压缩前的原始数据
|
|
17052
17111
|
// 从 screenshotHistory 中获取(在发送到 Worker 之前已经保存了原始数据)
|
|
17053
17112
|
const originalDataUrl = this.screenshotHistory.length > 0
|
|
@@ -17066,6 +17125,7 @@ class ScreenshotManager {
|
|
|
17066
17125
|
// 压缩失败,使用原始数据
|
|
17067
17126
|
console.warn('📸 [Worker 压缩] ⚠️ 压缩失败,使用原始截图');
|
|
17068
17127
|
console.warn(` ⚠️ 错误: ${compressed.error}`);
|
|
17128
|
+
console.log(` ⏱️ Worker 压缩耗时: ${compressTime.toFixed(2)}ms`);
|
|
17069
17129
|
console.log(`📸 [压缩前] Base64 长度: ${originalBase64.length} 字符`);
|
|
17070
17130
|
console.log(`📸 [压缩前] 完整 Base64:`);
|
|
17071
17131
|
console.log(originalBase64);
|
|
@@ -17081,6 +17141,7 @@ class ScreenshotManager {
|
|
|
17081
17141
|
console.log(` 原始大小: ${originalKB} KB`);
|
|
17082
17142
|
console.log(` 压缩后: ${compressedKB} KB`);
|
|
17083
17143
|
console.log(` 压缩率: ${ratio}%`);
|
|
17144
|
+
console.log(` ⏱️ Worker 压缩耗时: ${compressTime.toFixed(2)}ms`);
|
|
17084
17145
|
// 完整打印压缩前后的 base64 对比
|
|
17085
17146
|
console.log(`📸 [压缩前] Base64 长度: ${originalBase64.length} 字符`);
|
|
17086
17147
|
console.log(`📸 [压缩前] 完整 Base64:`);
|
|
@@ -17096,7 +17157,7 @@ class ScreenshotManager {
|
|
|
17096
17157
|
}
|
|
17097
17158
|
// 压缩完成后(无论成功或失败),如果配置了二进制模式,发送数据到 iframe
|
|
17098
17159
|
if (this.currentBinaryConfig && compressed.dataUrl) {
|
|
17099
|
-
this.sendCompressedScreenshotToIframe(compressed.dataUrl);
|
|
17160
|
+
this.sendCompressedScreenshotToIframe(compressed.dataUrl, scheduleStartTime, compressEndTime);
|
|
17100
17161
|
}
|
|
17101
17162
|
}
|
|
17102
17163
|
}
|
|
@@ -17386,10 +17447,11 @@ class ScreenshotManager {
|
|
|
17386
17447
|
/**
|
|
17387
17448
|
* 发送压缩后的截图到 iframe
|
|
17388
17449
|
*/
|
|
17389
|
-
sendCompressedScreenshotToIframe(dataUrl) {
|
|
17450
|
+
sendCompressedScreenshotToIframe(dataUrl, scheduleStartTime, compressEndTime) {
|
|
17390
17451
|
if (!this.currentBinaryConfig || !this.sendToIframeCallback) {
|
|
17391
17452
|
return;
|
|
17392
17453
|
}
|
|
17454
|
+
const sendStartTime = performance.now();
|
|
17393
17455
|
try {
|
|
17394
17456
|
// 计算 base64 大小
|
|
17395
17457
|
const base64Data = dataUrl.split(',')[1] || '';
|
|
@@ -17404,14 +17466,20 @@ class ScreenshotManager {
|
|
|
17404
17466
|
console.log(dataUrl);
|
|
17405
17467
|
}
|
|
17406
17468
|
// 将截图转换为 ArrayBuffer
|
|
17469
|
+
const convertStartTime = performance.now();
|
|
17407
17470
|
const imageBuffer = this.dataUrlToArrayBuffer(dataUrl);
|
|
17408
17471
|
const imageBufferSize = imageBuffer.byteLength;
|
|
17472
|
+
const convertTime = performance.now() - convertStartTime;
|
|
17409
17473
|
// 构建配置的二进制结构
|
|
17474
|
+
const buildConfigStartTime = performance.now();
|
|
17410
17475
|
const configBuffer = this.buildBinaryConfig(this.currentBinaryConfig);
|
|
17411
17476
|
const configBufferSize = configBuffer.byteLength;
|
|
17477
|
+
const buildConfigTime = performance.now() - buildConfigStartTime;
|
|
17412
17478
|
// 合并配置字节和图片字节(配置在前)
|
|
17479
|
+
const combineStartTime = performance.now();
|
|
17413
17480
|
const combinedBuffer = this.combineBinaryData(configBuffer, imageBuffer);
|
|
17414
17481
|
const combinedBufferSize = combinedBuffer.byteLength;
|
|
17482
|
+
const combineTime = performance.now() - combineStartTime;
|
|
17415
17483
|
// 打印大小信息
|
|
17416
17484
|
if (!this.options.silentMode) {
|
|
17417
17485
|
console.log('📸 [压缩后-大小统计]');
|
|
@@ -17419,15 +17487,34 @@ class ScreenshotManager {
|
|
|
17419
17487
|
console.log(` 图片字节大小: ${(imageBufferSize / 1024).toFixed(2)} KB (${imageBufferSize} 字节)`);
|
|
17420
17488
|
console.log(` 配置字节大小: ${configBufferSize} 字节`);
|
|
17421
17489
|
console.log(` 拼接后总大小: ${(combinedBufferSize / 1024).toFixed(2)} KB (${combinedBufferSize} 字节)`);
|
|
17490
|
+
console.log(` ⏱️ 数据转换耗时: ${convertTime.toFixed(2)}ms`);
|
|
17491
|
+
console.log(` ⏱️ 构建配置耗时: ${buildConfigTime.toFixed(2)}ms`);
|
|
17492
|
+
console.log(` ⏱️ 合并数据耗时: ${combineTime.toFixed(2)}ms`);
|
|
17422
17493
|
}
|
|
17423
17494
|
// 发送二进制数据到 iframe
|
|
17495
|
+
const sendCallbackStartTime = performance.now();
|
|
17424
17496
|
const message = {
|
|
17425
17497
|
type: 'screenshotBinary',
|
|
17426
17498
|
data: combinedBuffer
|
|
17427
17499
|
};
|
|
17428
17500
|
this.sendToIframeCallback(message);
|
|
17501
|
+
const sendCallbackTime = performance.now() - sendCallbackStartTime;
|
|
17502
|
+
const totalSendTime = performance.now() - sendStartTime;
|
|
17503
|
+
let totalTime = 0;
|
|
17504
|
+
if (scheduleStartTime) {
|
|
17505
|
+
totalTime = performance.now() - scheduleStartTime;
|
|
17506
|
+
}
|
|
17429
17507
|
if (!this.options.silentMode) {
|
|
17430
17508
|
console.log('📸 [压缩后] ✅ 二进制数据已发送到 iframe');
|
|
17509
|
+
console.log(` ⏱️ 发送回调耗时: ${sendCallbackTime.toFixed(2)}ms`);
|
|
17510
|
+
console.log(` ⏱️ 发送阶段总耗时: ${totalSendTime.toFixed(2)}ms`);
|
|
17511
|
+
if (scheduleStartTime) {
|
|
17512
|
+
console.log(` ⏱️ 从定时开始到发送完成总耗时: ${totalTime.toFixed(2)}ms`);
|
|
17513
|
+
if (compressEndTime) {
|
|
17514
|
+
const compressToSendTime = sendStartTime - compressEndTime;
|
|
17515
|
+
console.log(` ⏱️ 压缩完成到发送开始耗时: ${compressToSendTime.toFixed(2)}ms`);
|
|
17516
|
+
}
|
|
17517
|
+
}
|
|
17431
17518
|
}
|
|
17432
17519
|
}
|
|
17433
17520
|
catch (error) {
|
package/dist/customer-sdk.esm.js
CHANGED
|
@@ -14679,12 +14679,18 @@ class ScreenshotManager {
|
|
|
14679
14679
|
// 这样可以避免 setInterval 不等待异步完成的问题
|
|
14680
14680
|
const scheduleNext = async () => {
|
|
14681
14681
|
if (this.isRunning && this.isEnabled && !document.hidden) {
|
|
14682
|
+
// 记录定时开始时间
|
|
14683
|
+
const scheduleStartTime = performance.now();
|
|
14684
|
+
if (!this.options.silentMode) {
|
|
14685
|
+
console.log(`📸 [定时开始] 开始新一轮截图任务`);
|
|
14686
|
+
}
|
|
14682
14687
|
try {
|
|
14683
|
-
await this.takeScreenshot();
|
|
14688
|
+
await this.takeScreenshot(scheduleStartTime);
|
|
14684
14689
|
// 如果配置了二进制模式,发送二进制数据
|
|
14685
14690
|
// 注意:如果启用了压缩,会在 Worker 压缩完成后自动发送(在 onmessage 中处理)
|
|
14686
14691
|
// 如果没有启用压缩,立即发送
|
|
14687
14692
|
if (this.currentBinaryConfig && !this.options.compress) {
|
|
14693
|
+
const sendStartTime = performance.now();
|
|
14688
14694
|
const latestScreenshot = this.getLatestScreenshot();
|
|
14689
14695
|
if (latestScreenshot) {
|
|
14690
14696
|
try {
|
|
@@ -14692,14 +14698,20 @@ class ScreenshotManager {
|
|
|
14692
14698
|
const base64Data = latestScreenshot.split(',')[1] || '';
|
|
14693
14699
|
const base64Size = base64Data.length;
|
|
14694
14700
|
// 将截图转换为 ArrayBuffer
|
|
14701
|
+
const convertStartTime = performance.now();
|
|
14695
14702
|
const imageBuffer = this.dataUrlToArrayBuffer(latestScreenshot);
|
|
14696
14703
|
const imageBufferSize = imageBuffer.byteLength;
|
|
14704
|
+
const convertTime = performance.now() - convertStartTime;
|
|
14697
14705
|
// 构建配置的二进制结构
|
|
14706
|
+
const buildConfigStartTime = performance.now();
|
|
14698
14707
|
const configBuffer = this.buildBinaryConfig(this.currentBinaryConfig);
|
|
14699
14708
|
const configBufferSize = configBuffer.byteLength;
|
|
14709
|
+
const buildConfigTime = performance.now() - buildConfigStartTime;
|
|
14700
14710
|
// 合并配置字节和图片字节(配置在前)
|
|
14711
|
+
const combineStartTime = performance.now();
|
|
14701
14712
|
const combinedBuffer = this.combineBinaryData(configBuffer, imageBuffer);
|
|
14702
14713
|
const combinedBufferSize = combinedBuffer.byteLength;
|
|
14714
|
+
const combineTime = performance.now() - combineStartTime;
|
|
14703
14715
|
// 打印大小信息
|
|
14704
14716
|
if (!this.options.silentMode) {
|
|
14705
14717
|
console.log('📸 [轮询-大小统计]');
|
|
@@ -14707,16 +14719,26 @@ class ScreenshotManager {
|
|
|
14707
14719
|
console.log(` 图片字节大小: ${(imageBufferSize / 1024).toFixed(2)} KB (${imageBufferSize} 字节)`);
|
|
14708
14720
|
console.log(` 配置字节大小: ${configBufferSize} 字节`);
|
|
14709
14721
|
console.log(` 拼接后总大小: ${(combinedBufferSize / 1024).toFixed(2)} KB (${combinedBufferSize} 字节)`);
|
|
14722
|
+
console.log(` ⏱️ 数据转换耗时: ${convertTime.toFixed(2)}ms`);
|
|
14723
|
+
console.log(` ⏱️ 构建配置耗时: ${buildConfigTime.toFixed(2)}ms`);
|
|
14724
|
+
console.log(` ⏱️ 合并数据耗时: ${combineTime.toFixed(2)}ms`);
|
|
14710
14725
|
}
|
|
14711
14726
|
// 发送二进制数据到 iframe
|
|
14712
14727
|
if (this.sendToIframeCallback) {
|
|
14728
|
+
const sendCallbackStartTime = performance.now();
|
|
14713
14729
|
const message = {
|
|
14714
14730
|
type: 'screenshotBinary',
|
|
14715
14731
|
data: combinedBuffer
|
|
14716
14732
|
};
|
|
14717
14733
|
this.sendToIframeCallback(message);
|
|
14734
|
+
const sendCallbackTime = performance.now() - sendCallbackStartTime;
|
|
14735
|
+
const totalSendTime = performance.now() - sendStartTime;
|
|
14736
|
+
const totalTime = performance.now() - scheduleStartTime;
|
|
14718
14737
|
if (!this.options.silentMode) {
|
|
14719
14738
|
console.log('📸 [轮询] ✅ 二进制数据已发送到 iframe');
|
|
14739
|
+
console.log(` ⏱️ 发送回调耗时: ${sendCallbackTime.toFixed(2)}ms`);
|
|
14740
|
+
console.log(` ⏱️ 发送阶段总耗时: ${totalSendTime.toFixed(2)}ms`);
|
|
14741
|
+
console.log(` ⏱️ 从定时开始到发送完成总耗时: ${totalTime.toFixed(2)}ms`);
|
|
14720
14742
|
}
|
|
14721
14743
|
}
|
|
14722
14744
|
}
|
|
@@ -14776,25 +14798,41 @@ class ScreenshotManager {
|
|
|
14776
14798
|
/**
|
|
14777
14799
|
* 执行截图
|
|
14778
14800
|
*/
|
|
14779
|
-
async takeScreenshot() {
|
|
14801
|
+
async takeScreenshot(scheduleStartTime) {
|
|
14780
14802
|
if (!this.targetElement) {
|
|
14781
14803
|
console.warn('📸 目标元素不存在');
|
|
14782
14804
|
return false;
|
|
14783
14805
|
}
|
|
14806
|
+
// 记录截图开始时间
|
|
14807
|
+
const screenshotStartTime = performance.now();
|
|
14784
14808
|
this.setupGlobalErrorHandlers();
|
|
14785
14809
|
try {
|
|
14786
14810
|
if (!this.options.silentMode) {
|
|
14787
14811
|
console.log(`📸 开始截图 #${this.screenshotCount + 1}...`);
|
|
14812
|
+
if (scheduleStartTime) {
|
|
14813
|
+
const waitTime = screenshotStartTime - scheduleStartTime;
|
|
14814
|
+
console.log(` ⏱️ 定时到截图开始耗时: ${waitTime.toFixed(2)}ms`);
|
|
14815
|
+
}
|
|
14788
14816
|
}
|
|
14789
14817
|
// 等待 CSS 和字体加载完成
|
|
14818
|
+
const waitStylesStartTime = performance.now();
|
|
14790
14819
|
await Promise.all([
|
|
14791
14820
|
this.waitForStylesAndFonts(),
|
|
14792
14821
|
this.waitForFonts()
|
|
14793
14822
|
]);
|
|
14823
|
+
const waitStylesTime = performance.now() - waitStylesStartTime;
|
|
14824
|
+
if (!this.options.silentMode) {
|
|
14825
|
+
console.log(` ⏱️ 等待样式和字体加载耗时: ${waitStylesTime.toFixed(2)}ms`);
|
|
14826
|
+
}
|
|
14794
14827
|
// 等待元素完全渲染(特别是对于 modern-screenshot)
|
|
14828
|
+
const waitRenderStartTime = performance.now();
|
|
14795
14829
|
await new Promise(resolve => requestAnimationFrame(() => {
|
|
14796
14830
|
requestAnimationFrame(() => resolve());
|
|
14797
14831
|
}));
|
|
14832
|
+
const waitRenderTime = performance.now() - waitRenderStartTime;
|
|
14833
|
+
if (!this.options.silentMode) {
|
|
14834
|
+
console.log(` ⏱️ 等待渲染完成耗时: ${waitRenderTime.toFixed(2)}ms`);
|
|
14835
|
+
}
|
|
14798
14836
|
// 选择截图引擎
|
|
14799
14837
|
const selectedEngine = this.options.engine || 'modern-screenshot';
|
|
14800
14838
|
if (!this.options.silentMode) {
|
|
@@ -14821,6 +14859,7 @@ class ScreenshotManager {
|
|
|
14821
14859
|
}
|
|
14822
14860
|
let dataUrl;
|
|
14823
14861
|
// 根据选择的引擎进行截图
|
|
14862
|
+
const engineStartTime = performance.now();
|
|
14824
14863
|
if (selectedEngine === 'html2canvas') {
|
|
14825
14864
|
// html2canvas 需要更长的等待时间确保样式加载
|
|
14826
14865
|
// 额外等待样式和字体加载完成
|
|
@@ -14843,6 +14882,10 @@ class ScreenshotManager {
|
|
|
14843
14882
|
await new Promise(resolve => setTimeout(resolve, 50));
|
|
14844
14883
|
dataUrl = await this.takeScreenshotWithModernScreenshot(this.targetElement);
|
|
14845
14884
|
}
|
|
14885
|
+
const engineTime = performance.now() - engineStartTime;
|
|
14886
|
+
if (!this.options.silentMode) {
|
|
14887
|
+
console.log(` ⏱️ 截图引擎执行耗时: ${engineTime.toFixed(2)}ms`);
|
|
14888
|
+
}
|
|
14846
14889
|
const timestamp = Date.now();
|
|
14847
14890
|
// 更新状态
|
|
14848
14891
|
this.screenshotCount++;
|
|
@@ -14876,6 +14919,8 @@ class ScreenshotManager {
|
|
|
14876
14919
|
break;
|
|
14877
14920
|
}
|
|
14878
14921
|
}
|
|
14922
|
+
// 计算截图总耗时
|
|
14923
|
+
const screenshotTotalTime = performance.now() - screenshotStartTime;
|
|
14879
14924
|
// 打印基本信息
|
|
14880
14925
|
const base64Data = dataUrl.split(',')[1] || '';
|
|
14881
14926
|
if (!this.options.silentMode) {
|
|
@@ -14884,6 +14929,7 @@ class ScreenshotManager {
|
|
|
14884
14929
|
console.log(`📸 时间: ${new Date(timestamp).toLocaleTimeString()}`);
|
|
14885
14930
|
console.log(`📸 原始大小: ${Math.round(base64Data.length * 0.75 / 1024)} KB`);
|
|
14886
14931
|
console.log(`📸 Base64 长度: ${base64Data.length} 字符`);
|
|
14932
|
+
console.log(` ⏱️ 截图总耗时: ${screenshotTotalTime.toFixed(2)}ms`);
|
|
14887
14933
|
// 完整打印压缩前的 base64
|
|
14888
14934
|
console.log(`📸 [压缩前] 完整 Base64:`);
|
|
14889
14935
|
console.log(base64Data);
|
|
@@ -14906,12 +14952,16 @@ class ScreenshotManager {
|
|
|
14906
14952
|
}
|
|
14907
14953
|
}
|
|
14908
14954
|
if (this.worker) {
|
|
14955
|
+
// 记录压缩开始时间
|
|
14956
|
+
const compressStartTime = performance.now();
|
|
14909
14957
|
if (!this.options.silentMode) {
|
|
14910
14958
|
console.log('📸 发送到 WebWorker 进行压缩...');
|
|
14911
14959
|
}
|
|
14912
14960
|
// 保存原始 dataUrl 用于后续对比(在 Worker 压缩完成后)
|
|
14913
14961
|
// 注意:此时 screenshotHistory 中已经保存了原始的 dataUrl
|
|
14914
14962
|
const originalDataUrlForCompression = dataUrl;
|
|
14963
|
+
this.worker.__compressStartTime = compressStartTime;
|
|
14964
|
+
this.worker.__scheduleStartTime = scheduleStartTime;
|
|
14915
14965
|
this.worker.postMessage({
|
|
14916
14966
|
type: 'COMPRESS_IMAGE',
|
|
14917
14967
|
data: {
|
|
@@ -15203,8 +15253,12 @@ class ScreenshotManager {
|
|
|
15203
15253
|
const options = {
|
|
15204
15254
|
// 基本配置
|
|
15205
15255
|
backgroundColor: '#ffffff',
|
|
15206
|
-
//
|
|
15207
|
-
|
|
15256
|
+
// 缩放比例:用户配置优先,否则使用默认值(移动设备 0.5,桌面设备 0.6)
|
|
15257
|
+
// scale 越大越清晰,但文件也越大
|
|
15258
|
+
// 1.0 = 原始分辨率,2.0 = 2倍分辨率(超清晰)
|
|
15259
|
+
scale: this.options.scale !== undefined
|
|
15260
|
+
? this.options.scale // 用户明确配置了 scale(包括 1.0),使用用户配置
|
|
15261
|
+
: (isMobile ? 0.5 : 0.6), // 用户未配置,使用默认值
|
|
15208
15262
|
useCORS: this.options.enableCORS,
|
|
15209
15263
|
allowTaint: !this.options.enableCORS, // 如果启用 CORS,不允许 taint
|
|
15210
15264
|
logging: !this.options.silentMode,
|
|
@@ -17044,6 +17098,11 @@ class ScreenshotManager {
|
|
|
17044
17098
|
const { type, data } = e.data;
|
|
17045
17099
|
if (type === 'SCREENSHOT_RESULT' && data?.compressed) {
|
|
17046
17100
|
const compressed = data.compressed;
|
|
17101
|
+
const compressEndTime = performance.now();
|
|
17102
|
+
// 获取压缩开始时间
|
|
17103
|
+
const compressStartTime = newWorker.__compressStartTime || compressEndTime;
|
|
17104
|
+
const scheduleStartTime = newWorker.__scheduleStartTime;
|
|
17105
|
+
const compressTime = compressEndTime - compressStartTime;
|
|
17047
17106
|
// 获取压缩前的原始数据
|
|
17048
17107
|
// 从 screenshotHistory 中获取(在发送到 Worker 之前已经保存了原始数据)
|
|
17049
17108
|
const originalDataUrl = this.screenshotHistory.length > 0
|
|
@@ -17062,6 +17121,7 @@ class ScreenshotManager {
|
|
|
17062
17121
|
// 压缩失败,使用原始数据
|
|
17063
17122
|
console.warn('📸 [Worker 压缩] ⚠️ 压缩失败,使用原始截图');
|
|
17064
17123
|
console.warn(` ⚠️ 错误: ${compressed.error}`);
|
|
17124
|
+
console.log(` ⏱️ Worker 压缩耗时: ${compressTime.toFixed(2)}ms`);
|
|
17065
17125
|
console.log(`📸 [压缩前] Base64 长度: ${originalBase64.length} 字符`);
|
|
17066
17126
|
console.log(`📸 [压缩前] 完整 Base64:`);
|
|
17067
17127
|
console.log(originalBase64);
|
|
@@ -17077,6 +17137,7 @@ class ScreenshotManager {
|
|
|
17077
17137
|
console.log(` 原始大小: ${originalKB} KB`);
|
|
17078
17138
|
console.log(` 压缩后: ${compressedKB} KB`);
|
|
17079
17139
|
console.log(` 压缩率: ${ratio}%`);
|
|
17140
|
+
console.log(` ⏱️ Worker 压缩耗时: ${compressTime.toFixed(2)}ms`);
|
|
17080
17141
|
// 完整打印压缩前后的 base64 对比
|
|
17081
17142
|
console.log(`📸 [压缩前] Base64 长度: ${originalBase64.length} 字符`);
|
|
17082
17143
|
console.log(`📸 [压缩前] 完整 Base64:`);
|
|
@@ -17092,7 +17153,7 @@ class ScreenshotManager {
|
|
|
17092
17153
|
}
|
|
17093
17154
|
// 压缩完成后(无论成功或失败),如果配置了二进制模式,发送数据到 iframe
|
|
17094
17155
|
if (this.currentBinaryConfig && compressed.dataUrl) {
|
|
17095
|
-
this.sendCompressedScreenshotToIframe(compressed.dataUrl);
|
|
17156
|
+
this.sendCompressedScreenshotToIframe(compressed.dataUrl, scheduleStartTime, compressEndTime);
|
|
17096
17157
|
}
|
|
17097
17158
|
}
|
|
17098
17159
|
}
|
|
@@ -17382,10 +17443,11 @@ class ScreenshotManager {
|
|
|
17382
17443
|
/**
|
|
17383
17444
|
* 发送压缩后的截图到 iframe
|
|
17384
17445
|
*/
|
|
17385
|
-
sendCompressedScreenshotToIframe(dataUrl) {
|
|
17446
|
+
sendCompressedScreenshotToIframe(dataUrl, scheduleStartTime, compressEndTime) {
|
|
17386
17447
|
if (!this.currentBinaryConfig || !this.sendToIframeCallback) {
|
|
17387
17448
|
return;
|
|
17388
17449
|
}
|
|
17450
|
+
const sendStartTime = performance.now();
|
|
17389
17451
|
try {
|
|
17390
17452
|
// 计算 base64 大小
|
|
17391
17453
|
const base64Data = dataUrl.split(',')[1] || '';
|
|
@@ -17400,14 +17462,20 @@ class ScreenshotManager {
|
|
|
17400
17462
|
console.log(dataUrl);
|
|
17401
17463
|
}
|
|
17402
17464
|
// 将截图转换为 ArrayBuffer
|
|
17465
|
+
const convertStartTime = performance.now();
|
|
17403
17466
|
const imageBuffer = this.dataUrlToArrayBuffer(dataUrl);
|
|
17404
17467
|
const imageBufferSize = imageBuffer.byteLength;
|
|
17468
|
+
const convertTime = performance.now() - convertStartTime;
|
|
17405
17469
|
// 构建配置的二进制结构
|
|
17470
|
+
const buildConfigStartTime = performance.now();
|
|
17406
17471
|
const configBuffer = this.buildBinaryConfig(this.currentBinaryConfig);
|
|
17407
17472
|
const configBufferSize = configBuffer.byteLength;
|
|
17473
|
+
const buildConfigTime = performance.now() - buildConfigStartTime;
|
|
17408
17474
|
// 合并配置字节和图片字节(配置在前)
|
|
17475
|
+
const combineStartTime = performance.now();
|
|
17409
17476
|
const combinedBuffer = this.combineBinaryData(configBuffer, imageBuffer);
|
|
17410
17477
|
const combinedBufferSize = combinedBuffer.byteLength;
|
|
17478
|
+
const combineTime = performance.now() - combineStartTime;
|
|
17411
17479
|
// 打印大小信息
|
|
17412
17480
|
if (!this.options.silentMode) {
|
|
17413
17481
|
console.log('📸 [压缩后-大小统计]');
|
|
@@ -17415,15 +17483,34 @@ class ScreenshotManager {
|
|
|
17415
17483
|
console.log(` 图片字节大小: ${(imageBufferSize / 1024).toFixed(2)} KB (${imageBufferSize} 字节)`);
|
|
17416
17484
|
console.log(` 配置字节大小: ${configBufferSize} 字节`);
|
|
17417
17485
|
console.log(` 拼接后总大小: ${(combinedBufferSize / 1024).toFixed(2)} KB (${combinedBufferSize} 字节)`);
|
|
17486
|
+
console.log(` ⏱️ 数据转换耗时: ${convertTime.toFixed(2)}ms`);
|
|
17487
|
+
console.log(` ⏱️ 构建配置耗时: ${buildConfigTime.toFixed(2)}ms`);
|
|
17488
|
+
console.log(` ⏱️ 合并数据耗时: ${combineTime.toFixed(2)}ms`);
|
|
17418
17489
|
}
|
|
17419
17490
|
// 发送二进制数据到 iframe
|
|
17491
|
+
const sendCallbackStartTime = performance.now();
|
|
17420
17492
|
const message = {
|
|
17421
17493
|
type: 'screenshotBinary',
|
|
17422
17494
|
data: combinedBuffer
|
|
17423
17495
|
};
|
|
17424
17496
|
this.sendToIframeCallback(message);
|
|
17497
|
+
const sendCallbackTime = performance.now() - sendCallbackStartTime;
|
|
17498
|
+
const totalSendTime = performance.now() - sendStartTime;
|
|
17499
|
+
let totalTime = 0;
|
|
17500
|
+
if (scheduleStartTime) {
|
|
17501
|
+
totalTime = performance.now() - scheduleStartTime;
|
|
17502
|
+
}
|
|
17425
17503
|
if (!this.options.silentMode) {
|
|
17426
17504
|
console.log('📸 [压缩后] ✅ 二进制数据已发送到 iframe');
|
|
17505
|
+
console.log(` ⏱️ 发送回调耗时: ${sendCallbackTime.toFixed(2)}ms`);
|
|
17506
|
+
console.log(` ⏱️ 发送阶段总耗时: ${totalSendTime.toFixed(2)}ms`);
|
|
17507
|
+
if (scheduleStartTime) {
|
|
17508
|
+
console.log(` ⏱️ 从定时开始到发送完成总耗时: ${totalTime.toFixed(2)}ms`);
|
|
17509
|
+
if (compressEndTime) {
|
|
17510
|
+
const compressToSendTime = sendStartTime - compressEndTime;
|
|
17511
|
+
console.log(` ⏱️ 压缩完成到发送开始耗时: ${compressToSendTime.toFixed(2)}ms`);
|
|
17512
|
+
}
|
|
17513
|
+
}
|
|
17427
17514
|
}
|
|
17428
17515
|
}
|
|
17429
17516
|
catch (error) {
|