角度应用程序上的多个根模块

时间:2019-04-05 15:07:26

标签: angular production

我正在Angular中开发一个网站。该应用程序分为两部分:客户端部分和管理员部分。后者可以通过登录屏幕访问。 该机制的核心是通过以下两个文件完成的:

main.ts:

import {enableProdMode} from '@angular/core';
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';

import {AppModule} from './app/app.module';
import {environment} from './environments/environment';
import {AdministrationModule} from "./administration/administration.module";

if (environment.production) {
    enableProdMode();
}

if (window.location.href.indexOf("admin") != -1) {
    platformBrowserDynamic().bootstrapModule(AdministrationModule);
}

else {
    platformBrowserDynamic().bootstrapModule(AppModule);
}

index.html:

<!doctype html>
<html lang="it">
<head>
    <meta charset="utf-8">
    <title>MyWebsite</title>
    <base href="/">

    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="icon" type="image/x-icon" href="icon.ico">
</head>
<body>
<app-root></app-root>
<app-administration></app-administration>
</body>
</html>

基本上,如果我正常地指向网站http://mywebsite.com,我将上传客户端部分,而使用http://mywebsite.com/admin时,我会在登录屏幕上加载管理部分。

我的问题是,如果我使用以下命令编译应用程序,则一切正常:
ng buildng serve
当我将其编译用于生产时不起作用:

ng build --prod

我现在有两个问题:这是一个有角度的错误吗?仅使用ng build而不是ng build --prod命令进行生产是否可靠?我已经在生产中使用ng build进行了测试,并且一切正常。

啊,一件事:在编译过程中出现以下警告:

  

未启用“惰性路由发现”中的警告。因为有   既不是entryModule也不是静态可分析的引导程序代码   主文件。

2 个答案:

答案 0 :(得分:1)

这不是错误。运行ng build --prod时,将在AOT编译运行的情况下运行它。这意味着它将在构建之前编译应用程序,以确保所有设置均正确。似乎在引导应用程序时正在加载不同的模块,但我不确定AOT编译是否会同意这一点。您可以更改为使用Lazy Loaded modules,并将您的应用程序分为2个不同的模块。

如果您确实要尝试,请尝试ng build --prod --aot=falseng build --prod --aot false

由于它似乎是一个可伸缩的应用程序,所以我认为对您来说最好的解决方案是使用MonoRepo模式。您将拥有带有库的多个应用,它们都将位于同一个项目下。您可以利用很多可重用性,并且维护会更容易。

检查Nrwl/Nx中的Angular Here,他们为此提供了出色的工具。它通过使用原理图来支持角度cli。我认为这对您有很大帮助。也许您需要将应用程序部署到不同的位置,或者将每个应用程序使用一些不同的环境,而此monorepo非常适合实现该IMHO。

有关Wikipedia中的monorepos的更多信息:

  

优势Monorepo具有许多潜在优势   在各个存储库上:

     
      
  • 易于重复使用代码 –类似的功能或通信协议   可以抽象到共享库中并直接包含   项目,不需要依赖包管理器。
  •   
  • 简化的依赖性管理 –在多存储库环境中,   多个项目取决于第三方依赖关系   可能会多次下载或构建。在monorepo中   可以轻松优化,因为引用的依赖项都存在于   相同的代码库。
  •   
  • 原子提交 –一起工作的项目是   包含在单独的存储库中,版本需要同步   一个项目的版本可以与另一个项目一起使用。而且足够大   项目,管理依赖项之间的兼容版本可以成为   依赖地狱。[5]在monorepo中,可以解决此问题,因为   开发人员可以自动更改多个项目。
  •   
  • 大规模代码重构 –由于开发人员可以访问整个项目,因此重构可以确保项目的每个部分继续进行   重构后的功能。
  •   
  • 团队之间的合作 –在monorepo中   使用源依赖项(从   来源),团队可以改善其他团队正在进行的项目。   这导致灵活的代码所有权。
  •   
     

局限和缺点

     
      
  • 版本信息的丢失 –尽管不是必需的,但是一些monorepo   构建版本库在存储库中的所有项目中使用一个版本号。   这导致丢失每个项目的语义版本。
  •   
  • 缺乏每个项目的安全性 –使用分离的存储库,可以访问存储库   可以根据需要授予。 monorepo允许对所有内容进行读取访问   项目中的软件,可能会带来新的安全问题。
  •   

希望对您有帮助

答案 1 :(得分:0)

在角度项目中可以有多个应用程序,这就是我解决类似情况的方法。

https://angular.io/cli/generate#application-command

这个guide帮助我入门。

这是另一个guide,其中包含一些出色的示例。