设置全局 require

以下是我的代码示例

function initializeWorld()
    _G.require = function(name)
            if package.loaded[name] == nil then
                    local result, err = external.MyAPIEndpoint:LUAInclude(name .. '.lua')
                    if err == nil then
                        if result ~= nil then
                                package.loaded[name] = result
                        else
                                package.loaded[name] = true
                        end

                        return package.loaded[name]
                    else
                        local errTxt = err .. "\r\n" .. debug.traceback()
                        error(errTxt, 1)
                    end
            else
                    return package.loaded[name]
            end
    end

    helloWorld = require("helloWorld")
    print(helloWorld.welcome())
end

function initializeUniverse()
    _G.require = function(name)
            if package.loaded[name] == nil then
                    local result, err = external.MyAPIEndpoint:LUAInclude(name .. '.lua')
                    if err == nil then
                        if result ~= nil then
                                package.loaded[name] = result
                        else
                                package.loaded[name] = true
                        end

                        return package.loaded[name]
                    else
                        local errTxt = err .. "\r\n" .. debug.traceback()
                        error(errTxt, 1)
                    end
            else
                    return package.loaded[name]
            end
    end

    helloUniverse = require("helloUniverse")

    print(helloUniverse.welcome())

end

如您所见,全局 require 在两个不同的地方都被使用。一次在 initializeWorld,另一次在 initializeUniverse

我能否修改代码,使其只加载一次?

谢谢

点赞
用户4984564
用户4984564

你可能不应该覆盖全局的 require 函数。如果你想要运行第三方或用户代码,你可以将其放入沙盒中,否则你可以使用其他名称,例如 my_require()load_awesome_stuff()

我假设你不知道 initializeWorld()initializeUniverse() 中的哪一个函数被最先调用,但无论哪种情况,以下解决方案都适用。

只需将函数定义为某个名称(任何你最喜欢的名称即可),但如果可能的话应避免使用全局的 require,在某个确保在这两个初始化函数之前运行它的时刻。然后你可以在这两个函数中使用它。如果你想让它叫做 require,你可以在函数体中本地定义它,例如 local require = my_require; require "some_stuff"

2016-08-27 12:13:27