|
| 1 | +--- |
| 2 | +author: |
| 3 | + - name: windingwind |
| 4 | + url: https://github.com/windingwind/ |
| 5 | + - name: northword |
| 6 | + url: https://github.com/northword/ |
| 7 | +--- |
| 8 | + |
| 9 | +# 引导脚本 |
| 10 | + |
| 11 | +引导脚本即 `bootstrap.js`,这是 Zotero 插件的入口脚本文件,此文件必须存在,否则插件将无法被安装。 |
| 12 | + |
| 13 | +## 内容 |
| 14 | + |
| 15 | +这个文件里必须包含以下几个钩子,Zotero 将在对应动作发生时调用对应的钩子。 |
| 16 | + |
| 17 | +### 生命周期钩子 |
| 18 | + |
| 19 | +```js |
| 20 | +// 插件被安装时调用 |
| 21 | +function install(data, reason) {} |
| 22 | + |
| 23 | +// 插件启动时调用 |
| 24 | +function startup(data, reason) {} |
| 25 | + |
| 26 | +// 插件被禁用时或 Zotero 被关闭时调用 |
| 27 | +function shutdown(data, reason) {} |
| 28 | + |
| 29 | +// 插件被卸载时调用 |
| 30 | +function uninstall(data, reason) {} |
| 31 | +``` |
| 32 | + |
| 33 | +插件生命周期挂钩传递两个参数: |
| 34 | + |
| 35 | +- 具有以下属性的对象: |
| 36 | + - `id` ,插件 ID |
| 37 | + - `version` ,插件版本 |
| 38 | + - `rootURI` ,指向插件文件的字符串 URL。对于 XPI,这将是 `jar:file:///` URL。该值始终以斜杠结尾,因此您可以附加相对路径来获取与插件捆绑的文件的 URL(例如 `rootURI + 'style.css'` )。 |
| 39 | +- 表示事件原因的数字,可以根据以下常量进行检查: `APP_STARTUP` 、 `APP_SHUTDOWN` 、 `ADDON_ENABLE` 、 `ADDON_DISABLE` 、 `ADDON_INSTALL` 、 `ADDON_UNINSTALL` 、 `ADDON_UPGRADE` 、 `ADDON_DOWNGRADE` |
| 40 | + |
| 41 | +任何与特定窗口无关的初始化都应由 `startup` 触发,删除应由 `shutdown` 触发。 |
| 42 | + |
| 43 | +### 窗口钩子 |
| 44 | + |
| 45 | +```js |
| 46 | +// Zotero 主窗口加载完毕时调用 |
| 47 | +function onMainWindowLoad({ window }) {} |
| 48 | + |
| 49 | +// Zotero 主窗口被关闭时调用 |
| 50 | +function onMainWindowUnload({ window }) {} |
| 51 | +``` |
| 52 | + |
| 53 | +窗口钩子传递一个参数: |
| 54 | + |
| 55 | +- 具有包含目标窗口的 window 属性的对象 |
| 56 | + |
| 57 | +在某些平台上,主窗口可以在 Zotero 会话期间多次打开和关闭,因此任何与窗口相关的活动,例如修改主 UI、添加菜单或绑定快捷方式都必须由 `onMainWindowLoad` 执行以便新的主窗口包含您的更改。 |
| 58 | + |
| 59 | +然后,当调用 `onMainWindowUnload` 时,您必须删除对窗口或其中的对象的所有引用,取消任何计时器等,否则每次关闭窗口时都会有造成内存泄漏的风险。添加到窗口的 DOM 元素会在窗口关闭时自动销毁,因此只需删除 `shutdown()` 中的元素即可,可以通过循环遍历所有窗口来完成: |
| 60 | + |
| 61 | +```js |
| 62 | +function shutdown() { |
| 63 | + var windows = Zotero.getMainWindows(); |
| 64 | + for (let win of windows) { |
| 65 | + win.document.getElementById("make-it-red-stylesheet")?.remove(); |
| 66 | + } |
| 67 | +} |
| 68 | +``` |
| 69 | +
|
| 70 | +(目前仅支持一个主窗口,但有些用户可能会找到打开多个主窗口的方法,这将在未来版本中正式支持。) |
| 71 | +
|
| 72 | +::: tip |
| 73 | +
|
| 74 | +通常地,在 `startup` 中初始化插件地本地化系统、首选项、兼容性等,在 `onMainWindowLoad` 中初始化与 Zotero UI 有关的组件,如菜单、侧边栏、自定义列等。 |
| 75 | +
|
| 76 | +::: |
| 77 | +
|
| 78 | +## 样例 |
| 79 | +
|
| 80 | +关于 `bootstrap.js` 的样例,可参考前章提到的插件框架。它将插件的根对象注册到全局变量 `Zotero` 中,在任何引入了 Zotero 的位置均可使用。 或参考 Zutilo 插件。它将插件的根对象注册为一个全局变量。缺陷是在非主窗口内引入插件代码将较为复杂。 |
| 81 | +
|
| 82 | +- [Zotero-addon-template/bootstrap.js at bootstrap · windingwind/Zotero-addon-template](https://github.com/windingwind/zotero-addon-template/blob/main/addon/bootstrap.js) |
| 83 | +- [Zutilo/bootstrap.js at master · wshanks/Zutilo](https://github.com/wshanks/Zutilo/blob/master/addon/bootstrap.js) |
| 84 | +
|
| 85 | +下面是以官方示例 `Make It Red` 的 `bootstrap.js`,它在 `startup()` 中通过 `Services.scriptloader.loadSubScript(rootURI + "make-it-red.js");` 将插件脚本载入,在 `make-it-red.js` 中,在 `Zotero` 下定义了一个对象 `MakeItRed`。在 `make-it-red.js` 加载完成后,调用 `MakeItRed` 对象下的方法完成插件初始化。 |
| 86 | +
|
| 87 | +```js |
| 88 | +var MakeItRed; |
| 89 | + |
| 90 | +function log(msg) { |
| 91 | + Zotero.debug("Make It Red: " + msg); |
| 92 | +} |
| 93 | + |
| 94 | +function install() { |
| 95 | + log("Installed 2.0"); |
| 96 | +} |
| 97 | + |
| 98 | +async function startup({ id, version, rootURI }) { |
| 99 | + log("Starting 2.0"); |
| 100 | + |
| 101 | + Services.scriptloader.loadSubScript(rootURI + "make-it-red.js"); |
| 102 | + MakeItRed.init({ id, version, rootURI }); |
| 103 | + MakeItRed.addToAllWindows(); |
| 104 | + await MakeItRed.main(); |
| 105 | +} |
| 106 | + |
| 107 | +function onMainWindowLoad({ window }) { |
| 108 | + MakeItRed.addToWindow(window); |
| 109 | +} |
| 110 | + |
| 111 | +function onMainWindowUnload({ window }) { |
| 112 | + MakeItRed.removeFromWindow(window); |
| 113 | +} |
| 114 | + |
| 115 | +function shutdown() { |
| 116 | + log("Shutting down 2.0"); |
| 117 | + MakeItRed.removeFromAllWindows(); |
| 118 | + MakeItRed = undefined; |
| 119 | +} |
| 120 | + |
| 121 | +function uninstall() { |
| 122 | + log("Uninstalled 2.0"); |
| 123 | +} |
| 124 | +``` |
| 125 | +
|
| 126 | +## 参考资料 |
| 127 | +
|
| 128 | +- [Zotero 7 for developers](https://www.zotero.org/support/dev/zotero_7_for_developers) |
| 129 | +- [bootstrapped-extension framework](https://www.devdoc.net/web/developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Bootstrapped_Extensions.html#Bootstrap_entry_points) |
0 commit comments