【问题标题】:Role of imports / exports in Angular 2+ ngModuleAngular 2+ ngModule 中导入/导出的作用
【发布时间】:2017-06-15 01:56:47
【问题描述】:

我正在学习 Angular 2+,我很难理解导入/导出在 ngModule 中的作用。更具体地说,如果您要使用 es6 语法导入模块,为什么导入模块很重要

import { BrowserModule } from '@angular/platform-browser';
@NgModule({
  imports:      [ BrowserModule ],
  providers:    [ Logger ],
  declarations: [ AppComponent ],
  exports:      [ AppComponent ]
})

检测模块是通过 es6 语法导入的不是更简单吗?

imports - 组件需要其导出类的其他模块 此模块中声明的模板。

但是我们已经在组件级别导入了这些。我错过了什么吗?我也在寻找一些例子来说明他们为什么使用这种语法。

【问题讨论】:

    标签: angular angular-module


    【解决方案1】:

    混淆来自 Angular 和 ES6 使用相同的术语这一事实......

    在 ES6/TypeScript 中:

    • 模块是您项目中的任何代码文件。
    • import 是以import 关键字开头的行。
    • export 是以export 关键字开头的行。

    在 Angular 中:

    • module 是一个用@NgModule 装饰的类。它充当应用程序中所有组件、管道、指令和提供程序的注册表(也称为容器)。
    • import 是您放入 @NgModule 装饰器的 imports 属性中的内容。它使 Angular 模块能够使用在另一个 Angular 模块中定义的功能。
    • export 你放的是@NgModule 装饰器的exports 属性。它使 Angular 模块能够将它的一些组件/指令/管道暴露给应用程序中的其他模块。没有它,模块中定义的组件/指令/管道只能在该模块中使用。

    ES6 模块/导入/导出是非常低级的。它们是ES6 语言的一个特性,就像constlet 之类的关键字...在ES6/TypeScript 中,每个文件都有其自己的范围。因此,每当您需要在文件中使用类/函数/变量并且该类/函数/变量在另一个文件中定义时,您必须导入它(对应的是它必须在定义它的文件中导出)。这不是 Angular 特有的。用 ES6 编写的所有项目都可以以这种方式使用模块/导入/导出。

    另一方面,Angular 的模块/导入/导出是Angular 框架的一个特性。它们只在 Angular 世界中才有意义。其他 JavaScript 框架可能有类似的概念,但它们会使用不同的语法。

    现在两者之间有一些重叠。例如,为了在@NgModule.imports(Angular 世界)中使用符号,您需要 import 定义模块的 TypeScript 文件中的符号(ES6/TypeScript 世界):

    // ES6/TypeScript Imports
    import { BrowserModule } from '@angular/platform-browser';
    import { NgModule } from '@angular/core';
    
    @NgModule({
      // Angular Imports
      imports: [ BrowserModule ]
    })
    

    但是如果你仔细阅读上面的定义,你会发现这两件事实际上是完全不同的。一是语言,二是框架。

    【讨论】:

    • 为了过于清楚,如果你的 NgModule 中没有 imports: [ BrowserModule ],那么在“下游”组件中任何使用 BrowserModule 都会失败,无论是您是否“正确”在组件中执行 ES6 导入?也就是说,Angular NgModule 导入如何影响文件/类除了发生 [Angular] 导入的 NgModule 之外的文件/类?
    【解决方案2】:
    import { BrowserModule } from '@angular/platform-browser'; 
    

    将文件加载到内存中。

    @NgModule({
        imports:      [ BrowserModule ],
    

    将向 Angular 注册 BrowserModule。

    【讨论】:

    • 是否更准确地说第二个使用特定的 Angular 模块而不是整个 Angular 框架注册 BrowserModule?
    • 是的,我明白你的意思,我同意这是有道理的。我认为虽然它会偏离我的观点,即在将文件加载到内存和使用加载的对象之间进行对比。整个想法不是深入研究 Angular 的内部工作原理,因为这种区别不是 Angular 特定的关注点。而且我相信它仍然是准确的,因为 Angular 实际上是一个管理模块的全局单例。你是对的,这个模块是从另一个模块注册的,它们之间存在关系,但它是框架做的。
    猜你喜欢
    • 1970-01-01
    • 2017-03-08
    • 2017-02-27
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多