用持久数据给 Tampermonkey 加速百倍

2018-04-12 06:38:36 +08:00
 autoxbc

Tampermonkey 默认的 ES6 模板的工作流程是实时 Babel 转码,然后 eval 执行

存在的问题就是 Babel 的性能非常差,我的 5500 行自用脚本转码并执行需要 3400 ms,每一个页面都延迟这么长时间是不可忍受的

解决方法是用持久数据存储转码后的脚本,GM_getValue 和 GM_setValue 的用法教程里可以查到。添加存储后,每次修改代码并运行会完整转码一次,然后再次运行仅耗时 30ms,提速比较明显

一个简化的模板

// ==UserScript==
// @name        ES6
// @match        *://*/*
// @require      https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.26.0/polyfill.js
// @grant        GM_getValue
// @grant        GM_setValue
// ==/UserScript==

/* jshint ignore:start */
const text = (<><![CDATA[
/* jshint ignore:end */
    /* jshint esnext: false */
    /* jshint esversion: 6 */

    // Your code here...
    
/* jshint ignore:start */
]]></>).toString();
/* jshint ignore:end */

if( text !== GM_getValue('esText') )
{
    GM_setValue('esCode', Babel.transform( text , { presets: [ 'latest' ] } ).code );
    GM_setValue('esText', text );
}

eval( GM_getValue('esCode') );
3746 次点击
所在节点    分享发现
5 条回复
Servo
2018-04-12 08:53:36 +08:00
Tampermonkey 是不是开源的?
yangxin0
2018-04-12 08:54:26 +08:00
5.5k 行有点可怕
ctsed
2018-04-12 08:59:38 +08:00
转 es5 再提交啊
oott123
2018-04-12 09:02:05 +08:00
我觉得能用 tamper monkey 的浏览器本身基本上对新语法特性都支持了,不如去掉转译…
autoxbc
2018-04-12 21:12:35 +08:00
@oott123 #4 适当调整 Babel,把已经实做的部分交给浏览器原生执行是可行的,应该会减少编译时间并提升性能

不过彻底去掉转义比较困难,毕竟 Babel 的功能不仅仅是 Next Generation JavaScript,很多插件是不可替代的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/446095

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX