你的第一个 Kotlin 版的 Firefox 插件


作者:Kirill Rakhman

译者:承香墨影

Kotlin 是我最喜欢的编程语言,在 Android 或 Server 等平台上,Java 代码最终会被编译成 Java 字节码,所以被这些平台快速的采用。但是,由于 Kotlin 也支持编译为 Javascript ,因此该语言也开始在 Web 生态系统中受到关注。

尽管已经有一些使用 Kotlin 编写的 Web 应用程序已经发布上线了,但是编写浏览器扩展插件的程序似乎一直被忽略。这就是为什么在这篇文章中,我们将探讨使用 Kotlin JS 编写 Firefox 的简单扩展插件的过程。

该扩展程序基于 Mozilla 官方的的 第一个插件Demo,并将简单地添加到 kotlinlang.org 网站的红色边框。

Mozilla 第一个插件:

https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Your_first_WebExtension

环境要求

为了测试我们的 Firefox 扩展插件,我们将使用 Mozilla 的 web-ext工具。要获得它,您需要先安装 node.js ,然后在终端中运行以下命令:

npm install --global web-ext

Web-ext 工具:

https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Getting_started_with_web-ext

除此之外,我们将使用 IntelliJ IDEA  2017.2.6和 Kotlin 插件版本 1.1.60 来开发扩展。

建立项目

在 Intelli IDEA 中,我们创建一个新的基于 Gradle 的项目并检查 Kotlin(JavaScript) 选项。

我们跟随向导,直到创建并打开空项目。

下一步,我们将启用 Kotlin JS 的 Dead Code Elimination 插件。这个插件是必要的,因为 Kotlin JS 程序需要引用 MB 级别大小的 Kotlin stdlib。但是,我们可以通过删除永远不会被调用的代码,来大幅度减少最终编译代码的大小。

要启用插件,只需将以下行添加到build.gradle文件中。

apply plugin: 'kotlin-dce-js'

创建插件的清单文件

在下一步中,我们添加 Firefox 扩展插件所需的清单文件。这个文件叫做 manifest.json,位于我们项目的根目录下。该文件应该有以下内容。

在这个文件中,我们什么了我们的扩展插件将匹配 *://kotlinlang.org/* 的网站中,注入内容扩展脚本。

项目内包含,并且最终会被执行的 js 代码,是Kotlin stdlib 中的 kotlin.js以及我们自己创建的的kt-borderify.js文件。

开始编码

接下来,我们 main.ktsrc/main/kotlin 目录中创建一个文件。每当有一个匹配的网站被在 Firefox 中加载,这段代码将被运行。

我们的插件程序的入口是一个标准的 main() 函数。在里面,我们访问 body文档并修改边框样式。

main() 函数内的代码与对应的 Javascript 代码功能类似。但是,我们看到,由于 document 中的 body 对象可能不存在,所以 Kotlin 的类型检查迫使我们使用安全调用操作员  ?.来防止异常。这是 Kotlin 提供的语言功能的一个亮点,以使代码更安全。

测试插件

现在是时候测试我们的扩展插件了。首先,我们需要编译我们的代码,并通过消除不会被调用的代码来缩小它的体积。这是通过运行 Gradle 任务完成的 runDceKotlinJs  。我们以 —continuous 模式运行任务,这样当我们对代码进行修改的时候,它会立即被重新编译。

你可以通过 IntelliJ IDEA 的 Run/Debug Configurations 窗口中,进行配置,并使用 Gradle 运行任务。

或者从命令行运行。

./gradlew runDceKotlinJs --continuous

接下来,我们使用该 web-ext 工具启动一个新的 Firefox 实例,通过它来安装并且运行我们编译好的扩展程序。

web-ext run

这些代码你可以直接从 IntelliJ IDEA 中内置的终端中运行。

在刚刚启动的浏览器中,我们导航到 https://kotlinlang.org/。我们迎来了一个美丽的红色边框,以证明扩展插件正常工作了。

现在,我们将边框的颜色从红色变为绿色。因此,我们必须修改我们的代码。

document.body?.style?.border = "5px solid green"

当我们再切换回 Firefox 时,我们看到(在短暂的延迟之后,因为需要编译)我们的改变被自动应用在 Firefox 上,而不需要我们运行任何命令。

小结

在这篇文章中,我们看到了如何在 Kotlin JS 中编写一个简单的 Firefox 扩展插件来注入一个内容脚本。必要的配置相当简单,我们没有遇到任何重大的障碍。此外,web-ext 提供的连续构建和实时重新加载扩展插件的工作流程也非常的舒适。

原文链接:

https://medium.com/@Cypressious/your-first-firefox-web-extension-in-kotlin-348fc907915

使用 Kotlin 编写 Firefox 插件,你觉得如何呢?和这位小哥交流发现他在写一个相关系列,如果你喜欢可以在文末留言,后续我会继续翻译这个系列最新的文章。

今天在承香墨影公众号的后台,回复『成长』。我会送你一些我整理的学习资料,包含:Android反编译、算法、设计模式、虚拟机、Linux、Kotlin、Python、爬虫、Web项目源码。

推荐阅读:

目前5000+人已关注加入我们


听说喜欢留言的人,运气都不会太差

点击『阅读原文』查看更多精彩内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值