加载指定的模块。首先函数会在 package.loaded 这个表中查看是否已经加载 了 modname 这个模块。如果是,那么 require 会返回保存在 package.loaded[modname]的值。否则它将尝 试去查找一个加载该模块的加载器。

require 是由 package.searchers 引导来查找加载器的 。修改 package.searchers 可以修改 require 查找模块的方式。下面的解释是基于默认配置的 package.searchers。

require 首先查询 package.preload[modname]是否有值,是则该值(应该是个函数)为加 载器,否则 require 根据保存在 package.path 的路径去查找 Lua 加载器。如果找不到,那就 根据保存在 package.cpath 的路径去查找,如果还是找不到,那么会尝试使用一个 “集成” (all-in-one)的加载器(参考 package.searchers)。

一旦找到了加载器, require 会以两个参数去调用它,这两个参数为模块名及一个用来 表示如何找到加载器的额外参数 。(如果加载器来自某个文件,那额外参数就是该文件名) 如果加载器返回一个非空的值, require将该返回值赋值给 package.loaded[modname],否则 将 true 赋值给 package.loaded[modname] 。不管哪种情况, require 都会返 回 package.loaded[modname] 的值。

如果在加载或执行模块时发生了错误,或者无法找到任何该模块的加载器, require 会 唤起一个错误。

总结:

1.pageage.preload 一个保存指定模块加载器的 table 要找到一个加载器,require首先查询package.preloaded[modname].如果它有值,该值(应该是一个函数)就是加载器.如果没值require使用package.path中存储的路径查找一个Lua的加载器.如果该查找也失败,它使用package.cpath中存储的路径查找一个C语言加载器(C loader).如果还是失败,它尝试使用all-in-one加载器

package.preload['pl'] = function()
local str = load_pl_from_c()
local fn = loadstring(str)
return fn()
end
package.preload ["foo"] = function () print "loading foo" end require "foo" --> loading foo

2.一旦找到一个加载器,require使用单个的参数modname调用加载器.如果加载器返回任何值,require将其赋值给package.loaded[modname].如果加载器没有返回值且没有给package.loaded[modname]赋与任何值,则require为该条目赋值为true.

3.package.path = package.path .. ";src/"  添加搜索路径

lua的模块加载require的更多相关文章

  1. requirejs:模块加载(require)及定义(define)时的路径小结

    原文地址:http://www.tuicool.com/articles/7JBnmy 接触过requirejs的童鞋可能都知道,无论是通过define来定义模块,还是通过require来加载模块,模 ...

  2. requirejs:模块加载(require)及定义(define)时的路径理解

    给新来的实习生普及下JS基本知识,看到比较好的文章 转载https://blog.csdn.net/xuxiaoping1989/article/details/52384778 接触过require ...

  3. 模块加载(require)及定义(define)时的路径

    最近新公司在用requireJS进行JS的整合,刚开始接触有点蒙,于是深入了解了一下.requireJS主要是为了解决一下两个问题: (1)实现js文件的异步加载,避免网页失去响应: (2)管理模块之 ...

  4. 彻底搞清楚javascript中的require、import和export(js模块加载规范的前世今生)

    为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,在es6以前,它是不支持”类”(class),所以也 ...

  5. Node.js require 模块加载原理 All In One

    Node.js require 模块加载原理 All In One require 加载模块,搜索路径 "use strict"; /** * * @author xgqfrms ...

  6. [JavaScript] 前端模块加载简单实现(require)

    模块加载的简单实现 (function(win) { var baseUrl; var paths; var script_cache = {}; var script_queue = []; var ...

  7. 实现一个类 RequireJS 的模块加载器 (二)

    2017 新年好 ! 新年第一天对我来说真是悲伤 ,早上兴冲冲地爬起来背着书包跑去实验室,结果今天大家都休息 .回宿舍的时候发现书包湿了,原来盒子装的牛奶盖子松了,泼了一书包,电脑风扇口和USB口都进 ...

  8. node模块加载层级优化

    模块加载痛点 大家也或多或少的了解node模块的加载机制,最为粗浅的表述就是依次从当前目录向上级查询node_modules目录,若发现依赖则加载.但是随着应用规模的加大,目录层级越来越深,若是在某个 ...

  9. 使用RequireJS并实现一个自己的模块加载器 (一)

    RequireJS & SeaJS 在 模块化开发 开发以前,都是直接在页面上引入 script 标签来引用脚本的,当项目变得比较复杂,就会带来很多问题. JS项目中的依赖只有通过引入JS的顺 ...

随机推荐

  1. 第一个go的web程序;调用七牛云存储的音频api问题解决;条件搜寻文件中的内容,字符串拼接+在上一行

    package main import ( "html/template" "io" "io/ioutil" "log" ...

  2. eclipse 找类的jar包方便工具

    经常在开发过程,因为使用到比较多的类库(jar文件),在开发时经常会找不到需要的类文件存放在哪个jar文件中,这时classlocator这个插件就带我们带来极大的方便,可以帮我很快速的找到我们需要的 ...

  3. DPDK无法分出连续大页面(contiguous hugepages)的几个解决方法

    在使用DPDK或者SPDK的时候,需要在进程刚启动的时候使用rte_eal_init初始化Environment Abstract Layer,应用进程会通过这个函数告诉EAL为它映射多大的hugep ...

  4. @Transient注解的使用

    转自:https://blog.csdn.net/sinat_29581293/article/details/51810805 java 的transient关键字的作用是需要实现Serilizab ...

  5. oracle安装后listener.ora文件

    # listener.ora Network Configuration File: D:\Develop\oracle11g\product\11.2.0\dbhome_1\network\admi ...

  6. linux shell 脚本攻略学习4

    1.cat命令详解 cat 是concatnate(拼接)的简写. 语法: cat file1 file2 file3 .... 作用:将文件内容拼接在一起进行输出 具体应用: 1).压缩空白行 加上 ...

  7. TCP_NODELAY 和 TCP_NOPUSH的解释

    一.问题的来源 今天看到 huoding 大哥分享的 lamp 面试题,其中一点提到了: Nginx 有两个配置项: TCP_NODELAY 和 TCP_NOPUSH ,请说明它们的用途及注意事项. ...

  8. mysql/mariadb基于ssl的主从复制

    当mysql/mariadb跨越互联网进行复制时别人可以窃取到mysql/mariadb的复制信息, 这些信息是明文的, 因此存在不安全性, 这里通过ssl对复制的信息进行加密 1. 创建证书中心 在 ...

  9. MYSQL IN 与 EXISTS 的优化示例介绍

    优化原则:小表驱动大表,即小的数据集驱动大的数据集. ############# 原理 (RBO) ##################### select * from A where id in ...

  10. []如何在Windows 10中更改文件夹背景颜色

    ini文件.我们甚至可以使用相同的技术将图片设置为文件夹背景. 已有工具可以更改Windows 7中Windows资源管理器背景的颜色,并将图像设置为Windows 7中的文件夹背景,但这些工具与Wi ...