选择器和模块声明对于组件是必需的吗?

时间:2019-07-02 08:22:36

标签: angular

我有一个仅会从路由文件中引用的组件。 因此,我永远不会从html模板文件中引用它(例如,我永远不会使用<app-my-component></app-my-component>)。

这是否意味着我可以完全删除选择器?

@Component({
  selector: 'app-my-component',         // Can I remove this line ?
  templateUrl: './mc.component.html',
  styleUrls: ['./mc.component.scss']
})
export class MyComponentComponent { }

那模块呢? 这是否意味着我也可以将其从声明部分中删除?

@NgModule({
  declarations: [
    MyComponent           // Can I remove this line ?
  ],
  exports: [...],
})
export class MyModule { }

5 个答案:

答案 0 :(得分:2)

是的,您可以删除以下行:

selector: 'app-my-component',

以及:

templateUrl: './mc.component.html'
styleUrls: ['./mc.component.scss']

因为您说过永远不会在模板中使用此组件,这意味着它不需要任何样式(scss)或模板本身(.html)。

这是否意味着要成为一种BaseComponent?从经验来看,这是可能的,尽管最好不要派生模板(html)。

第二个问题:

MyComponent // Can I remove this line ?

我对此表示怀疑。只是尝试一下? @Reactgular状态是不可能的,因为Webpack将“从捆绑包中摇晃树”。但是,您仍然可以轻松地尝试一下,看看自己。

答案 1 :(得分:2)

  

我有一个仅会从路由文件中引用的组件。因此,我永远不会从html模板文件中引用它。

选择器是Web组件规范的一部分。您可以通过许多其他方式来动态创建没有模板选择器的组件,但是元数据仍然需要它。我确信Angular可以将其设置为可选,但人们更可能会忘记应用它,因此引发错误比忽略它可以帮助更多的人。

  

这是否意味着我也可以将其从声明部分中删除?

如果没有声明,该组件将被WebPack摇晃并从捆绑中删除。由于组件是模块的一部分,因此必须对其进行声明,并且AOT编译器正是通过此声明来发现和处理组件。

仅声明组件是不够的。如果Angular组件没有找到对选择器的任何引用,它也可以从构建中摇晃它。防止这种情况发生的唯一方法是也将组件声明为入口组件。入口组件定义模块中的用法,以便Angular至少可以看到一种使用方式。

我们无需为路由器执行此操作,因为它会自动添加它。

答案 2 :(得分:1)

路由器使用ViewContainerRef.createComponent(),不需要选择器来匹配HTML。因此,您可以删除selector: 'app-my-component'

但是,您不能从模块中删除以下行,因为它告诉Angular MyComponent是该模块的一部分:

declarations: [
    MyComponent // You can't remove this line because it is a part of module
],

顺便说一句。您只能创建和使用模块。 此外,Angular CLI具有仅创建模块的命令。例如:

ng g m SharedModule

答案 3 :(得分:1)

Angular使用组件选择器创建一个Element节点,但是我认为可以忽略它,在这种情况下,angular将使用 ng-component 不知道它是否对于最新版本的angular仍然可以这样工作,并请记住,每个指令或组件都必须是angular模块的一部分

答案 4 :(得分:0)

组件选择器

如果删除选择器,则意味着您需要动态创建组件,并在html端路由该示例,您需要的组件选择器将是 ng-component

  

即使您不使用选择器,在使用过程中也会非常方便   进行调试,因此考虑将选择器的名称保留为最佳做法,选择器的另一个好处是,当您创建全局样式并尝试对选择器的组件库进行样式设置时,例如,请检查primeng componenet库

组件声明参考

这是必须将任何已创建的组件添加到模块声明列表中,否则,如果您尝试使用它,将会得到与此相关的错误

Error: Component DashboardComponent is not part of any NgModule or 
the module has not been imported into your module.