You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让MediaWiki扩展加载mediawiki.js与mediawiki.base.js?

解决MediaWiki扩展中mw未定义的错误

我正在维护一个已废弃的MediaWiki扩展,已在GitHub分叉该项目,尝试让MediaWiki加载定义mw.util的基础JavaScript,但出现了错误。

PHP代码

$wgOut->addModules(['mediawiki', 'mediawiki.base', 'mw.util']);
//$wgOut->addScriptFile("{$wgScriptPath}/resources/src/mediawiki.base/mediawiki.base.js");
$wgOut->addScriptFile("{$wgScriptPath}/extensions/SemanticMediaWikiGraph/includes/js/d3_v4.min.js");
$wgOut->addScriptFile("{$wgScriptPath}/extensions/SemanticMediaWikiGraph/includes/js/utility.js");
$wgOut->addScriptFile("{$wgScriptPath}/extensions/SemanticMediaWikiGraph/includes/js/app.js");

JS错误信息

jquery-3.6.3.js:4114 jQuery.Deferred exception: mw is not defined ReferenceError: mw is not defined
    at HTMLDocument.<anonymous> (https://www.tematichedigenere.com/extensions/SemanticMediaWikiGraph/includes/js/utility.js:3:5)
    at mightThrow (https://code.jquery.com/jquery-3.6.3.js:3830:29)
    at process (https://code.jquery.com/jquery-3.6.3.js:3898:12) undefined

问题原因

使用addScriptFile直接加载自定义JS文件时,这些文件会优先于MediaWiki核心模块(包括定义mw对象的mediawiki.base)执行,导致代码调用mw.util时mw对象还未完成初始化。

解决方案

方法1:注册MediaWiki资源模块(推荐)

MediaWiki的资源模块系统会自动处理依赖加载顺序,需在扩展的extension.json中注册自定义脚本为资源模块并声明依赖:

"ResourceModules": {
    "ext.semanticMediaWikiGraph.d3": {
        "scripts": ["includes/js/d3_v4.min.js"],
        "localBasePath": "",
        "remoteExtPath": "SemanticMediaWikiGraph"
    },
    "ext.semanticMediaWikiGraph.utility": {
        "scripts": ["includes/js/utility.js"],
        "dependencies": ["mediawiki", "mediawiki.base", "mw.util"],
        "localBasePath": "",
        "remoteExtPath": "SemanticMediaWikiGraph"
    },
    "ext.semanticMediaWikiGraph.app": {
        "scripts": ["includes/js/app.js"],
        "dependencies": ["ext.semanticMediaWikiGraph.utility", "ext.semanticMediaWikiGraph.d3"],
        "localBasePath": "",
        "remoteExtPath": "SemanticMediaWikiGraph"
    }
}

随后修改PHP代码,替换addScriptFile为addModules:

$wgOut->addModules([
    'ext.semanticMediaWikiGraph.d3',
    'ext.semanticMediaWikiGraph.utility',
    'ext.semanticMediaWikiGraph.app'
]);

方法2:在JS中等待依赖加载

若暂时不想修改资源模块配置,可在utility.js开头用mw.loader.using确保依赖加载完成后再执行代码:

mw.loader.using(['mediawiki.base', 'mw.util']).then(function() {
    // 将原来utility.js中的所有代码放置在此回调函数内
    $(document).ready(function() {
        // 业务逻辑代码
    });
});

内容的提问来源于stack exchange,提问作者Revious

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:20:31