我想拦截Aurelia的模块加载以重定向某些调用。
为了做这些事情,aurelia-loader有一个addPlugin()
接口。您可以向资源添加!myplugin
之类的后缀,以标记应使用该插件加载它。
现在,当我使用自己的组件执行此操作时,它会加载JS文件,但HTML模板的名称会混乱。从资源名称 my-comp!myplugin 开始,它将加载 my-comp.js ,但尝试查找 my-comp!myplugin.html 这与插件名称不再匹配。
我在这里提供了一个问题:https://gist.run/?id=c7ed477bc652540ed8b0702d843f1832
main.js 中的加载程序插件代码基本上是:
loader.addPlugin('gate', {
fetch(address) {
console.info('Intercepted:', address);
var tmpParts = address.split('.');
var extension = tmpParts[tmpParts.length - 1].toLowerCase();
if (extension == 'css') {
console.debug('Loading as styles', address);
return loader.loadText(address);
} else if(extension == 'html') {
console.debug('Loading as template:', address);
return loader.loadTemplate(address);
} else {
console.debug('Loading as module:', address);
return loader.loadModule(address);
}
}
});
在模板中使用它(在gist中用问题1 标记):
<require from="./comp2!gate"></require>
之后应该可以像这样加载组件:
<comp2></comp2>
或者甚至喜欢这样:
<compose view-model="./comp2!gate"></compose>
相反,模板的名称搞砸了,浏览器控制台说:
无法加载资源:服务器响应状态为404()
模板的预期名称为https://gist.host/run/1485182959149/comp2.html!gate
(包括插件)
如何修复加载程序插件才能正常工作?
加载器为aurelia-loader-default
1.0.0,JSPM为0.16.39,Node为6.5.0,NPM为3.10.5。
我添加了第二个gist.run:https://gist.run/?id=1ddd4233e3afc40d89eb64b751e1dd8f
它有点短。当我使用@useView
中的comp2.js
装饰器(标有问题4 )指定视图时,它可以正常工作 - 但我无法使用@useView
指定加载程序插件。我希望它能够使用相同的加载器插件加载视图,或者能够使用@useView
指定加载器插件。
好的,我找到了一个解决方案,看起来它可以使用更少的代码和修补,它可以在两个要点之间工作。
这个要点包含外部组件comp3
:
https://gist.run/?id=dc837978a514011e13c872dbad92ae3f
这个要点是基本的Aurelia应用程序,带有插件和加载器的applyPluginToUrl
方法的小补丁:
https://gist.run/?id=39e6fdacefc9e5c69b42a5e8c9049384
如果gist网址已修复,则应该适用于所有人。 Aurelia应用程序从第一个要点加载comp3
并显示它(您在comp3视图中看到紫色边框定义)。
目前有一点需要注意:不支持CSS,因为SystemJS将扩展名.js
添加到它们中,看起来我必须要处理它。
我不喜欢loader.applyPluginToUrl
的路径,但SystemJS并不真正支持插件链接,因此顺序必须正确。此解决方案还需要所有外部组件设置@useView
,包括加载程序插件。
有更好的方法吗?