要实现Lua的热更新,首先要了解Lua的模块加载机制,热更新的核心就是替换package.loaded中的模块。

加载规则:

包管理库提供了从Lua中加载模块的基础库。只有一个导出函数直接放在全局环境中:require。所有其他的部分都导出在表package中。

require(modname)

查询全局缓存表package.loaded:这个函数首先查找package.loaded表,检测modname是否被加载过。如果被加载过,require返回package.loaded[modname]中保存的值。否则,它试着为模块寻找加载器。

通过package.searchers查找加载器:require遵循package.searchers序列的指引来查找加载器。如果改变package.searchers中的序列,也会改变require如何查找一个模块的方式。

查找加载器:首先require查找package.preload[modname]。如果这里有一个值(必须是一个函数),则为加载器。否则require会使用Lua加载器去查找package.path的路径。如果查找失败,接着使用C加载器去查找package.cpath的路径。如果都失败了,再尝试一体化加载器(参见package.searchers详解)

加载器调用规则:每当找到一个加载器,require都用两个参数调用加载器:modname和一个在获取加载器过程中得到的参数(如果是通过查找文件得到的加载器,这个额外的参数即为文件名)。如果加载器返归非空值,require将这个值赋给package.loaded[modname]。如果加载器没能返回一个非空值用于赋给package.loaded[modname]require 会将true赋给 package.loaded[modname]。 无论加载器返回什么结果,require都会为package.loaded[modname]设置最终值。

报错:在加载或运行模块时有错误,或是无法为模块找到加载器,require都会抛出错误。

package.loaded

存储已经被加载的模块:当require一个modname模块得到的结果不为假时,require返回这个存储的值。requirepackage.loader中获得的值仅仅是对那张表(模块)的引用,改变这个值并不会改变require使用的表(模块)。

package.preload

保存一些特殊模块的加载器:这里面的值仅仅是对那张表(模块)的引用,改变这个值并不会改变require使用的表(模块)。

package.path

Lua加载器的搜索路径:使用环境变量LUA_PATH_5_3LUA_PATH初始化。或者采用luaconf.h中的默认路径。环境变量中的所有";;"都会被替换为默认路径。

package.cpath

C加载器的搜索路径:使用环境变量LUA_CPATH_5_3LUA_CPATH初始化。或者采用luaconf.h中定义的默认路径。

package.searchers

require查找加载器的表:这个表内的每一项都是一个查找器函数。当加载一个模块时,require按次序调用这些查找器,传入modname作为唯一参数。此方法会返回一个函数(模块的加载器)和一个传给这个加载器的参数。或返回一个描述为什么没有找到这个模块的字符串或者nil

Lua共有四个查找器函数:

第一个查找器就是简单的在package.preload表中查找;

第二个查找器用于查找Lua库的加载库。它使用存储在package.path中的路径查找工作。查找过程和函数package.searchpath描述的一致;

第三个查找器用于查找C库的加载库。它使用存储在package.coath中的路径查找工作。查找过程和函数package.searchpath描述的一致;

第四个搜索器是一体化加载器,从C路径中查找指定模块的根名字。

除了第一个搜索器外,每个搜索器都会返回找到的模块的文件名。这和package.searchpath的返回值一样,第一个搜索器没有返回值。

package.searchpath(name, path[,sep[,,rep]])

在指定的path中搜索指定的name:路径是一个包含一些列分号分隔的模板构成的字符串。对于每个模板,都会用name替换其中的每个问号(前提是有问号)。且将其中的sep(点".")替换为rep(系统的目录分隔符"/")。谈候场时打开这个文件名。

例如,如果路径是字符串  "./?.lua;./?.lc;/usr/local/?/init.lua"  

搜索foo.a 这个名字将一次尝试打开文件./foo/a.lua      ./foo/a.lc   以及 /usr/local/foo/a/init.lua

返回第一个可以用读模式打开(并马上关闭该文件)的文件的名字。如果不存在这样的文件,返回nil加上错误的消息。(错误消息列出了所有尝试打开的文件名)

Lua热更原理以及加载规则相关推荐

  1. Spring Cloud Alibaba基础教程:Nacos配置的加载规则详解

    <Spring Cloud Alibaba基础教程>连载中,关注我一起学期!前情回顾: <使用Nacos实现服务注册与发现> <支持的几种服务消费方式> <使 ...

  2. 在Flutter中更快地加载您的图像资源

    本文主要介绍在Flutter中更快地加载您的图像资源 我们可以将图像放在我们的资产文件夹中,但如何更快地加载它们?这是 Flutter 中的一个秘密函数,可以帮助我们做到这一点 - precacheI ...

  3. 一步步学习微软InfoPath2010和SP2010--第九章节--使用SharePoint用户配置文件Web service(2)--在事件注册表单上创建表单加载规则...

    下面练习中,你将添加表单加载规则,将四个文本框域和图片控件与用户配置文件web service连接.当使用用户配置文件web service时,你需要将控件和来自web service合适的域绑定.这 ...

  4. 浏览器是直接加载二进制图片更快还是加载base64编码的图片更快?

    问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键内容,没有改进余地 浏览器是直接加载二进制图片更快还是加载base64编码的图片更快?哪个效率更高? 例如: <img src ...

  5. 一步步学习微软InfoPath2010和SP2010--第九章节--使用SharePoint用户配置文件Web service(2)--在事件注册表单上创建表单加载规则

    下面练习中,你将添加表单加载规则,将四个文本框域和图片控件与用户配置文件web service连接.当使用用户配置文件web service时,你需要将控件和来自web service合适的域绑定.这 ...

  6. Drools6.4动态加加载规则之(三)kie-wb与kie-server的集群应用

    1.说明 本例讲解的是使用6.4.0.Final版本kie-wb(drools workbench)与 kie-server(KIE Execution Server)的集群搭建,:使用wildfly ...

  7. Android插件化原理—ClassLoader加载机制

    前面<Android 插件化原理学习 -- Hook 机制之动态代理>一文中我们探索了一下动态代理 hook 实现了 启动没有在 AndroidManifest.xml 中显式声明的 Ac ...

  8. drawable和values的加载规则

    Google搞了一大套hdpi.xhdpi之类的这些东西,简单说来,就是为了让我们轻松实现"与设备密度无关的视觉大小一致性",注意这里的"视觉大小一致性",就是 ...

  9. Unity 游戏用XLua的HotFix实现热更原理揭秘

    本文通过对XLua的HoxFix使用原理的研究揭示出来这样的一套方法.这个方法的第一步:通过对C#的类与函数设置Hotfix标签.来标识需要支持热更的类和函数.第二步:生成函数连接器来连接LUA脚本与 ...

最新文章

  1. android matrix 简书,android matrix
  2. python解包裹_关于Python中包裹传参和解包裹的理解
  3. shardingjdbc每月分表_shardingjdbc分库分表测试
  4. Loss Function view
  5. java设置属性的取值范围是多少_jvm-Java系统属性的范围
  6. Linux网络协议栈:NAPI机制与处理流程分析(图解)
  7. python oracle query,python链接oracle/plsql数据库 ,查询功能(query) 用cursor fetchall
  8. terminal mysql 停止_转载MySQL之终端(Terminal)管理MySQL
  9. Perf -- Linux下的系统性能调优工具
  10. 群晖nas存储系统原理_群晖NAS入门教程第四节:群晖存储空间管理员功能和磁盘阵列类型的简介...
  11. 黑莓9000和9900哪个好_入手黑莓9900,黑莓手机9900怎么样?
  12. 局域网内两台电脑ping不通
  13. error: exportArchive: No signing certificate “iOS Distribution“ found
  14. 高防IP防护效果怎么样?甜甜告诉您
  15. html5 canvas爆炸,html5 canvas彩色爆炸的小球动画特效
  16. 【生活】如何线上办理持有广州社保人员的异地分娩医保登记 - 定点医院 - 异地就医报销相关
  17. java面试题saas
  18. 小明加密通道进入_「成都全接触」最新!成都8条地铁进展来了!年底还有5条铁路、9条通道!...
  19. 一个优秀的Linux学习网址(中文)
  20. 近期用户/金蝶等ERP系统 MS SQL Server 数据库故障 典型恢复案例

热门文章

  1. jquery 绘图工具 flot 使用
  2. NFC对于大家真的实用吗
  3. android studio计时器怎么用,android - Android Studio:启动倒数计时器时应用崩溃
  4. 10bit为什么比8bit节省带宽
  5. 互联网晚报 | 10月14日 星期四 | 钉钉宣布用户数破5亿;顺丰王卫将出任嘉里物流董事会主席;字节跳动巨量引擎进军职业教育...
  6. 机器学习——科学计算库(Numpy,Matplotlib,Pandas)
  7. 互联网在线学习系统需求分析
  8. 七夕情节人,适合给IT男朋友送什么专属礼物?
  9. java timezone prc_TimeZone
  10. ZYNQ从放弃到入门(八)-PS和PL交互