零件(Gadget),指储存在页面上的,实现某一特定功能的一组模板、文本、js和css集合,举个例子,就好比是Steam上的游戏mod,可以方便的搬运、删除,用来为自己的维基添加新的功能。

概述

零件的特点——将代码储存在页面上,使得更多的人可以参与到代码的贡献中,也使得代码更容易被更多人分享。与直接将代码粘贴到MediaWiki:Common.js中不同之处在于,零件可以实现模块化,从而可以实现彼此依赖或解耦。除此之外,每个用户可以在特殊:参数设置中自行控制每个零件的开启和关闭(仅限js和css部分)。

如何在Gadget中关联js和css

Javascrip和CSS有缓存,请用?debug=1来调试。
  1. 将代码储存到Gadget命名空间中。如Gadget:module-example.js, Gadget:module-example.css
  2. Gadget definition命名空间下编写Gadget定义文件。例如Gadget definition:example。定义文件是json格式,placeholder已经写好。关联的css文件应填写在“style”里,js文件则填写在“script”中。如果该零件是面向所有用户的,只要在default那里填true就行了。详情见下表。
  3. 用户可以在个人设置的小工具中,自行开启或关闭一些零件。在该页面中零件的名字需要到MediaWiki:Gadget-example中进行定义
  4. 如果这组gadget只在本维基启用,那么已经完成了!如果想分享给更多人,建议将它发布至灰机灰机workshop
Gadget_definition 作用 示例 默认效果
settings.right 只有拥有这个权限的用户才能启用这个gadget。 ["edit","editinterface"]等。 不需要权限
settings.default 是否默认向所有拥有权限的用户启用。 true, false 不启用
settings.hidden 是否在用户设置页面隐藏该gadget。 true, false 不隐藏
settings.skin 应用该gadget的皮肤。 bootstrapmediawiki 所有皮肤
settings.category 该Gadget的分类。
modules.scripts Gadget命名空间下的js页面。 ["script.js"]
modules.styles Gadget命名空间下的css页面。 ["style.css"]
modules.peers 该模块所依赖的CSS-only模块名。Peers将会早于页面加载。 ["ext.gadget.mycssgadget"]
modules.dependencies 该模块所依赖的模块。模块将会早于当前gadget加载,但是晚于peers和页面加载。 ["ext.gadget.myothergadget"]
modules.message MediaWiki命名空间下的文本。 ["some-localizations"]
modules.type
  • style:CSS部分在页面渲染完成前就会加载,避免页面重绘。
  • general:在页面加载后再异步加载。
style, general 目前有一个上游的bug,导致默认是style+general执行两次。(样式加载两遍)。以后会变为默认general。

自定义加载

很多情况下,全局默认加载并不能满足开发者的需求。在javascript代码中,可以自由的调用其他已存在的零件。

//假定我们填写了Gadget_definition:example。
if (mw.config.get('wgPageName') == 'Example') 
  mw.loader.load('ext.gadget.example');//仅在Example页面加载该Gadget。
mw.loader.getState('ext.gadget.example');//获得example的加载状态。ready为已加载,registered为未加载,null为零件不存在。
可参阅:https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.loader

如何在灰机workshop发布零件

  1. 将所需的页面搬运至灰机workshop
  2. Manifest命名空间下创建一个页面,填写Manifest的json。一部分代码已为您填好。
  3. page一栏内,键填写用到的页面名称,值填写历史版本,如果使用最新版本可以填*。
  4. map一栏内,键填写灰机workshop上的页面名。值填写下游维基的页面名。如果名称不变,可略过。
  5. 为零件添加说明文档。
  6. 您的零件已经发布完毕了!灰机工作人员会选择优秀版本推荐到灰机Workshop首页。

示例

互动地图是由User:Honestleaf编写的一组零件。

它包含5个文件:

  • MediaWiki:Gadget-map
  • Gadget:InteractiveMap.js
  • Gadget:InteractiveMap.css
  • Gadget_definition:map
  • Template:Map

它的定义页面是Templatemanager:Manifest:互动地图。查看该页面的源代码来学习如何编写定义。

因为代码已经在灰机workshop发布,所以点击 安装零件 就可以将之导入你的维基。

除此之外

零件除了包含js和css以外,还可以包含任何基于维基页面的内容。比如UI语言、译名表、样式集、Data等。零件允许维基开发者打造无限可能的自定义功能。

avatar
0

如欲卸载 由 workshop 导入的零件,是否 只需删除 其 子页面 及 相关页面? ("参数设置"的"小工具"栏内只能看到我自己所创建的零件,无类似一键卸载的捷径)

1年
avatar
Reasno
0

是的 自行删除即可

11个月
avatar
Honestleaf
0

@Reasno 零件该怎么设置dependency?

1年
avatar
Reasno
0

dependency影响加载顺序。比如A的js需要依赖B,那么A的dependency应设置为B,AB都要单独开启,设置了Dependency并不会自动加载B。

1年
avatar
Reasno
0

Gadget_definition:B对应的是ext.gadget.B

1年
avatar
Honestleaf
0

回复@Reasno: 那该怎么使用其他零件的资源呢?直接写进自己零件的Manifest里?还是在文档里指明需要其他零件?

1年
avatar
Reasno
0

回复@Honestleaf: 还是打包进来比较好。

1年
avatar
Reasno
0

回复@Honestleaf: 写进自己的Mainfest里是最方便的。你可以约定仔细需要的页面版本,这样依赖更新的话也不会break自己的code。

1年
avatar
Reasno
0

回复@Honestleaf:长远来看我们希望有一个类似NPM的东西来管理零件。不过这个看上去还很遥远。

1年
avatar
Honestleaf
0

回复@Reasno: 还有一个问题:如果说我吧其他零件的JS或CSS写进了我的Gadget_definition里,然后我在站点上同时装了那个零件和我的零件,这个会造成重复加载或冲突吗?

1年
avatar
Honestleaf
0

回复@Reasno: 如果我在Manifest里设置了页面版本,这只会影响用户在搬运时获得的版本吧?如果用户在搬运了我的零件(包括了依赖的资源)后,又自己搬运了依赖的零件,那么那些依赖的资源依然会变成后面搬运的零件中的内容吧?

1年
avatar
Reasno
0

回复@Honestleaf:回复@Honestleaf:是的。 这个问题没法在现有框架下解决。需要一个独立的依赖框架。

相信每个开发者看到这里都会有点激动。2.0.24版本预计于下星期发布。然而,一个版本并不足以解决以上提到的所有问题。比如,版本依赖关系仍然存有很多疑问。我们是否允许依赖的嵌套?是否引入版本号而不是总使用最新版本?需要像package manager一样加入package.json?我相信这些问题也不全都是灰机必须要解决的,正像pear、composer不是php的开发者搞的,npm不是nodejs的开发者搞的,也许不久的将来,能有强人做出一个灰机的package manager。
1年
avatar
Whyjxz14
0

链接好像有错误,打不开

1年
avatar
Reasno
0

2.0.25上线时就能打开了

1年
avatar
Reasno
0

回复@Reasno: 写错了 2.0.26

1年