最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

Angular + Workbox = build ChunkLoadError:正在加载块#,并拒绝执行脚本,因为其MIME

IT培训 admin 7浏览 0评论

Angular + Workbox = build ChunkLoadError:正在加载块#,并拒绝执行脚本,因为其MIME

我已经在第一次生产中将Workbox添加到Angular中,部署一切正常,但是在更新模块并重建angular和注入Workbox之后访问该站点之后,我看到服务人员将更新到新版本并刷新页面,但是现在尝试使用更新的模块我得到错误

Refused to execute script from '.203674bf0547eff7ff27.js'
because its MIME type ('text/html') is not executable,

并且启用了严格的MIME类型检查。

main-es2015.45ba4a512f87eefb1b3a.js:1 ERROR Error: Uncaught (in promise): ChunkLoadError:   
Loading chunk 8 failed.(error: .203674bf0547eff7ff27.js)
ChunkLoadError: Loading chunk 8 failed......

我查看了chrome中的网络,发现文件8-es2015.203674bf0547eff7ff27.js是通过(磁盘缓存)提供的,这与(ServiceWorker)提供的其余文件不同,内容是index.html文件,我不知道它来自哪里,甚至不属于新版本? chrome将其放在脚本下的顶部框架部分

此错误的原因是什么,在[[angular.json中,我有“ outputHashing”:“ all”,我删除了所有内容并重建,但是仍然出现此错误,直到清除浏览器现金后才删除ServiceWorker并进行强制刷新,直到我重新加载页面并返回错误为止,错误才会停止。我是否需要在每次更新后删除所有缓存,我认为Workbox会自动执行此操作。是否在sw.js中添加类似内容]

self.addEventListener('activate', event => event.waitUntil( caches.keys().then(cacheNames => cacheNames.forEach(name => caches.delete(name))) ) );
我正在使用express,所以我将sw.js上的maxAge设置为0,甚至将静态文件的公共路径更改为深层路径,但什么都没有

app.use('/sw.js', express.static(path.resolve('./public/dist/static/sw.js'), {maxAge: 0})); app.use('/', express.static(path.resolve('./public/dist/static/'), {maxAge: 86400000}));

工具

:角度8.2.4-工作箱4.3.1

更新

删除了工作箱,该应用程序正常运行,猜测其原因是其新软件包workbox-window或尝试使用它的方式。我将其放置在从app.module加载的模块服务中,然后从AppComponent ngOnInit调用该服务。这可能是初始化它的错误方法。代码设置:

import {Workbox} from 'workbox-window'; @Injectable() export class WorkerService { supportWorker: boolean; supportPush: boolean; constructor(@Inject(WINDOW) private window: any, private loggerService: LoggerService) { this.supportWorker = ('serviceWorker' in navigator); this.supportPush = (this.supportWorker && 'PushManager' in window); } initWorker() { if (this.supportWorker && environment.production) { const wb = new Workbox('sw.js'); if (wb) { wb.addEventListener('installed', event => { if (event.isUpdate) { // output a toast translated message to users this.loggerService.info('App.webWorkerUpdate', 10000); setTimeout(() => this.window.location.reload(), 10000); } }); wb.addEventListener('activated', event => { if (!event.isUpdate) { this.loggerService.success('App.webWorkerInit', 10000); } }); wb.register(); } } } }

此应用程序组件,我认为最好在bootstrapModule.then()之后将其添加到main.ts中,但我不知道如何在此方法中注入服务

@Component({ selector: 'app-root', template: '<route-handler></route-handler>' }) export class AppComponent implements OnInit { constructor(private ws: WorkerService) { } ngOnInit(): void { this.ws.initWorker(); } }

回答如下:[以不同的工作方式设置Workbox之后,该问题甚至影响了chrome,在测试每次构建后,chrome都无法清除所有缓存,必须使用隐身模式才能确保一切正常。

这里是必须阅读Ralph Schaer文章的解决方案。他的方法不是缓存-角构建生成的块,也将应用使用的所有工作箱生产脚本都放到了构建文件夹中,最后进入index.html中,他调用了工作箱窗口来注册服务-工人。

Angular + Workbox = build ChunkLoadError:正在加载块#,并拒绝执行脚本,因为其MIME

我已经在第一次生产中将Workbox添加到Angular中,部署一切正常,但是在更新模块并重建angular和注入Workbox之后访问该站点之后,我看到服务人员将更新到新版本并刷新页面,但是现在尝试使用更新的模块我得到错误

Refused to execute script from '.203674bf0547eff7ff27.js'
because its MIME type ('text/html') is not executable,

并且启用了严格的MIME类型检查。

main-es2015.45ba4a512f87eefb1b3a.js:1 ERROR Error: Uncaught (in promise): ChunkLoadError:   
Loading chunk 8 failed.(error: .203674bf0547eff7ff27.js)
ChunkLoadError: Loading chunk 8 failed......

我查看了chrome中的网络,发现文件8-es2015.203674bf0547eff7ff27.js是通过(磁盘缓存)提供的,这与(ServiceWorker)提供的其余文件不同,内容是index.html文件,我不知道它来自哪里,甚至不属于新版本? chrome将其放在脚本下的顶部框架部分

此错误的原因是什么,在[[angular.json中,我有“ outputHashing”:“ all”,我删除了所有内容并重建,但是仍然出现此错误,直到清除浏览器现金后才删除ServiceWorker并进行强制刷新,直到我重新加载页面并返回错误为止,错误才会停止。我是否需要在每次更新后删除所有缓存,我认为Workbox会自动执行此操作。是否在sw.js中添加类似内容]

self.addEventListener('activate', event => event.waitUntil( caches.keys().then(cacheNames => cacheNames.forEach(name => caches.delete(name))) ) );
我正在使用express,所以我将sw.js上的maxAge设置为0,甚至将静态文件的公共路径更改为深层路径,但什么都没有

app.use('/sw.js', express.static(path.resolve('./public/dist/static/sw.js'), {maxAge: 0})); app.use('/', express.static(path.resolve('./public/dist/static/'), {maxAge: 86400000}));

工具

:角度8.2.4-工作箱4.3.1

更新

删除了工作箱,该应用程序正常运行,猜测其原因是其新软件包workbox-window或尝试使用它的方式。我将其放置在从app.module加载的模块服务中,然后从AppComponent ngOnInit调用该服务。这可能是初始化它的错误方法。代码设置:

import {Workbox} from 'workbox-window'; @Injectable() export class WorkerService { supportWorker: boolean; supportPush: boolean; constructor(@Inject(WINDOW) private window: any, private loggerService: LoggerService) { this.supportWorker = ('serviceWorker' in navigator); this.supportPush = (this.supportWorker && 'PushManager' in window); } initWorker() { if (this.supportWorker && environment.production) { const wb = new Workbox('sw.js'); if (wb) { wb.addEventListener('installed', event => { if (event.isUpdate) { // output a toast translated message to users this.loggerService.info('App.webWorkerUpdate', 10000); setTimeout(() => this.window.location.reload(), 10000); } }); wb.addEventListener('activated', event => { if (!event.isUpdate) { this.loggerService.success('App.webWorkerInit', 10000); } }); wb.register(); } } } }

此应用程序组件,我认为最好在bootstrapModule.then()之后将其添加到main.ts中,但我不知道如何在此方法中注入服务

@Component({ selector: 'app-root', template: '<route-handler></route-handler>' }) export class AppComponent implements OnInit { constructor(private ws: WorkerService) { } ngOnInit(): void { this.ws.initWorker(); } }

回答如下:[以不同的工作方式设置Workbox之后,该问题甚至影响了chrome,在测试每次构建后,chrome都无法清除所有缓存,必须使用隐身模式才能确保一切正常。

这里是必须阅读Ralph Schaer文章的解决方案。他的方法不是缓存-角构建生成的块,也将应用使用的所有工作箱生产脚本都放到了构建文件夹中,最后进入index.html中,他调用了工作箱窗口来注册服务-工人。

发布评论

评论列表 (0)

  1. 暂无评论