【问题标题】:How can one create a reusable library structured as AMD module(s)?如何创建一个结构为 AMD 模块的可重用库?
【发布时间】:2025-12-14 18:45:01
【问题描述】:

我们正在创建一个打算在多个项目中使用的框架。所有项目都将使用 require.js 来管理模块和依赖项。

理想情况下,我想使用 r.js 优化器将框架编译成单个文件,该文件可以提供给使用它的应用程序。该文件将包含框架的所有模块,以便在我的应用程序中我可以编写如下代码:

define(["framework/util/a", "framework/views/b"], function(A, B) {
  var a = new A();
  // etc...
});

但这种方法似乎存在两个问题。

  1. 取决于framework/util/a 不会告诉require.js 它需要加载framework.js,它会在其中找到util/a
  2. 优化工具为包含在framework.js 中的所有模块生成名称,例如define("util/a", function() { ... } ); 即使加载了framework.js 的r​​equire.js,也没有什么可以告诉它定义的模块util/a 是@987654329 的相对模块@ 并因此被标识为framework/util/a

我是否遗漏了什么,或者是将我的框架构建为 CommonJS 包 并使用 require.js 的 packages 配置选项的更好方法?

【问题讨论】:

  • 我认为没有合理的方法可以做到这一点。来自@jrburke:“只是'以源代码形式在目录中分发模块',没有构建。”

标签: javascript requirejs js-amd


【解决方案1】:

Re: 1. 似乎 r.js 优化确实不是为了优化部分依赖树而设计的,因为延迟加载取决于文件路径。例如。要求path/to/module 实际加载path/to 似乎是一种黑客行为。一种解决方案是放弃延迟加载并在您的应用程序代码上方包含framework-built.js

Re: 2. 所以你现在需要你的framework-built.js 和完整的路径。一种方法是构建一个需要所有framework 的虚拟父级,比如dummy-framework.js。这样您的dummy-framework-built.js 将拥有为framework 定义的完整路径,如果不是延迟加载,它应该可以正常工作。

免责声明:我没有太多使用 require.js,尽管这是我的最大努力 :)

【讨论】:

  • 感谢您的努力。你的方法让我最接近我想要的 - 绝对值得投票。但是,与 jrburke 的快速对话告诉我,我可能根本不想编译库,而只是分发整个源文件夹。
  • 我也和 James 聊过,自从我发这个之后也学到了更多。请参阅*.com/questions/12302440/… 我回答了我自己的问题。因此,我通过使用自定义 paths 进行实时延迟加载来实现“框架”应用程序,在本地生产中,我通过将这些相同的路径指向本地“框架”来构建,这只是一个同级文件夹。