发生条件

把别人的开源单页 demo(流体模拟、小游戏这类)直接拿来挂到自己的域名下自部署,做"清理一下再上线"。

症状

页面全黑,什么都不渲染,控制台第一行报:

ReferenceError: ga is not defined

但这个页面里明明没有 google-analytics.com 的 <script> 标签了——你刚刚亲手删掉的。

尝试过的解法

  • 删掉 HTML <head> 里那两段 Google Analytics 的 <script>。→ 不够。报错仍在。
  • 怀疑是 WebGL 不支持、跨域、文件权限。→ 都不是。

根因

作者的埋点不止一处。<head> 里那两段只是初始化 ga 函数的地方,真正调用 ga('send', ...) 的语句散落在业务 JS 里。

流体的 script.js 有 7 处 ga('send', 'event', ...),其中一处位于 getWebGLContext() 内部——在初始化调用链上:

function getWebGLContext(canvas) {
    ...
    ga('send', 'event', isWebGL2 ? 'webgl2' : 'webgl', ...);   // ← 第 156 行
    return { gl, ext };
}

删掉了定义、留下了调用,这一行抛 ReferenceError,异常向上冒泡中断了整个初始化流程,于是 canvas 从头到尾没被配置,画面保持全黑。

后 6 处(分享按钮、GUI 按钮里的)只会在点击时抛错,不致命——所以"删了外链但没删调用"有时看起来没事,有时直接白屏,取决于那一处在不在初始化路径上。

最终解决步骤

删掉业务 JS 里全部 ga(...) 调用语句,而不是只删外链定义:

lines = open(path, encoding="utf-8").read().split("\n")
kept = [l for l in lines if not (l.strip().startswith("ga(") and l.strip().endswith(");"))]
open(path, "w", encoding="utf-8", newline="\n").write("\n".join(kept))

删完再全站 grep 一遍 "ga(" 确认归零,然后重新部署、重新用无痕窗口/硬刷新验证(浏览器会缓存旧的 script.js)。

注:这里选择直接删除而不是打桩(const ga = () => {})。打桩能让页面跑起来,但把作者的统计属性继续留在代码里,将来有人补回 analytics.js 时会把访客数据悄悄发到作者账号。用于自部署的第三方站,删除比打桩干净。

同类问题:硬编码的原始站点

同一批清理还要处理被写死的原站地址,否则自部署后的页面会出现 404 或把用户送去别人的站:

位置表现
<link rel="icon" href="http://原作者域名/favicon.png">浏览器请求外部域名,慢或被墙
<meta property="og:url"> / og:image分享链接时,预览指向原作者站点
JS 里拼的分享链接(如 encodeURIComponent('http://原作者域名'))点分享按钮跳到别人站
打包产物 package.zip / package.webapp与源目录重复,白白多传几 MB

搜索方式:全站 grep https?://,然后逐个判断"这是许可证注释/文档链接(留着)"还是"浏览器会真的去请求(要改)"。判据是看它出现在 src= / href= / url() / 运行时拼接里,还是只在 // 注释里。

下次怎么认出来

  • 自部署别人 demo 后页面白屏但无资源 404,优先怀疑"埋点调用残留"而不是 WebGL 问题。
  • 删这类代码时,记住一条:先找定义的位置,再全量搜调用点。只删定义是常见错误。
  • .git 目录常常比代码本身还大(某次 33M 的仓库里 .git 占 13M)——部署前一定排除。

相关


本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/Web