BlocklyNukkit WIKI

这里是BN百科

章节导览


模块化开发

本章节中,笔者将带您了解bn中的模块概念以及如何进行模块化开发,提高开发效率。

什么是模块

模块,在bn中被定义为函数和它们对应状态的集合,你可以简单地理解为,一个bn插件文件就是一个模块。 每当bn加载一个插件文件的时候,就会将它们转为模块,这个模块的名字就是这个插件文件的文件名,当文件名不符合仅有英文,下划线和数字且不以数字开头的规则时,该模块无法被任何其他插件引入。
由插件文件生成的模块,将包含这个插件中的全部函数、变量和导入,但是默认状态下,你无法从其他的插件通过正常的方式访问,只能够由该插件自身、bn解释器和nk服务器访问。

模块化的方式,有利于合理组织代码,避免大量代码逻辑混淆。

公开导出函数

上文提到,默认情况下模块的内容对于其他插件是不可访问的,但是bn提供了公开导出函数功能,可以将某一个插件内的函数公开,从而允许其他插件调用该函数。
这里我们将要导出的函数成为“导出函数”,将导出函数加上导出标记的过程称为“公开”。
各语言导出函数如下:

export function MyFun(arg1,arg2,arg3){}
@export
def MyFun(arg1,arg2,arg3):
    pass
function MyFun(ent)-->export

end
static function MyFun($event){
    
}

这样,我们就成功导出了MyFun函数

导入模块并调用导出函数

公开了导出函数之后,我们就可以在其他的bn插件中使用,这样的好处是可以将插件的各个部分分离,避免将大段不相干的代码放进 同一个文件导致文件长度过长,后续难以维护,不便多人开发。
要调用导出函数,我们首先需要导入模块。
实际上,一个模块就是一个java类,导入模块的方式跟导入java类是十分类似的。

通过require函数就可以引入模块。

var xxx = require("模块名");
var 返回值 = xxx.函数名(参数列表);

python中直接通过import语句就可以导入,导入后使用模块名加上.来调用其他模块中的导出函数。

import 模块名
返回值 = 模块名.函数名(参数列表)

也可以使用as来指定一个别名。

import 模块名 as xxx
返回值 = xxx.函数名(参数列表)

lua中可以使用luajava.bindClass来根据模块名引入其他模块,而后可以通过:来调用其他模块中的导出函数。

xxx = luajava.bindClass("模块名")
返回值 = xxx:函数名(参数列表)

可以使用import语句,而后通过模块名加::来调用导出函数。

import 模块名;
$返回值 = 模块名::函数名(参数列表);

自定义模块名

如果永远使用文件名作为模块名,一旦用户为了美观或格式统一等原因更改文件名,那么我们将导入错误的模块或导入失败,所以自定义模块名非常重要。
自定义模块名可以通过宏注释来实现,自定义的模块名必须要满足仅有英文,下划线,点和数字且不以数字开头的规则。
各语言自定义模块名的宏注释如下所示:

//pragma module xxxxx 
#pragma module xxxxx
--pragma module xxxxx
//pragma module xxxxx

插件多合一

显然,多个文件在分发上会带来一定的问题,所以,bn提供了bn插件包功能,用于将多个插件和它们的配置文件打包为一个插件,而后用户只需要下载一个bn插件包文件并放入bn文件夹即可,而且,打包完成之后的bn插件包还可以再打包为单个.jar文件,当作普通插件,放入./plugins文件夹加载。
bn插件包的拓展名为.bnp.bnpx,前者为单纯的插件和配置文件打包而成,后者为前者压缩加密后生成的归档文件。

要进行打包,请先进行以下确认:

  • 您打包的所有文件的文件名仅由大小写字母、数字、下划线和英文点组成,且不以数字和英文点开头
  • 您打包的插件代码文件都已经添加了语言种类标识注释
  • 您打包的插件代码没有语法错误

随后,您可以使用bnp命令,服务器控制台输入bnp build makefile路径即可构建一个bn插件包。

makefile是一个json格式的包配置文件,由name,compress,plugins三个字段组成,其中:

  • name为打包的插件包的名字(字符串)
  • compress为是否打出压缩加密插件包,即控制打出的bn插件包为.bnp还是.bnpx(boolean)
  • plugins是一个字符串数组,里面标注要打进包中的bn插件的路径,加载时从上到下加载,也可以打进去json yml xml txt格式的资源文件,资源文件将会被按顺序解压到打包时与nk核心的相对位置解压。

makefile示例:

{
    "name":"demo",
    "compress":false,
    "plugins":[
        "./plugins/BlocklyNukkit/mod.py",
        "./plugins/BlocklyNukkit/test.lua"
    ]
}

此示例将把./plugins/BlocklyNukkit/mod.py./plugins/BlocklyNukkit/test.lua打包为demo.bnp文件。


不满意?前往编辑此页面

导航