从模块加载特定的方法.设计模式

Load particular methods from module. Design patterns

本文关键字:方法 设计模式 模块 加载      更新时间:2023-09-26

我最近开始使用RequireJS,它使我能够以一种很好的方式组织我的代码。于是,definerequire成了我最好的朋友。但是现在我看到了一个问题,我不知道如何用RequireJS或某些特定的设计模式来解决这个问题。想象一下,我有一个非常大的模块包含无数的方法。我这样定义它:

define(function(BIG_MODULE){
    return {
        property_0: "value_0",
        property_1: "value_1",
        ....
        property_zillion: "value_zillion",
        method_0: function(){...},
        ...
        method_zillion: function(){...}
    }
});

请,不要问我,为什么我有这么大的模块-它只是一个抽象。所以,现在的问题是-如果有可能导入或require不是整个模块,但它的一些属性和方法?假设我以某种方式将我的模块分配给了某个本地实例,如果我调查这个实例的内部,然后我可以看到,它只包含一些特定的属性和方法。这可能吗?

您绝对应该做的一件事是不要导出任何不打算成为模块公共API一部分的内容。

也就是说,RequireJS没有只导入模块的一部分的概念。当您将一个模块列为依赖项时,RequireJS将加载该模块,加载并执行其依赖项,使用解析的依赖项调用其工厂函数(这是传递给define的函数),并记录模块导出的内容。然后,当您在其他地方使用它时,模块的导出值将绑定到回调中相应的参数。在这段代码中
require(["foo"], function (foo) {...

你得到foo模块"foo"导出的所有内容。

如果你使用ES6(又名ES2015),并将ES6模块转换为AMD模块(例如,通过Babel),那么你可以有一些基于语言的部分导入概念。例如,如果foo像这样导出return { bar: 1, baz: 2, bwip: 3 },那么您只能像这样导入bar:

import { bar } from "foo";
console.log(bar);

这将把1输出到控制台。但是请注意,这不会改变RequireJS加载和处理模块的方式。RequireJS读取整个模块并执行所有的工厂函数。上面的import只影响加载"foo"的代码如何访问导出的值。