PageSpy 常见问题解答

739 阅读4分钟

想快速了解 PageSpy 是什么、如何使用?

PageSpy 为各位同学精心专门准备了入门视频,视频中介绍了使用 PageSpy 的背景、如何使用、多种部署方案等,请前往 Bilibili 观看学习。

实例化都可以传哪些参数,它们的作用分别是什么?

// 所有参数都是可选的,以下是各个参数的说明及其默认值
window.$pageSpy = new PageSpy({
    // SDK 会从引入的路径自动分析并决定 Server 的地址(api)和调试端的地址(clientOrigin)
    // 假设你从 https://example.com/page-spy/index.min.js 引入,那么 SDK 会在内部设置:
    //   - api: "example.com"
    //   - clientOrigin: "https://example.com"
    // 如果你的服务部署在别处,就需要在这里手动指定去覆盖。
    api: "",
    clientOrigin: "",
    
    // project 作为信息的一种聚合,可以在调试端房间列表进行搜索
    project: "default",
    
    // title 供用户提供自定义参数,可以用于区分当前调试的客户端
    // 对应的信息显示在每个调试连接面板的「设备id」下方
    title: "--",
    
    // 指示 SDK 初始化完成,是否自动在客户端左下角渲染「圆形白底带 Logo」的控件
    // 如果设置为 false, 可以调用 window.$pageSpy.render() 手动渲染
    autoRender: true,
    
    // 手动指定 PageSpy 服务的 scheme。
    // 这在 SDK 无法正确分析出 scheme 可以使用,例如 PageSpy 的浏览器插件
    // 是通过 chrome-extension://xxx/sdk/index.min.js 引入 SDK,这会
    // 被 SDK 解析成无效的 "chrome-extension://" 并回退到 ["http://", "ws://"]。
    //   - (默认)传值 undefined 或者 null:SDK 会自动分析;
    //   - 传递 boolean 值:
    //     - true:SDK 将通过 ["https://", "wss://"] 访问 PageSpy 服务
    //     - false:SDK 将通过 ["http://", "ws://"] 访问 PageSpy 服务
    enableSSL: null
})

如何在 xxx 框架中集成?

PageSpy 借助 CodeSandbox 平台发布了与当下流行的所有框架的接入指南,大家可以前往在线体验juejin.cn/post/730190…

pagespy.jikejishu.com 是官方提供的域名吗?一直可以用吗?

pagespy.jikejishu.com 是我们为了让大家能够在线体验、学习 PageSpy 临时搭建的服务,不保证 24 小时可用性、不保证数据安全、造成的损失自负,强烈建议大家在体验后前往私服、内网中自行部署。

为什么本地 6752 端口可以访问,部署到服务器上就不行了?

检查服务器上的防火墙、或者安全组规则是否开放了 6752 端口。

想直接通过域名访问该怎么配置?

这里贴出 https://pagespy.jikejishu.com 的 nginx 配置供大家参考:

server {
    listen 443 ssl;
    server_name pagespy.jikejishu.com;

    if ($scheme != https) {
        rewrite ^(.*)$  https://$host$1 permanent;
    }
    
    ssl_certificate /etc/letsencrypt/live/pagespy.jikejishu.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/pagespy.jikejishu.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:6752;
        proxy_http_version    1.1;
        proxy_set_header      Upgrade $http_upgrade;
        proxy_set_header      Connection "upgrade";
    }
}

server {
    if ($host = pagespy.jikejishu.com) {
        return 301 https://$host$request_uri;
    }

    listen 80;
    listen [::]:80;
    server_name pagespy.jikejishu.com;
    return 404;
}

不想在项目里手动集成,有没有办法可以不侵入业务项目代码?

PageSpy 为大家准备了浏览器插件,插件提供了以下特性:

  • 自动注入最新版本的 SDK;
  • 自动完成实例化操作;
  • 提供注入的域名配置规则;

点击前往使用:HuolalaTech/page-spy-extension

有油猴脚本可以使用吗?

参考以下内容:

// ==UserScript==
// @name         Inject PageSpy Script
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Inject script on xxx.yyy
// @author       You
// @match        <匹配规则,比如 example.com>
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    var script1 = document.createElement('script');
    script1.setAttribute('crossorigin', 'anonymous');
    // 实际项目中请替换 SDK 的地址连接
    script1.src = 'https://pagespy.jikejishu.com/page-spy/index.min.js';

    var script2 = document.createElement('script');
    script2.textContent = 'window.$pageSpy = new PageSpy();';

    document.head.prepend(script1);
    script1.onload = () => {
        document.head.appendChild(script2);
    }
})();

业务项目部署在 HTTPS,PageSpy 部署在 HTTP,控制台报错怎么办?

浏览器会阻止从 HTTPS 站点加载 HTTP 资源,这是因为在 HTTP 和 HTTPS 之间传输数据时,HTTPS 提供了加密和安全性,而 HTTP 则是明文传输,存在安全风险。

建议大家直接将 PageSpy 升级到 HTTPS 服务,就可以完美解决。

如何单独对某个用户进行调试?

最简单的方案是让用户使用 PageSpy 的浏览器插件,适用于非常配合的客户且是 PC 端项目的时候,但这个前提条件肉眼可见的非常苛刻;

那么如果 H5 项目上生产了想使用 PageSpy 该怎么办?对所有用户都开启这显然不现实。

大家可以想想 PageSpy 的生效过程总共就两个步骤:

  1. head 标签中通过 <script> 引入 SDK;
  2. 实例化;

PageSpy 在第二步实例化之前,引入的 <script> 对项目不会产生任何作用。我们想针对某个用户进行调试,关键在第二步:在哪个用户的终端上实例化 PageSpy。对此有两种方案:

  • 动态响应 HTML:如果用户在请求 HTML 时,我们可以拿到用户的唯一标识、并且可以对 HTML 动态注入,那么就可以在向用户返回 HTML 之前决定是否注入 <script> 和实例化的逻辑;
  • 让用户使用手势开启(计划中):这通常需要用户的主动配合。默认情况下注入 SDK 但不实例化,让用户触发特殊手势后再开启调试;

友情提示:除了技术上的实现之外,需要注意合法合规等安全风险。

Page 面板的样式不正确?

Page 面板是将客户端的 document.documentElement.outerHTML 渲染到 iframe 中。

由于客户端和调试端的渲染环境并不一致,例如:客户端的浏览器版本是 Chrome 75,调试端的浏览器版本是 Chrome 120。所以样式仅供参考。

Page 面板就不能 100% 还原客户端的内容吗?

SDK 可以对页面进行 “截图” 并发送到调试端,但由于:

  • 图片比文本的数据体积大,数据交互会增加网络传输开销;
  • 增加 SDK 的体积和复杂度;
  • 如果是「样式出错」,远程协同时测试人员可以精准的反馈给开发者;

出于以上原因,Page 面板的样式仅供参考。