最近在建设新站。需要自己写很多的 Widget 和 Gadget,所以现在总结一下这两者的区别。
其实两者本质上都非常相似,就是向页面内插入一段内容。只是插入的方式不一样。
首先我们要知道,MediaWiki 的条目基本内容是用户写的 wiki 语言,不是前端开发常用的 HTML/CSS/JavaScript。通常写条目,最多只能写一些受限的 HTML 元素,一些元素无法使用。CSS 也只能通过 templatestyles 扩展导入,而且它也是受限的,会把 CSS 做一遍预处理。这些限制主要出于安全的考虑。
而 Widget 和 Gadget 的用途,就是避开这些限制,直接在网页中写 HTML/CSS/JavaScript。它们的区别总结起来就是以下内容:
Widget 是在一个条目中插入的一段代码。你在调用 Widget 的时候可以传入一些参数。
Gadget 是页面加载时就会插入到<head>的 CSS 样式或者 JavaScript 脚本,对全站生效。其中一部分可以在用户参数设置里面选择打开或关闭。
所以,如果你在 Widget 中写了 JavaScript 和 CSS,每插入一次 Widget 就会插入一次这些代码。如果你希望避免重复插入,可以使用 Widget 自带的 Smarty 模板语法,使用类似避免 C/C++ 的头文件被重复引入的方法,定义一个全局变量:
<!--{if !isset($wgBilibiliCount) || !$wgBilibiliCount}-->
<!--{assign var="wgBilibiliCount" value=true scope="global"}-->
<script>...<script>
<!--{/if}-->
Gadget 是全站生效的,所以也要注意不要放太多的 Gadget,会导致全站加载速度变慢。