【问题标题】:How do I resolve resource was blocked, MIME type mismatch in Angular?如何解决资源被阻止,Angular 中的 MIME 类型不匹配?
【发布时间】:2019-11-08 14:44:27
【问题描述】:

我正在关注 Angular documentation 尝试尝试基本的 Web Worker 示例。

我构建了一个基本的 Angular 模板应用程序,它运行良好。

我添加了一个名为 RunnerComponent 的非常基本的组件,然后运行命令(按照文档的指示):

ng generate web-worker runner

这成功添加了依赖项并添加了新的 TypeScript 文件并将测试代码添加到我的 RunnerComponent。 这是它包含在新添加的 runner.worker.ts 中的简单代码:

/// <reference lib="webworker" />

addEventListener('message', ({ data }) => {
  const response = `worker response to ${data}`;
  postMessage(response);
});

这是它在 runner.component.ts 中添加到我的 RunnerComponent 的代码:

if (typeof Worker !== 'undefined') {
  // Create a new
  const worker = new Worker('./runner.worker', { type: 'module' });
  worker.onmessage = ({ data }) => {
    console.log(`page got message: ${data}`);
  };
  worker.postMessage('hello');
} else {
  // Web Workers are not supported in this environment.
  // You should add a fallback so that your program still executes correctly.
}

应用程序继续正常运行,但是当以下行运行时,我收到错误:

const worker = new Worker('./runner.worker', { type: 'module' });

主要错误(通过 FireFox)

来自“http://localhost:4200/runner.worker”的资源被阻止 由于 MIME 类型(“text/html”)不匹配(X-Content-Type-Options: 不闻)

我正在使用基本的 Angular 开发 Web 服务器(使用命令 ng serve 启动它),我假设它是 Node.js http-server,但不完全确定。

你知道我为什么会收到这个错误吗?

它是否试图为实际的 runner.worker.ts 而不是生成的内容提供服务?

有没有办法可以将 nosniff 标头添加到 http-server 以便忽略错误 (X-Content-Type-Options: nosniff)?我会在哪里添加?

我该如何解决这个问题?

更新:我的尝试

我创建了一个公共 GitHub 存储库,其中包含将展示此问题的 Angular CLI 项目。获取地址:https://github.com/raddevus/AngularWebWorker 您可以将 repo 克隆下来并尝试自己查看错误。

添加路线

我认为这个问题可能与需要与我的 Runner.Component 相关的路由(WebWorker 请求的 URL 是 http://localhost:4200/runner.worker)有关,所以我添加了一个路由以查看是否有帮助。

const routes: Routes = [{ path:  'runner.worker', 
component:  RunnerComponent}
];

很遗憾,这并没有解决问题。

试用 Edge 浏览器

我通常使用 FireFox,这就是我记录上述错误的原因。 所以我也尝试了 MS Edge,但确实遇到了类似的错误:

SEC7112:来自http://localhost:4200/runner.worker 的脚本被阻止 由于 mime 类型不匹配

试用过的 Chrome 浏览器:版本 75.0.3770.100(官方构建)(64 位)

我看到以下内容:

runner.component.ts:13 Uncaught TypeError: 构造失败 'Worker':DedicatedWorker 尚不支持模块脚本。你 可以使用“--enable-experimental-web-platform-features”尝试该功能 标志(见https://crbug.com/680046

at Module../src/app/runner.component.ts (runner.component.ts:13)

那行代码(runner.component.ts:13)是:

const worker = new Worker('./runner.worker', { type: 'module' });

相关链接很长,我必须通读它以查看它是否有意义。

【问题讨论】:

  • 永远不要使用 Edge 的结果作为任何东西的参考。使用 Firefox 和 Chrome 作为您的参考浏览器。
  • @Rob 好点,现在在 Chrome 上测试。将发布结果。

标签: angular visual-studio-code http-headers web-worker


【解决方案1】:

我知道这是用户最终解决的一个较老的问题,但考虑到这是在搜索引擎上搜索时的第一个结果(在我的情况下是 dadduckgo),我想我会回答在我的特定情况下发生的事情.

在我的例子中,我正在开发一个 monorepo 项目,我试图运行的项目在 index.html 的头部有一个 &lt;base /&gt; 标记。结果导致文件从 http://localhost:4200/styles.css 重命名为 http://localhost:4200/ui/styles.css 导致错误:

拒绝应用来自 'http://localhost:4200/ui/styles.css' 的样式,因为它的 MIME 类型 ('text/html') 不是受支持的样式表 MIME 类型,并且启用了严格的 MIME 检查。

在我的例子中,前一个 URL 存在,而后者不存在。

解决办法是将基本标签改回:

<base href="/">

【讨论】:

    【解决方案2】:

    我从 GitHub 站点提取了我的代码(在本地测试它),编译了代码,现在解决方案有效(不会发生错误)。

    您可以在下图中看到代码现在正在运行,因为预期的输出已写入 console.log 并显示行 runner.component.ts:15 已执行。

    我相信这现在可行,因为我添加了 Angular Route。然而,昨天和昨晚当我添加那条路线时,我仍然没有看到它工作。我不确定这是 http-server 的问题还是缓存问题或其他问题。我将不得不进行调查以确定根本原因。

    已移除路线,仍然有效

    我删除了路由,停止了 http-server 并再次运行它,代码仍然有效。现在我似乎无法重现问题。但是,正如您所见,该问题已解决,并且我已在 Chrome 和 FireFox 中对其进行了测试。

    更新:由于其他原因发生错误

    我完全重新开始,试图重现似乎已经消失的问题。

    我通过 CLI 创建了一个新的 Angular 项目:

    ng new ThirdOne 
    

    我构建并运行了它。然后我通过原始文档再次添加了网络工作者

    ng generate web-worker runner
    

    然后我又看到了类似的错误,它指向那个特定的 web worker 行,但是是一个错误的错误。

    您可以在 FireFox 中看到错误:

    但是,现在和旧版 Chrome(版本 56.0.2924.87)有点不同:

    但是,将其与我在当前版本的 Chrome(版本 75.0.3770.100(官方构建)(64 位))中遇到的错误进行比较:

    这是红鲱鱼

    请注意,它再次指向代码中的同一行,即 Web Worker 的实例化 (runner.component.ts:13)。 注意:它也不会渲染页面。

    const worker = new Worker('./runner.worker', { type: 'module' });
    

    但是,这并不是真正的根本问题。这都是相当可怕的。

    最终更新:Visual Studio Code:罪魁祸首?

    我使用 Visual Studio Code 作为我的编辑器。

    版本:1.35.1(用户设置)
    提交:c7d83e57cd18f18026a8162d042843bda1bcf21f
    日期:2019-06-12T14:30:02.622Z
    电子:3.1.8
    Chrome:66.0.3359.181 Node.js:10.2.0 V8:6.6.346.32

    操作系统:Windows_NT x64 10.0.14393

    可能的奇怪解决方案

    发布最后一次更新后,我决定在 Visual Studio Code 中关闭项目并重新启动 http-server(节点 http 服务器)。我这样做了,问题就消失了。

    而且,也许这与 Visual Studio Code 实现 Chrome 代码有关??

    昨天我多次重启http-server,仍然发现问题。但是,我确实在 Visual Studio Code 中打开了该项目。这可能是答案,而且很糟糕。

    最终答案

    今天(差不多 2 周后),我再次在一个新的 Angular 项目上工作,并添加了一个新的 Angular Web Worker。我又遇到了这个问题。这次我已经验证你必须:

    1. 在 Visual Studio Code 中关闭项目
    2. 停止 http 服务器
    3. 运行 ng build(重新构建您的 Angular 应用)
    4. 再次启动http服务器ng serve

    问题将消失,您可以再次使用 Visual Studio Code 编辑项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-11
      • 2021-03-21
      • 2020-04-09
      • 2021-02-23
      • 2020-06-20
      • 2019-10-14
      • 2021-01-10
      • 2020-10-14
      相关资源
      最近更新 更多