Closed hcfw007 closed 5 years ago
问题复现。两个月前就出现这种情况了,当时也没去注意。
谢谢反馈,我也在隐身模式下重现了此问题,这两天我查一下。
看来还是个比较复杂的问题,我先回滚到了上一个正确的版本,主要是 revert 了一些文字细修,影响不大,等后面再慢慢查。
解决了,请验证。
问题的根源在于我自行实现的 prerender 功能。文档站使用的是 GitHub pages,因此无法运行 SSR 服务器,而 Prerender 是 SSR 的一个静态版,也就是说我提前把 SSR 的结果保存成相应名字的 HTML 文件,这样当浏览器请求这个地址时,不再是 try_files 逻辑,而是能直接拿到这个预先渲染好的结果。
但是,由于文档站无法直接支持 Universal,因此我采用了另一种方式来进行 SSR:用 yarn start
把文档站跑起来,然后使用一个名叫 Prerender 的第三方库进行预先渲染,但是我这里出了一个 bug:我构建使用的是 yarn build
,而 Prerender 时使用的是 yarn start
,它们所使用的构建参数不一样,因此所生成的文件名中的 cache-busting hash 也不一样。所以,当访问 yarn start
生成的页面时,它所引用的文件在 yarn build
的结果中不存在,就出现了问题中所说的现象。
我在 https://github.com/angular/angular-cn/commit/54c67e629446c1fcb9ce41eacaf5c3c6710d466b#diff-9daaa6de808d2b6d7f76feb6d49041cdL15 这个提交中把 yarn start
改成了使用 http-server-spa
直接启动 yarn build
的结果(即 dist 目录),然后对其进行 prerender,就可以保证两者的一致性了。
另外,我在 https://github.com/angular/angular-cn/commit/54c67e629446c1fcb9ce41eacaf5c3c6710d466b 和 https://github.com/angular/angular-cn/commit/a4fc5f8e37262ef4f4a029a3391621db151656f7 这两个提交中,把 Prerender 库换成了 puppeteer,可以更加轻量地进行预先渲染。
请 @hcfw007 @czmecho 两位到 https://preview.angular.live 验证一下,以便关闭 issue。多谢!
我这里验证没有发现问题,因此关闭。
出错的URL: https://angular.cn/guide/file-structure (其实是除首页外任一页面。。。)
错误的内容(请拷贝进来一份精确的出错文本,以便我定位): 当通过URL直接访问此地址,或清除缓存后访问时,所有JS文件均报404错误,但如果从angular.cn导航至此页面则不会有此错误。 比较后发现两次请求的JS文件地址并不相同,以main.js为例,第一次访问时请求的是main.350869ca3d826a51bb62.js,而通过首页导航过来的js地址为main.8fe4b11b8a029aa3981b.js。而且导航过一次之后再直接访问,地址也变成main.8fe4b11b8a029aa3981b.js了,真是黑科技。。。
直接在地址栏访问404的js文件出现Resource Not Found页面(顺便一提,此页面未汉化),因此应该不是被墙了或者防火墙之类的原因。查看英文文档页面并没有这种情况发生。
建议的修改方式(可选): 完全想不到原因,如果大佬知道请指教...
英雄留名(会出现在鸣谢清单中,默认使用你的github id):