Ответ 1
Путаница исходит из того, что как Angular, так и ES6 используют ту же терминологию...
В ES6/ TypeScript:
- Модуль - это любой файл кода в вашем проекте.
- Импорт - это строка, начинающаяся с ключевого слова
import
. - Экспорт - это строка, начинающаяся с ключевого слова
export
.
В Angular:
- Модуль - это класс, украшенный
@NgModule
. Он служит реестром (aka container) для всех компонентов, труб, директив и поставщиков в вашем приложении. - Импорт - это то, что вы помещаете в свойство
imports
декоратора@NgModule
. Он позволяет модулю Angular использовать функциональные возможности, которые были определены в другом модуле Angular. - Экспорт, который вы положили, - это свойство
exports
декоратора@NgModule
. Он позволяет модулю Angular выставлять некоторые из своих компонентов/директив/труб другим модулям в приложениях. Без этого компоненты/директивы/каналы, определенные в модуле, могут использоваться только в этом модуле.
Модули ES6/импорт/экспорт очень низкоуровневые. Это функция языка ES6, как и ключевые слова, такие как const
или let
... В ES6/TypeScript каждый файл имеет СВОЙ СОБСТВЕННЫЙ СФЕРА. Поэтому всякий раз, когда вам нужно использовать класс/функцию/переменную в файле, и этот класс/функция/переменная была определена в другом файле, вы должны ее импортировать (это означает, что он должен быть экспортирован в файл, где он был определен). Это не относится к Angular. ВСЕ ПРОЕКТЫ, ПИСЬМЕННЫЕ В ES6, могут использовать модули/импорт/экспорт таким образом.
С другой стороны, Angular modules/import/exports - это функция Angular framework. Они имеют смысл только в мире Angular. Другие рамки JavaScript могут иметь похожие понятия, но они будут использовать другой синтаксис.
Теперь между ними есть несколько совпадений. Например, чтобы использовать символ в @NgModule.imports
(Angular world), вам нужно import
символ в файле TypeScript, где определен модуль (ES6/TypeScript мир):
// ES6/TypeScript Imports
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
@NgModule({
// Angular Imports
imports: [ BrowserModule ]
})
Но если вы внимательно прочитаете приведенные выше определения, вы поймете, что две вещи на самом деле совсем разные. Один из них - это язык, другой - структура.