Angular 2+:如何从HTML代码中删除所有Angular属性和注释(以及其他Angular工件)



我想以一种不太常见的方式使用Angular。我用它来生成HTML,稍后用于各种需要。

为什么?我希望这个HTML是静态的,独立于angular。例如,如果我更改我的应用程序并重构代码,生成的HTML应该是相同的(当然,如果后面的逻辑是相同的(,这对于_ngcontent-cXXX变量和带有ngif/ngf的注释是不可能的,因为它们实际上取决于应用程序的版本/结构。换句话说,HTML生成函数应该是确定性的。

问题是生成的HTML并不是很干净。例如

<p _ngcontent-c8="">
Hello
<!--bindings={
"ng-reflect-ng-if": "false"
}-->
blabla
<!--bindings={
"ng-reflect-ng-if": "false"
}-->
ciao
</p>

如何去除所有这些属性/注释等?Angular是否为我们提供了一些实用程序/服务来清理HTML字符串?

HTML minifier/replace函数是一种简单而肮脏的方法,但我真的希望它依赖于Angular的一些标准功能。

您必须使用Tidy等库对HTML进行后处理。

Tidy可以选择删除不在白名单上的属性,也可以删除注释,但它是一个库,必须在字符串或文本文件上运行。

Tidy可以通过PHP、NodeJS或.NET等不同平台运行

https://github.com/vavere/htmltidy

另一种选择是使用jQuery使用广泛的$('*').each()更新DOM,并在将HTML保存到需要的位置之前对DOM元素进行突变

据我所知,您需要将ViewEncapsulation设置为None。了解这是如何工作的关键,因为这些动态生成的类是出于特殊性的原因而不需要的。

根据Angular 4文档:

  • 仿真:提供代理属性,允许每个组件绝对独立,就像它是一个Web组件一样(这就是为什么要添加动态类……再次允许它由于特定性而独立
  • Native:将使用(请原谅我的英国拼写(Shadow DOM,据我所知,因此不会生成类,因为它可以独立生存。然而,在某些不支持Shadow DOM的浏览器中使用此功能可能会失败
  • 无:我相信这正是您所需要的,因为它不会像所说的那样"提供任何模板或样式封装"。换句话说,您将看不到生成的类。然而,这可能会导致封装问题,这就是为什么您可能希望避免它

要做到这一点,请在组件文件中使用以下代码(在组件装饰器函数中:

encapsulation: ViewEncapsulation.None

最新更新