跨文件共享AMD模块

时间:2014-03-21 15:50:41

标签: javascript amd

我目前正在构建Ember.SimpleAuth库 - 一个用于为Ember.js应用程序实现身份验证/授权的库(https://github.com/simplabs/ember-simple-auth/tree/sub-packages)。那个库,例如具有验证Ember.js应用程序用户的功能。该认证可以通过不同的策略来完成(例如,使用凭证登录,通过Facebook登录等)。我现在要做的是拆分库,这样每个人都可以在他们的应用程序中添加基本库以及许多策略库。 e.g:

<script src="../tmp/ember-simple-auth.js"></script>
<script src="../tmp/ember-simple-auth-oauth.js"></script>

要构建库我使用ES6模块转换器将我的源字段转换为AMD,然后我使用加载器构建可以在浏览器中运行的版本:https://github.com/simplabs/ember-simple-auth/blob/sub-packages/vendor/loader.js

现在的问题是策略库依赖于基础库中的东西。但由于两个文件都有自己的模块加载器,其中包含不同的模块注册表,因此一个文件无法看到其他文件中定义的模块。我目前正在做的是在加载器中定义一个全局可访问的模块注册表:

global.__ember_simple_auth_registry__ = global.__ember_simple_auth_registry__ || {};
var registry = global.__ember_simple_auth_registry__, seen = {};

以便Ember.SimpleAuth定义的所有模块都可以全局访问。但那当然看起来并不是很好。那有更好的方法吗?或者我一般做错了什么?

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。这个问题实际上只存在于库的浏览器版本中,其中每个库都使用自己的加载器编译到自己的文件中。当使用“真正的”AMD时,所有正在使用的文件都使用相同的加载器进行注册不存在,因为所有文件都看到所有已注册的导出,并且可能意味着彼此需要。因此,我将扩展库更改为使用常规AMD要求,并且仅更新了浏览器版本,以便它们包含对他们所依赖的组件的“假”AMD定义,例如:

define('ember-simple-auth/stores/base',  ['exports'], function(__exports__) {
  __exports__.Base = global.Ember.SimpleAuth.Stores.Base;
});

这样我可以使用干净的AMD需要到处都是,并且仍然有浏览器版本工作。我不认为解决方案太难看了,但我当然对反馈很感兴趣!