使用 Kotlin 编写你的第一个 Firefox WebExtension 扩展

Kotlin 是我最喜爱的编程语言。我们已经知道 Kotlin 编译成 Java 字节码可以快速被安卓和服务端采用。事实上,Kotlin 还支持编译成 JavaScript,因此该语言也开始在 Web 生态系统中受到关注。

尽管已经发布了许多 Kotlin 编写的 Web 应用程序,但至今人们都忽略了 Kotlin 还可以写浏览器扩展插件。所以我写了这篇文章,和大家一起探讨使用 Kotlin JS 编写一个简单的 Firefox 扩展插件的过程。

这个扩展程序基于 Mozilla 的 “你的第一个扩展程序”,可简单地给网站 kotlinlang.org 添加一个红色的边框。

环境要求

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

npm install --global web-ext

此外,还需要使用IntelliJ IDEA 2017.2.6 和 1.1.60 版本的 Kotlin 插件来开发扩展程序。

配置项目

打开 Intelli IDEA,创建一个新的 Gradle 基础项目,并勾选 Kotlin(JavaScript) 选项。

使用 Kotlin (JavaScript) 创建一个新工程

我们继续按照向导的步骤执行,直到创建并打开空项目。

下一步,启用 Kotlin JS 的 Dead Code Elimination 插件。这步非常重要,因为 Kotlin JS 程序需要捆绑超过兆字节大小的 Kotlin stdlib。但我们可以通过删除无用的代码来大幅度减少编译的代码量。

要启用这个插件,只需要在 build.gradle 文件中添加下面这行代码。

apply plugin: ‘kotlin-dce-js‘

创建扩展清单
在下一步中,我们会添加 Firefox 扩展所需的清单文件。这个文件被命名为 manifest.json,位于我们项目的根目录下。该文件应包含如下内容:

{
  "manifest_version": 2,
  "name": "Kotlin Borderify",
  "version": "1.0",
  "description": "Adds a red border to kotlinlang.org",
  "content_scripts": [
    {
      "matches": [
        "*://kotlinlang.org/*"
      ],
      "js": [
        "build/classes/kotlin/main/min/kotlin.js",
        "build/classes/kotlin/main/min/kt-borderify.js"
      ]
    }
  ]

在这个文件中,我们声明我们的扩展将在匹配模式为 ://kotlinlang.org/ 的任何网站中注入一个内容脚本。 其必要的脚本文件是 Kotlin stdlib kotlin.js 以及我们在 kt-borderify.js 文件中的代码。
代码
接下来,在 src/main/kotlin目录下新建 main.kt文件。当匹配到的网站被加载时,代码便会执行。代码的入口是标准的main函数。在main函数里,我们获取了文档的 body 并修改了它的边框样式。

import kotlin.browser.document
fun main(args: Array<String>) {
    document.body?.style?.border = "5px solid red"
}

main 函数的这段代码类似于 JavaScript 代码。但可以看到因为文档的 body 可能是不存在的,因此这个类型系统会强制我们使用安全操作符(safe-call operator) ?. 来防止异常的发生。这是 Kotlin 提供的有特色的语法特性,使得开发更容易而且代码更安全。
##扩展测试
现在是时候测试我们的扩展了。首先,需要编译我们的代码,并通过消除没用的代码对它进行压缩。这是通过运行Gradle任务的runDceKotlinJs来完成的。为了能让代码在被修改时立即编译,我们以持续(continous)模式运行任务。

可以在 IntelliJ IDEA 通过创建一个运行配置或者命令行来运行 Gradle 任务。

Intellij IDEA 运行配置以持续编译 Kotlin JS 代码

或者通过命令行来运行

./gradlew runDceKotlinJs --continuous

接下来,我们在终端使用 web-ext 工具启动一个新的 Firefox 实例来运行我们的已安装的扩展。

web-ext run

提示:IntelliJ IDEA 有一个内置终端

只要运行浏览器,导航至 kotlinlang.org,就能看到会显示一个漂亮的红色边框,这说明扩展能正常工作。

我们第一个有效的 Kotlin Firefox 扩展

现在我们把边框颜色颜色由红改为绿色。修改代码为:

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

当我们切换回 Firefox 时,我们看到(短暂的延迟后,重新编译需要时间)改变自动地生效了,而我们不用去运行任何命令。
##
总结
在这篇文章中,我们看到了如何通过 Kotlin JS 编写一个简单的 Firefox 扩展来注入一个内容脚本。步骤相当简单,我们也没有遇到重大的障碍。此外,包含了持续构建和实时重载扩展的工作流程也十分让人满意。

原文地址:https://blog.51cto.com/14284753/2383567

时间: 2025-01-25 02:03:03

使用 Kotlin 编写你的第一个 Firefox WebExtension 扩展的相关文章

Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程

Android For JNI(六)--交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程 终于回到我们的android了,我们先要配置这个NDK的环境,但是之前,我们还要了解一下基本的术语 一.交叉编译 在一个平台下编译出另一个平台可以执行的二进制程序 CPU平台:ARM X86 MIPS(指令集) 系统平台:windows linux mac 原理:模拟另一个平台的特性去编译程序 源代码-->预编译-->编译-->链接-->可执行程序 工具链:一个工具使用自动调用下一

Kotlin教程学习-dataclass,objectclass,use函数,类扩展,socket

Kotlin提供了一些机制来扩展已有的类,如下: 还记得我们之前写过的Point3D类吗?(将其略作修改,将成员变量改为Double类型) 让我们为其扩展一个length函数 扩展的方法很简单,只要在函数名前面加上类名就行了. 这样Point3D的对象就有了一个名为length的方法. 运行的结果不出所料: 除此之外,在Kotlin中还有一些特殊的类,比如Data Class: 有些类只包含数据,不需要包含方法,就可以声明为data class,当然data class并不是不能包含方法. da

编写易于删除,而不是易于扩展的代码

原文链接 http://programmingisterrible.com/post/139222674273/write-code-that-is-easy-to-delete-not-easy-to 翻译:马琳 校对:郭晓磊,汤涛 感谢郭晓磊同学对文章地改动.感谢汤涛叔叔的大力支持.文章在正月初九翻译完毕,一直未发.由于编程经验有限.翻译难免有不正确的地方.欢迎大家纠正错误. 编写易于删除,而不是易于扩展的代码 "毫无目的地去编码,将会导致无法维护和删除" -- Jean-Paul

如何开始一个模块化可扩展的Web App(转)

原文链接:http://avnpc.com/pages/start-a-modular-extensible-webapp 日志未经声明,均为AlloVince原创.版权采用『 知识共享署名-非商业性使用 2.5 许可协议』进行许可. 虽然从没有认为自己是一个前端开发者,但不知不觉中也积累下了一些前端开发的经验.正巧之前碰到一道面试题,于是就顺便梳理了一下自己关于Web App的一些思路并整理为本文. 对于很多简单的网站或Web应用来说,引入jQuery以及一些插件,在当前页面内写入简单逻辑已经

C#获取一个文件的扩展名

C#获取一个文件的扩展名System.IO.Path.GetExtension( "文件名 ");ChangeExtension   更改路径字符串的扩展名. Combine   合并两个路径字符串. GetDirectoryName   返回指定路径字符串的目录信息. GetExtension   返回指定的路径字符串的扩展名. GetFileName   返回指定路径字符串的文件名和扩展名. GetFileNameWithoutExtension   返回不具有扩展名的指定路径字符

Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,elasticsearch安装配置及中文分词

http://fuxiaopang.gitbooks.io/learnelasticsearch/content/  (中文) 在Elasticsearch中,文档术语一种类型(type),各种各样的类型存在于一个索引中.你也可以通过类比传统的关系数据库得到一些大致的相似之处: 关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns) Elasticsearch ⇒ 索引 ⇒ 类型 ⇒ 文档 ⇒ 字段(Fields)一个Elasticsearch集群可以包含多个索引(数据库),也就是说其

编写我的第一个CGI代码——python学习

在编程学习网站学习Python语言,学习到cgi编程章节遇到了一些小问题,课程介绍的为linux环境的Apache配置方法,具体如下: [linux环境配置方法:] 在进行CGI编程前,确保您的Web服务器支持CGI及已经配置了CGI的处理程序. Apache 支持CGI 配置: 设置好CGI目录: ScriptAlias /cgi-bin/ /var/www/cgi-bin/ 所有的HTTP服务器执行CGI程序都保存在一个预先配置的目录.这个目录被称为CGI目录,并按照惯例,它被命名为/var

随手记录一个 firefox的backgroundPostion-x和-y的问题

今天帮大师写了一天项目,后来在测试一个显示升序和降序的标签上面,我使用了一个backgroundPosition-y来判断当前icon的状态,却无法不管是使用闭包还是个钟手段,在 firefox下面总是无法正常的显示.纠结了好久后来终于发现..原来 firefox人家压根不支持把这个分开写 只支持这种写法 obj.style.backgroundPosition:x y; 尴尬啊...我还以为 以为是自己坑了.. 明天继续 写项目..顺便看刚到的书.

编写你的第一个Linux内核模块(目前校对到杂项设备)

想要开始黑掉核?没有线索不知道如何开始?让我们向你展示如何做- 内核编程通常被视为黑魔法.在Arthur C Clarke的意义上说,它可能是.Linux内核与用户空间有很大的不同:抛开漫不经心的态度,你要格外小心,因为在你代码中的一个小小的bug都会影响整个系统.这里没有简单的方法来做浮点运算.堆栈既固定又小,你写的代码总是异步所以你需要考虑并发性.尽管如此,Linux内核是一个非常大而复杂的C程序,对每个人都是开放的(阅读.学习.提高),而你也可以成为其中的一部分. "最简单的方法开始内核编