【问题标题】:Composing a large'ish Aurelia app - multiple apps on one page编写一个大型的 Aurelia 应用程序 - 一个页面上的多个应用程序
【发布时间】:2019-02-25 20:11:17
【问题描述】:

所以我有一个由功能组成的大型应用程序。每个功能都可以通过一个菜单访问,该菜单实质上加载了一个包含该特定功能的 aurelia 应用程序的网页。这工作得很好,因为它允许我一次完成一个功能,并在我去的时候使用可能不同的客户端技术。

但是,我现在需要在一个页面上拥有多个 Aurelia 应用:上面描述的“功能”应用和始终位于顶部导航栏中的“导航栏”应用。因此安排如下。

我正在使用带有 aurelia webpack 插件的 webpack。我已经尝试了各种安排来让它发挥作用,但我动不动就遇到问题。我当前的模型是从单个 webpack 配置文件手动引导“功能”应用和“导航”应用:

entry: {
    packages: [
        "main","nav"
    ]
},

在每个模块中我手动引导,例如:

bootstrap((aurelia: Aurelia) => {
    // init code
    aurelia.start())
    .then(() => aurelia.setRoot(PLATFORM.moduleName("app"), document.querySelector("#packages-app")));});

因此,“功能”应用被加载到特定的 DOM 元素中,类似于“导航”应用。

我的问题

  1. 这是一种受支持甚至是适当的功能拆分方式吗?
  2. 我似乎在一个模块中获得了影响另一个模块的代码。 DI注入到每个应用程序的模块中的Aurelia组件是否具有共享状态?

【问题讨论】:

    标签: aurelia


    【解决方案1】:

    这是一个完全有效的场景,正如您在 Aurelia Webpack Plugin - aureliaApp option - "module not found" 的另一个问题中所回答的那样

    这是一种受支持甚至是适当的功能拆分方式吗?

    是的,这是一个完全有效的场景,你可能并不孤单

    我似乎在一个模块中获得了影响另一个模块的代码。 DI注入到每个应用程序的模块中的Aurelia组件是否有任何共享状态?

    通常在 Aurelia 应用程序中,DI 用于处理此问题。所以你可以做的是 提前注册你的 store 实例,例如:

    // in your index.ts
    import { bootstrap } from 'aurelia-bootstrapper';
    
    // precreate store instance
    const the_one_and_only_store = new Store(initState, options);
    
    // bootstrap top nav application, with one instance of Aurelia
    bootstrap(aurelia => {
      // do your configuration
      aurelia.container.registerInstance(Store, the_one_and_only_store);
    
      aurelia
        .start()
        .then(() => aurelia.setRoot(
          PLATFORM.moduleName('topnav'),
          document.querySelector('#topnav')
        );
    });
    
    // bootstrap main application, with another instance of Aurelia
    bootstrap(aurelia => {
      // aurelia.use.standardConfiguration();
      // ...
      aurelia.container.registerInstance(Store, the_one_and_only_store);
    
      aurelia
        .start()
        .then(() => aurelia.setRoot(
          PLATFORM.moduleName('app'),
          document.querySelector('app')
        )
    });
    

    现在两个应用程序中的所有Store 注入都将指向您唯一的商店。

    【讨论】:

    • 谢谢@bigopon。我觉得我的另一个问题没有给出上下文,因此我发布了这个。很高兴获得该方法的验证。因此,除非我在每个应用程序中明确注册某些组件,否则应用程序之间没有共享状态。我不断发现一个应用程序似乎受到另一个应用程序的影响,我正在努力弄清楚如何。
    • 您的意思是即使分离容器根/aurelia 实例,它们的行为也很奇怪?你能根据这个codesandbox.io/s/y41qjr36j帮忙做一个重现吗
    • 感谢@bigopon - 感谢您的帮助。我确信我的问题与我使用 webpack 的方式有关,我无法在代码盒中重现。我想我犯了一个根本性的错误——也许你可以确认一下。我一直在使用 2 个 webpack 配置文件:一个以我的“主”aurelia 应用程序作为生成“main.bundle.js”的入口点;另一个以“nav”aurelia 应用程序作为生成“nav.bundle.js”的入口点。当我将两者都包含在网页中时,我收到错误“无法重新定义属性:加载程序”。我想我只能拥有一个。可能甚至没有意义;-{
    • 继续 - 我现在已经重构了“nav”应用程序是 webpack 配置中的入口点以及“main”。我为每个 HTML 页面生成一个 JS 包文件。此捆绑包包括“导航”和“主要”Aurelia 应用程序的模块。现在一切正常!我对每个 aurelia 应用程序之间的交互的评论实际上是(我认为)我正在执行两个带有重复模块定义的 webpack JS 包 - 因此显示错误。我很可能会为其他人发布我的最终配置。
    • 太棒了。请以讨论帖或博客文章为目标。我们可以为其他人拍摄更多内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多