提交 08883cbdd1c39a0c15b97af44ddaefe14acdc21a 导致在旧版 Gecko 上 Discourse 渲染失败。Gecko 在 74 版本之前不支持可选链操作符。
有关更多信息,请参阅 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining#browser_compatibility 。
提交 08883cbdd1c39a0c15b97af44ddaefe14acdc21a 导致在旧版 Gecko 上 Discourse 渲染失败。Gecko 在 74 版本之前不支持可选链操作符。
有关更多信息,请参阅 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining#browser_compatibility 。
哦,我们是要转译这个吗,@pmusaraj / @eviltrout / @j.jaffeux?
可能我理解有误,但初步猜测是:我们没有定义浏览器列表,因此它使用了某个默认值(可能是 https://babeljs.io/docs/en/babel-preset-env),并且未将当前版本视为我们支持的版本,导致未被转译。
不过奇怪的是,Firefox 74 才发布一年,但查看当前的 browserslist 配置:
$ npx browserslist
...
firefox 89
firefox 88
firefox 78
...
现在的问题是,@sam,我们是否要支持它?虽然它只有一年历史,但当前 Firefox 版本已是 89,这意味着它落后了 15 个版本。我不确定,由你决定。需要注意的是,如果要支持该版本,将会增加所有人的代码负载,因为转译本质上类似于 polyfill(添加一些函数以支持该版本,并将语法替换为函数调用)。
(在稳定版中,这是 https://github.com/discourse/discourse/commit/45dca791b0c)
出于好奇,旧的代码风格运行良好,为什么不暂时沿用呢?
FIX: We can't use `?.` yet (#13168) · discourse/discourse@96fd202 · GitHub
原因有很多,但最主要的是这让开发工作变得更加轻松:我们无需过多纠结哪些功能可用、哪些不可用,同时也能拥有一个较为现代化的基础。
只要我们的 HTML 回退方案已经到位,我支持放弃对该浏览器的支持。
我们绝对不能做的是:向 IE9 展示一个正常工作的静态页面,却向一年前的 Firefox 展示一个损坏的页面。
我倾向于只将代码转译为兼容 2-3 年前的 Firefox 或 Chrome,但我很乐意将这个决定权交给 @eviltrout 和你们。我们可以采取更激进的策略,但绝不能展示损坏的页面。
编辑:参见反向链接,这在 Android 上可能是一个相当严重的问题,因为该平台的浏览器升级节奏往往非常糟糕。
我完全同意,而且我确实担心浏览器的兼容性最近遭受了一些打击。
另外在 iOS 上还有这个问题:Safari (iOS) shows blank pages on Discourse instances after beta 8 due to manually disable IntersectionObserver
没错,同意。至少我们应该实现 browserlist 支持,这样未支持的功能就不会让我们感到意外。
这个问题会影响 Google 的收录吗?
我想确认一下,是否需要从其他方面排查导致收录受阻的原因。
谢谢
我无法在 meta 上复现 OP 的问题。我尝试通过 Browserstack 在 macOS 上使用 Firefox 73,以及在 Windows 上使用 Firefox 68 进行测试。@vige,你能在 meta 上复现这个问题吗?
我觉得你说得对,它实际上应该能工作,我刚刚在浏览器里查看了代码:
toggleHamburger: function toggleHamburger() {
this.state.hamburgerVisible = !this.state.hamburgerVisible;
this.toggleBodyScrolling(this.state.hamburgerVisible); // 自动聚焦下拉菜单中的第一个链接
(0, _runloop.schedule)("afterRender", function () {
var _document$querySelect2;
(_document$querySelect2 = document.querySelector(".hamburger-panel .menu-links a")) === null || _document$querySelect2 === void 0 ? void 0 : _document$querySelect2.focus();
});
},
请注意,我们仍应尝试确切了解哪些内容被转译、哪些未被转译,尽管这可能不是这里的问题所在。
如果我说错了请纠正 @pmusaraj,但我想,由于我们没有设置 preset-env,因此也没有定义目标,所以包含的每个插件都会被使用。因此,proposal-optional-chaining 肯定会被应用。
我觉得这样可以,我们也许只需要每年检查一次每个插件,并重新评估是否仍然需要?
找到了。只有 stable 分支出了问题,proposal-optional-chaining 在那里并未被应用。
在 tests-passed 中,?. 的变更包含了 proposal-optional-chaining 的变更:DEV: Enable optional chaining in all contexts (#13180) · discourse/discourse@855e854 · GitHub
而在 stable 分支中,仅进行了带有 ?. 的代码变更,但未调整转译器选项:UX: Add auto focus to hamburger and user menu dropdowns (#13165) · discourse/discourse@45dca79 · GitHub
是的,发现得很及时:
然而,五天前我们仅回退了原始提交,而未包含该插件:
@pmusaraj 我认为在稳定版中回退该插件应该也是安全的,您觉得呢?
同意,我们应该进行反向移植。我今天晚些时候会着手处理。
此问题已在稳定版(v2.7.4)中修复,Babel 的 proposal-optional-chaining 插件现已在该版本中启用,从而解决了该问题。
感谢 @RGJ @j.jaffeux(以及最初报告问题的 @vige)!
啊,这太合理了!代码已经稳定了,但转译器还没有。感谢你做的侦探工作!
非常感谢所有参与开发的同仁如此迅速地修复了此问题!
特此说明,根据我的测试,在某些情况下,此 bug 也影响了 Microsoft Edge Android 最新版本(据我所知,该版本并不运行 Gecko)。
能否麻烦您为该版本添加实际的 v2.7.4 标签?
我刚才花了半小时尝试 git checkout v2.7.4,结果发现该标签并不存在 ![]()
抱歉。现在已打标签。