控制生成的内容-转换/编译时间版本的*ngIf



目标是从相同的代码库生成两个不同的应用程序,一个用于用户,另一个用于管理员。它们非常相似,我只想禁用一些块。我现在通过*ngIf和环境变量解决这个问题的方法

User stuff
<div *ngIf="environment.adminVersion">
Admin stuff
<div (click)="adminFunction()"></div>
</div>

关键是,我想让用户版本更轻,并且用户不需要所有的管理内容就可以使用该应用程序。我的问题是,这些方块是从运输过来的verson上移除的吗?

在逻辑上也有实现这一点的方法吗?

class welcomePage() {
userFunction() {
}
adminFunction() {
if (environment.adminVersion) { 
Do admin stuff...
}
}
}

在angular/typescript中是否存在C预处理器控件等价物?什么是最好的方法?我想我想我要找的是这样的东西,它甚至在编译之前就被删除或添加:

#define version admin
User stuff
#if version==admin
Admin stuff
<div (click)="adminFunction()"></div>
#endif
#if version==admin
class welcomePage() {
userFunction() {
}
#if version==admin
adminFunction() {
if (environment.adminVersion) { 
Do admin stuff...
}
}
#endif
}

这并没有具体回答您的问题,但我相信它解决了同样的问题。

我们使用grunt作为构建过程的一部分,并使用grunt预处理模块使我们能够准确地执行您想要执行的操作。它预处理您的模板和源代码,以根据构建变量剥离出包装在@ifdef/@endif注释中的代码。

https://github.com/jsoverson/grunt-preprocess

文档示例:

<body>
<!-- @ifdef DEBUG -->
<h1>Debugging mode - <!-- @echo RELEASE_TAG --> </h1>
<!-- @endif -->
<p>
<!-- @include welcome_message.txt -->
</p>
</body>
var configValue = '/* @echo FOO */' || 'default value';
// @ifdef DEBUG
someDebuggingCall()
// @endif

这个例子是关于调试的,但它也可以很容易地用于管理构建。

不确定您是否使用grunt,但如果没有,也许您的构建工具也有类似的东西。

嗨,这些是关于你需要什么的一些想法,这些可能对你和/或其他人有帮助。我把这个留在这里

  1. 如果需要使用*ngIf执行此操作,则束大小不会减小。因为要工作*ngIf代码应该在那里为这两个条件(true/false(做准备。

  2. 您可以为管理员和用户使用单独的模块。可以在第一次加载时使用惰性模块来减少捆绑包大小。(此处的捆绑包大小表示第一次加载时下载到浏览器的内容(

  3. 仍然需要根据环境变量指定首先下载哪个捆绑包。使用Auth Guards,您可以设置路由条件或者当登录时,您可以重定向到特定的模块部分

  4. 在这种方法中,这不会减少构建的捆绑包的大小,但下载到浏览器的区块会对性能产生相当大的影响。

有用的链接,

Auth Gurds延迟加载

您可以在Typescript上使用Webpack,我认为当为不同的设备/用例构建不同的版本时,它会给您带来预期的结果。

链接获取更多信息:https://basarat.gitbook.io/typescript/main-1/build-toggles

这是另一个更适合您需求的解决方案,我这样做是为了更高效的基于模板的项目

由于您希望根据环境变量控制模板,我建议您将HTML拆分为两部分,而不使用*ngIf

例如,

<div> user </div> <-- user/common.html
<div> admin </div> <-- admin/common.html

现在你可以将这些html保存在你的项目中,在构建之前,你可以复制所需的html并构建你的项目。就是这样。但几乎没有什么复杂的事情可以实现。

并发症解决,

  1. 如果您有超过1个HTML要替换,那么复制其中一个HTML将是一个令人筋疲力尽的过程。为此,您可以将HTML保存在不同的文件夹中,但与项目的文件结构相同。所以你可以复制和替换。(替换是指您可以在项目中保留默认模板(
  2. 此外,您还可以使用少量shell脚本编码来自动复制/替换场景

这看起来可能很耗时,但你只需要做一次。您可以保持干净的HTML,不需要实现单独的组件或模块,只有HTML就足够了。

这有点像我们的开箱即用,但适用于模板驱动的项目,您不需要只更改HTML的组件文件

如果你没有得到这个方法,我很乐意解释更多。

最新更新