Closed maboloshi closed 1 month ago
Turbo
动态内容加载技术项目: https://github.com/hotwired/turbo
Turbo 是由 Basecamp 开发的,用于加速网页导航,使页面在用户导航时不进行完整的页面刷新,而是仅更新页面的部分内容。
GitHub 使用了此技术
Turbo(前身为 Turbolinks)提供了一些事件供开发者监听,以便在页面导航或内容更新时执行特定操作。以下是一些常用的 Turbo 事件:
turbo:click
:
turbo:before-visit
:
turbo:visit
:
turbo:before-fetch-request
:
turbo:before-fetch-response
:
turbo:before-render
:
turbo:render
:
turbo:load
:
DOMContentLoaded
事件,但在每次 Turbo 导航后都会触发。turbo:frame-load
:
turbo:frame-render
:
turbo:submit-start
:
turbo:before-cache
:
以下是如何使用这些事件的示例代码:
// 在页面初始加载完成时执行
window.addEventListener('DOMContentLoaded', (event) => {
console.log('DOMContentLoaded');
executeTranslation();
});
// 在每次 Turbo 导航完成并渲染新内容后执行
document.addEventListener('turbo:load', (event) => {
console.log('Turbo load');
executeTranslation();
});
// 监听其他 Turbo 事件
document.addEventListener('turbo:click', (event) => {
console.log('Turbo click', event);
});
document.addEventListener('turbo:before-visit', (event) => {
console.log('Turbo before visit', event);
});
document.addEventListener('turbo:visit', (event) => {
console.log('Turbo visit', event);
});
document.addEventListener('turbo:before-fetch-request', (event) => {
console.log('Turbo before fetch request', event);
});
document.addEventListener('turbo:before-fetch-response', (event) => {
console.log('Turbo before fetch response', event);
});
document.addEventListener('turbo:before-render', (event) => {
console.log('Turbo before render', event);
});
document.addEventListener('turbo:render', (event) => {
console.log('Turbo render', event);
});
document.addEventListener('turbo:frame-load', (event) => {
console.log('Turbo frame load', event);
});
document.addEventListener('turbo:frame-render', (event) => {
console.log('Turbo frame render', event);
});
document.addEventListener('turbo:submit-start', (event) => {
console.log('Turbo submit start', event);
});
document.addEventListener('turbo:before-cache', (event) => {
console.log('Turbo before cache', event);
});
function executeTranslation() {
// 使用 CSS 选择器找到页面上的元素,并将其文本内容替换为预定义的翻译
transBySelector();
if (page === "repository") { // 仓库简介翻译
transDesc(".f4.my-3");
} else if (page === "gist") { // Gist 简介翻译
transDesc(".gist-content [itemprop='about']");
}
}
DOMContentLoaded
事件确保代码在初始加载时执行。turbo:load
事件确保代码在每次 Turbo 导航完成后执行。通过监听这些事件,你可以在 GitHub 页面导航和内容动态加载时执行特定的功能,确保你的代码在合适的时机运行。
- 监听
body
变化,优化突变翻译处理
确保只监控必要的属性和类型的变更,这可以减少MutationObserver的开销。
尽可能使用单一的MutationObserver实例来监控所有需求,避免创建多个观察者,因为这可能会消耗更多资源。
代码中已经包含了translationCache的缓存机制。确保在翻译规则发生变化时更新或清除缓存。
优化翻译逻辑,采用更高效的字符串操作技巧,并尽量减少DOM查找次数。
注意性能影响,特别是在处理大型文档或频繁的DOM变更时。
- 监听
body
变化,优化突变翻译处理
处理的一些建议?(来自通义灵码)
哈哈果然是AI, 不过可能还是chatGPT
跟智能一点
- 监听
body
变化,优化突变翻译处理
处理的一些建议?(来自通义灵码)
目前,考虑
lastFilteredMutations
记录上一次处理的突变记录。上一次traverseNode
引发的突变一定在这个lastFilteredMutations
里且小于它lastFilteredMutations
作为被过滤的条件之一
document-start
脚本载入机制, 导致存在一些 bug, 打算使用window.addEventListener('DOMContentLoaded', init);
延迟init
的载入 (灵感来自 buiawpkgew1/github-chinese#98)window.addEventListener('DOMContentLoaded', ...)
document.addEventListener('turbo:load', ...)
代替setTimeout
更新page
更新逻辑使用Turbo
原生的before-fetch-request
事件及detail.url
对象 最快获取新页面的url
. 目前,发现对于需要class
筛选的效果不好监视document.body
的class
属性变化即可githubstatus.com
与skills.github.com
8cfcfb69getPage
函数 c2dd05dtraverseNode
和transElement
函数 a9979fb8body
变化,优化突变翻译处理
mutations.filter
过程中,提前过滤:字符数据
的变更 95b0d8fc进一步探讨MutationObserver.takeRecords()
(灵感来自 buiawpkgew1/github-chinese#98)ignoreMutationSelectorPage
规则,仅对突变
翻译有效使用lastFilteredMutations
记录上一次处理的突变记录。上一次traverseNode
引发的突变一定在这个lastFilteredMutations
里且小于它。在下轮过滤突变时,将lastFilteredMutations
作为被过滤的条件之一reIgnoreClass
,reIgnoreItemprop
,ignoreId
,ignoreTag
是否区分全局和特定页面page
变化的忽略规则、正则规则数组等 e0e5fc547249cc8a0e703bb87fa09b3454a1018d