【问题标题】:Angular lazy loading sibling applications which are on different environments.Angular 延迟加载位于不同环境中的同级应用程序。
【发布时间】:2018-04-09 14:15:11
【问题描述】:

我目前正在开展一个项目,我们的首席架构师希望在运行时动态地在 Angular 应用程序中加载不同的“兄弟”应用程序。我已经知道如何使用具有延迟加载的模块来完成此操作。但在我们的例子中,应用程序也单独存在于它们自己的环境中。有没有人有关于如何以角度方式实现这一点的建议?

我已经尝试将它们分解成自己的块并像那样加载它们,它正在部分工作。但“主”应用需要了解同级应用,因此需要对其进行调整以延迟加载模块。

我主要对其他人在这类场景中使用的解决方案感到好奇 :)

【问题讨论】:

    标签: angular webpack runtime angular2-routing lazy-loading


    【解决方案1】:

    最近,我开始了一个包含多个应用程序的项目。我们的应用程序有两种不同类型的用户,普通用户和管理员。大多数屏幕都是相同的,只有细微的差别。但是有些菜单是普通用户看不到的,有些是用户无法执行的。我们决定利用@​​987654325@ 多应用程序支持,而不是在应用程序中使用一堆*ngIfs。你可以阅读更多关于它here

    基本上,你需要做的是

    .angular-cli.json 内,将另一个应用添加到您的apps 数组中。

    "apps": [
      {
        "name": "manager-app",
        "root": "src/manager-app",
        "assets": [
          "assets",
          {
            "glob": "**/*",
            "input": "../common/assets/",
            "output": "./assets",
            "allowOutsideOutDir": true
          }
        ],
        .... // bunch of other configs
      },
      {
        "name": "user-app",
        "root": "src/user-app",
        "assets": [
          "assets",
          {
            "glob": "**/*",
            "input": "../common/assets/",
            "output": "./assets",
            "allowOutsideOutDir": true
          }
        ],
        ....
      },
      {
        "name": "common",
        "root": "src/common",
        "tsconfig": "tsconfig.app.json",
        "appRoot": "src"
      }
    ]
    

    所以,我有三个应用程序,manager-appuser-appcommonmanageruser 应用程序有自己的环境、配置、路由设置等。我分别为每个应用程序运行 ng build

    另外,我有 common 应用程序,其中包含共享组件、服务、模块、资产文件等。

    为了从两个应用程序访问common资产,您需要将以下json添加到.angular-cli.json中每个应用程序的assets数组

    {
        "glob": "**/*",
        "input": "../common/assets/",
        "output": "./assets",
        "allowOutsideOutDir": true
    }
    

    当你想并排运行它们时,

    manager-app -> ng serve --port 8080 --app=manager-app

    用户应用 -> ng serve --port 8081 --app=user-app

    当您想要构建它们时,同样适用,

    manager-app -> ng build --prod --app=manager-app

    用户应用 -> ng build --prod --app=user-app

    这将生成两个不同的dist 文件夹,您在.angular-cli.json 中为每个文件夹定义它们。即apps[0].outDir

    此外,还有一个名为 Nx 的工具可以帮助您同时管理多个应用程序。 你可以看看这个example。 有关 Nx 的更多信息,请查看here

    此外,要使 AoT 编译器与来自 common 应用程序的组件一起使用,您需要将这些模块包含在每个应用程序的 tsconfig.app.json 中。

    manager-app/tsconfig.app.json

    {
        ...
        "include": [
            "**/*.ts",
            "../common/app/my-component/my-component.module.ts"
        ]
        ...
    }
    

    【讨论】:

    • 嘿伙计!感谢您的快速回复!听起来确实很扎实!我尝试在自己的情况下使用 Nx,但在我们的情况下,它更像是一个应用程序,它充当其他应用程序的“shell”,我们希望将特定应用程序延迟加载到 shell 中。如果您在“用户”应用程序中有需要在“管理器”应用程序中访问的组件,您会默认将它们放在通用应用程序中吗?以及如何在不重新构建/重新打包整个应用程序的情况下更新特定模块(我什至不确定 webpack 是否可行)?
    • 我会将这些模块和组件放在通用应用程序中。实际上,我有一个大页面,对用户和经理来说几乎都是一样的。该页面有自己的路线和一切。我把它放在通用应用程序中,并通过每个应用程序的路由传递一些配置。此外,angular-cli 只能重建应用程序的智能部分。因此,我假设当您更改通用应用程序中的某些内容时,angular-cli 只会更新该部分并非常快速地重新加载应用程序。
    • 帅哥,让我与团队讨论这个问题,作为解决方案之一!我自己什至看不到共享组件跨“应用程序”而不将其放在共享/公共模块中的感觉。如果您问我,这就是它的目的。谢谢!
    • 我已经确定了组织想要构建事物的方式,他们希望能够及时更新应用程序或安装新应用程序。我想我们正在寻找一种微服务/微前端的方法,你有这方面的经验吗?
    • 不,我没有。
    猜你喜欢
    • 2018-05-31
    • 2018-10-04
    • 2018-06-14
    • 2021-01-18
    • 1970-01-01
    • 2019-01-05
    • 2019-05-06
    • 2020-10-16
    • 2013-12-31
    相关资源
    最近更新 更多