跨文件共享AMD模块
share AMD modules across files
我正在建造余烬。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要求,并且仍然有浏览器化的版本工作。我不认为这个解决方案太丑,但我当然会对反馈感兴趣!
- AMD格式是否要求模块为单件
- 使用Socket.io的异步模块加载(AMD)
- 如何将多个 AMD 模块捆绑在一个文件中
- AMD 模块中的动态导出
- 使用 Babel 将 ES6 模块转换为 ES5 AMD 模块,无法按预期工作
- JavaFX+Javascript:如何将Java对象注入AMD模块
- Javascript应用程序作为具有外部依赖关系的AMD模块
- 如何将预编译的hogan.js模板封装到AMD模块中
- 当混合node和amd模块时,requirejs()返回undefined
- 将模块化JavaScript(RequireJS/AMD)与ASP.NET MVC绑定并缩小
- 从简单的模块模式迁移到RequireJS AMD
- 如何创建一个结构化为AMD模块的可重用库
- 我可以在网络工作者中加载AMD模块吗
- 如何从TypeScript编译中现有的AMD js类继承到AMD模块
- 如何在初始功能之外以适当的 AMD 方式使用自定义 Dojo 模块
- 使用磁带/ES6 单元测试测试 AMD 模块
- 如何将 AMD 模块从单例转换为实例
- 为什么串联的 RequireJS AMD 模块需要一个加载器
- 如何从道场层加载 AMD 模块
- 从前台检索后台页面的 AMD 模块