跨文件共享AMD模块

share AMD modules across files

本文关键字:模块 AMD 文件共享      更新时间:2023-09-26

我正在建造余烬。SimpleAuth库——为Ember.js应用程序实现身份验证/授权的库(https://github.com/simplabs/ember-simple-auth/tree/sub-packages)。例如,该库具有对Ember.js应用程序的用户进行身份验证的功能。该身份验证可以通过不同的策略完成(例如,使用凭据登录,通过Facebook登录等)。我现在想做的是拆分库这样每个人都会在他们的应用中包含基础库和一些策略库。例如:

<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可以全局访问。当然,这看起来不太好。有更好的方法吗?还是我做错了什么?

我找到了一个解决问题的方法。这个问题只存在于库的浏览器化版本中,每个库都用自己的加载器等编译成自己的文件。当使用"真正的"AMD时,所有正在使用的文件都注册在同一个加载程序上,这个问题就不存在了,因为所有文件都看到所有注册的导出,并且可能暗示彼此需要。所以我改变了扩展库,使用常规的AMD要求,只更新了浏览器化的版本,使它们包括"假"AMD定义的组件,他们依赖,例如:

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

这样我就可以在所有地方使用干净的AMD要求,并且仍然有浏览器化的版本工作。我不认为这个解决方案太丑,但我当然会对反馈感兴趣!