如何使用aurelia(jspm)中的加载器插件拦截组件加载?

时间:2017-01-23 20:41:14

标签: aurelia jspm aurelia-loader

我想拦截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!gate.html

模板的预期名称为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指定加载器插件。

好的,我找到了一个解决方案,看起来它可以使用更少的代码和修补,它可以在两个要点之间工作。

这个要点包含外部组件comp3https://gist.run/?id=dc837978a514011e13c872dbad92ae3f

这个要点是基本的Aurelia应用程序,带有插件和加载器的applyPluginToUrl方法的小补丁: https://gist.run/?id=39e6fdacefc9e5c69b42a5e8c9049384

如果gist网址已修复,则应该适用于所有人。 Aurelia应用程序从第一个要点加载comp3并显示它(您在comp3视图中看到紫色边框定义)。

目前有一点需要注意:不支持CSS,因为SystemJS将扩展名.js添加到它们中,看起来我必须要处理它。

我不喜欢loader.applyPluginToUrl的路径,但SystemJS并不真正支持插件链接,因此顺序必须正确。此解决方案还需要所有外部组件设置@useView,包括加载程序插件。

有更好的方法吗?

0 个答案:

没有答案