Chrome 71 将拒绝执行脚本,因为它的 MIME 类型 ('text/x-js') 不可执行

Chrome 71 will refuse to execute script because its MIME type ('text/x-js') is not executable

我在 Chrome71 上遇到问题: 在 FireFox 中它工作正常,在 Chrome < v71 上也是如此。有一个 announcement at Google 我们应该期待我们使用 service workerscache 存储 api[=35= 的工作方式有两个小变化] 。 但是新版本破坏了我的 importScripts,我还不知道如何解决。

我得到了一个名为 pdfmake-worker-blob.js 的文件,它使一个:

importScripts('./pdfmake.min.js');
importScripts('./vfs_fonts.js');

onmessage = function(req) {

  pdfMake.fonts = {
      Courier: { normal: 'cour.ttf',bold: 'cour-bold.ttf' },
      Arial: { normal: 'arial.ttf',bold: 'arial-bold.ttf' }
  };

  try {
    var pdf = pdfMake.createPdf(req.data);
    pdf.getBlob(function(output) {
        postMessage(output);
    });
  } catch(err) {
    throw err;
  }
}

然后我们在使用它之前在另一个服务中像这样创建工人:

 var pdfmakeWorkerBlob = new Worker('scripts/pdfmake-worker-blob.js');

你可以在 chrome 调试器模式下看到这个(让我再次提醒你代码在 firefoxchrome 70 及以下我猜):

控制台中出现以下消息,我的工人不再工作了:

pdfmake-worker-blob.js:1 Deprecated: Future versions will refuse to execute script from 'http://myserver_name.company.com/application_name/scripts/pdfmake.min.js' because its MIME type ('text/x-js') is not executable.

我没有设置此 Mime 类型或任何我只是做了一个 importscripts 而已。我希望现在更清楚了。

对于遇到问题的人来说,这是一个众所周知的问题:“严格的 MIME 类型检查”。 Chrome 启用 strick mime 类型检查。关于它的堆栈溢出有很多问题。 但碰巧仍然可以通过 worker api 和 importScripts 避免“严格的 MIME 类型检查”。

对于那些像我一样仍在使用 chrome 70.0.3538.110 的人,没有通过 worker api 上的 importScripts 进行严格的 mime 类型检查。 chrome 的新版本修复了它。但是在 firefox 中还是可以的。我向 mozilla 报告了 this behaviour 以防万一

我不清楚,但在我们的生产机器中,我们的 apache 服务器设置了这个 mime 类型:"text/x-js js"。我只是将其替换为应用程序 "application/javascript" js 或 "text/javascript js" 顺便说一句,它已经过时了。