Web 工人允许您在诸如Firefox之类的浏览器中在后台运行代码。这是将其构建到Firefox扩展中的方法,这与在页面上正常创建一个扩展略有不同。这样做的文档基本上不存在,所以希望您’ll find 这个 useful.
请确保您具有与开发环境相似的开发环境 在我以前的帖子中描述过。
工人如何工作?
- / 数据 /中的工作程序未直接连接到/ LIB /中的脚本
- 但是,他们可以通过相互发送消息进行通信
- 这些消息仅是文本,因此可以包含序列化的JSON,但仅此而已
- 您’下面会注意到,我们基本上只是在两个脚本之间添加消息
工人的代码
导航到/ 数据 /目录并创建一个名为hello_world.js的文件
1 2 3 4 5 6 |
> 密码 /用户数/脆弱的/文件资料/测试 > ls 数据 LIB 包.json 测试 > 光盘 数据/ > vim 你好,世界.js |
现在在其中粘贴以下内容(vim的新用户,请按 i to start typing and 退出 followed 通过 :q to save):
1 2 3 4 5 |
//工人的代码 自.消息 = 功能(信息FromClient) { 自.postMessage("你好 " + 信息FromClient.数据); }; |
这就是说,只要工作人员从客户端收到一条消息,然后将消息发送回“Hello” prepended.
这里的一个注意事项:在工人中,您可以’使用有用的功能 安慰.日志(“信息”) , 在stead use 倾倒(“信息”)
让’从主代码中调用工人
让’导航回到 /LIB/ folder and edit the 主要.js 文件,这是在扩展程序中运行的第一件事。
1 2 |
> 光盘 ../LIB/ > vim 主要.js |
粘贴以下代码:
1 2 3 4 5 6 7 |
变种 工人 = 新 工人(“ 你好,世界.js”); 工人.消息 = 功能(e) { 安慰.日志(e.数据); }; 工人.postMessage(“马修”); |
然后跑 cfx 跑 . 您’会发现一个混乱的错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
> cfx 跑 使用 二元 在 '/Applications/Firefox.app/Contents/MacOS/firefox-bin'. 使用 个人资料 在 '/var/folders/p1/zzdzcrrx6pq96hgsmy5xjqmh0000gp/T/tmpgFixDP.mozrunner'. 安慰.错误: 测试: 信息: ReferenceError: 工人 是 不 定义的 叠放: @资源://jid1-zmowxggdley0aa-at-jetpack/test/lib/main.js:1:9 CuddlefishLoader/选项<.加载@资源://gre/modules/commonjs/sdk/loader/cuddlefish.js:129:18 跑@资源://gre/modules/commonjs/sdk/addon/runner.js:138:19 启动/</<@资源://gre/modules/commonjs/sdk/addon/runner.js:81:7 处理程序.原型.处理@资源://gre/modules/Promise-backend.js:865:23 这个.无极行者.沃克环@资源://gre/modules/Promise-backend.js:744:7 ************************* A 编码 例外 原为 抛出 在 a 诺言 解析度 打回来. 看到 https://developer.mozilla.org/Mozilla/JavaScript_code_modules/Promise.jsm/Promise 充分 信息: ReferenceError: 工人 是 不 定义的 充分 叠: @资源://jid1-zmowxggdley0aa-at-jetpack/test/lib/main.js:1:9 CuddlefishLoader/选项<.加载@资源://gre/modules/commonjs/sdk/loader/cuddlefish.js:129:18 跑@资源://gre/modules/commonjs/sdk/addon/runner.js:138:19 启动/</<@资源://gre/modules/commonjs/sdk/addon/runner.js:81:7 处理程序.原型.处理@资源://gre/modules/Promise-backend.js:865:23 这个.无极行者.沃克环@资源://gre/modules/Promise-backend.js:744:7 ************************* 安慰.错误: 测试: 信息: ReferenceError: 工人 是 不 定义的 叠放: @资源://jid1-zmowxggdley0aa-at-jetpack/test/lib/main.js:1:9 CuddlefishLoader/选项<.加载@资源://gre/modules/commonjs/sdk/loader/cuddlefish.js:129:18 跑@资源://gre/modules/commonjs/sdk/addon/runner.js:138:19 启动/</<@资源://gre/modules/commonjs/sdk/addon/runner.js:81:7 处理程序.原型.处理@资源://gre/modules/Promise-backend.js:865:23 这个.无极行者.沃克环@资源://gre/modules/Promise-backend.js:744:7 |
啊哈!这里的关键是: ReferenceError: 工人 是 不 定义的 。这是因为Firefox扩展程序改用了ChromeWorker。我们需要将其粘贴在main.js中,方法是将其粘贴在顶部:
1 |
变种 {ChromeWorker} = 要求(“铬”) |
并将引用hello_world.js文件的行更改为调用ChromeWorker:
1 2 |
// 变种 工人 = 新 工人(“ 你好,世界.js”); //删除此 变种 工人 = 新 ChromeWorker(“ 你好,世界.js”); //添加它 |
好吧让’尝试再次运行它!尝试 cfx 跑 。 WTF另一个错误?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
> cfx 跑 使用 二元 在 '/Applications/Firefox.app/Contents/MacOS/firefox-bin'. 使用 个人资料 在 '/var/folders/p1/zzdzcrrx6pq96hgsmy5xjqmh0000gp/T/tmpJJXeC4.mozrunner'. 安慰。错误: 测试: 信息: 错误: 格式错误 脚本 URI: 你好,世界.js 叠放: @资源://jid1-zmowxggdley0aa-在-喷气背包/测试/LIB/主要.js:3:14 CuddlefishLoader/选项<。加载@资源://格蕾/模组/普通js/sdk/装载机/ud鱼.js:129:18 跑@资源://格蕾/模组/普通js/sdk/添加在/跑步者.js:138:19 启动/</<@资源://格蕾/模组/普通js/sdk/添加在/跑步者.js:81:7 处理程序。原型。处理@资源://格蕾/模组/诺言-后端.js:865:23 这个.PromiseWalker.walkerLoop@资源://格蕾/模组/诺言-后端.js:744:7 安慰。错误: 测试: 信息: 错误: 格式错误 脚本 URI: 你好,世界.js 叠放: @资源://jid1-zmowxggdley0aa-在-喷气背包/测试/LIB/主要.js:3:14 CuddlefishLoader/选项<。加载@资源://格蕾/模组/普通js/sdk/装载机/ud鱼.js:129:18 跑@资源://格蕾/模组/普通js/sdk/添加在/跑步者.js:138:19 启动/</<@资源://格蕾/模组/普通js/sdk/添加在/跑步者.js:81:7 处理程序。原型。处理@资源://格蕾/模组/诺言-后端.js:865:23 这个.PromiseWalker.walkerLoop@资源://格蕾/模组/诺言-后端.js:744:7 |
这里的关键是: 格式错误 脚本 URI: 你好,世界.js 。此隐秘错误是因为Firefox可以’尚未访问 /数据/ 夹。我们必须使用SDK的另一部分来启用对其的访问。
打开 主要.js 并将其放在顶部:
1 |
变种 自 = 要求(“ sdk /自我”); |
现在我们可以使用该功能 自.数据.网址() 。当您将文件名作为第一个参数时,它将返回一个字符串,例如 资源://jid1-zmowxggdley0aa-at-jetpack/test/data/whatever_file.js 在扩展名的情况下正确地引用它。修改工作程序导入行,如下所示:
1 2 |
//让worker = 新 工人(“ 你好,世界.js”); //删除此 让 工人 = 新 ChromeWorker(自.数据.网址(“ 你好,世界.js”)); //添加这个 |
现在让’使用以下命令再次运行扩展程序 cfx 跑 :
1 2 3 4 |
> cfx 跑 使用 二元 在 '/Applications/Firefox.app/Contents/MacOS/firefox-bin'. 使用 个人资料 在 '/var/folders/p1/zzdzcrrx6pq96hgsmy5xjqmh0000gp/T/tmppvMjZp.mozrunner'. 安慰.日志: 测试: 你好 马修 |
是的,它有效!工人退回了消息“你好 马修“.
常问问题
- 这是什么 {符号} mean?
它的简写为:
1 2 |
变种 铬 = 要求(“铬”) 变种 工人 = 铬[“ ChromeWorker”] |
基本上这意味着 要求(“铬”) 返回一个Object,我们只需要键引用的值“ChromeWorker”。这是从JavaScript对象提取内容的非常简洁的方式,将来会派上用场。
- 为什么现在将Worker称为ChromeWorker?我们在用Google Chrome做些什么吗?
这是一个命名巧合,与浏览器中的Chrome无关。在这种情况下,Chrome指的是Firefox插件内部。