likes
comments
collection
share

记一次 script error导致的线上白屏,手把手教你如何定位问题代码

作者站长头像
站长
· 阅读数 38

近日一次线上遇到白屏,通过vconsole发现console只打印了Script error , 没有其他任何有用的信息,看起来很棘手。

为啥出现Script error?

线上的资源( css,js,image )通常会放到cdn上,当这些从cdn 的JavaScript脚本执行出错,因为违背了同源策略, 为了保证用户信息不被泄露,错误信息不会显示出来,取而代之只会返回一个Script error

具体看 Webkit 源码

 bool ScriptExecutionContext::sanitizeScriptError(String& errorMessage, int& lineNumber, String& sourceURL)
  {
    KURL targetURL = completeURL(sourceURL);
   if (securityOrigin()->canRequest(targetURL))
          return false;
          errorMessage = "Script error.";
          sourceURL = String();
          lineNumber = 0;
          return true;
  }

解法

开启CORS跨域资源共享

第一步: script标签 添加 crossorigin="anonymous"属性

<script
      src="https://s1.domain.com/u/offline_store_screen/static/js/app.5f6d1b77.js"
      crossorigin="anonymous"
    ></script>

通过指定 crossorigin="anonymous",可以告诉浏览器该资源可以匿名访问,从而放宽浏览器的安全检查,使跨域请求能够顺利进行。

我们的项目是基于vue-cli建立的,所以在配置中添加这个属性即可,当然,解决完问题,再把这个属性关掉

记一次 script error导致的线上白屏,手把手教你如何定位问题代码

第二步: 添加跨域HTTP响应头

记一次 script error导致的线上白屏,手把手教你如何定位问题代码

Access-Control-Allow-Origin: *

通过以上步骤,就可以把问题定位的更加准确了

记一次 script error导致的线上白屏,手把手教你如何定位问题代码

可以看到图中可以定位到一些有用的信息,

message: "Unexpected identifier" 
stack: "SyntaxError: Unexpected identifier
https://s1.zhuanstatic.com/u/offlinestore_ screen/static/js/chunk
vendors.41faefe3.is 77 22714

可以定位在低端机上遇到了不可预料的标识符,而且可以看到哪个一个js导致的,可以找到行和列。

所以通过这些信息,我们能够快速定位了。

记一次 script error导致的线上白屏,手把手教你如何定位问题代码

在chrome中打开关键的js,然后使用左下角的 {} 进行格式化后,使用ctrl+g 或者command+g,当然我的电脑是ctrl + g 可以进行行列号定位输入77:22714回车,就可以定位到问题代码

记一次 script error导致的线上白屏,手把手教你如何定位问题代码

记一次 script error导致的线上白屏,手把手教你如何定位问题代码

可以看到问题代码是async 没有被转成es5。通过在node_modules搜索问题代码,找到pinia@vue/devtools-api 都没有自动转es5,所以需要手动在配置中添加一下

transpileDependencies: ['pinia', '@vue/devtools-api']

总结

一旦遇到script error的问题不要慌,首先根据上述步骤定位到问题代码,一步步去解决。

转载自:https://juejin.cn/post/7215163152907714616
评论
请登录