03. Import
Импорт-выражение позволяет подключить в текущий модуль определения, экспортируемые из другого модуля:
Импорт выражение должно быть top-level
Импорты должны быть compile-time resolved
Нельзя делать условные импорты и т.д.
Определения, сделанные при помощи импортов, поднимаются как
var
-определения.
import
-expression
import
-expressionИмпорт выполняется при помощи ключевого слова import
, после чего идет import
- выражение (объявления), далее ключевое слово from
и указывается относительный/абсолютный или URL-путь к модулю.
import var from 'module';
ES6 provides several styles of importing:
Default import:
import localName from "src/my_lib";
Namespace import: imports the module as an object (with one property per named export).
import * as my_lib from "src/my_lib";
Named imports:
import { name1, name2 } from "src/my_lib";
You can rename named imports:
// Renaming: import `name1` as `localName1`
import { name1 as localName1, name2 } from "src/my_lib";
Empty import: only loads the module, doesn’t import anything. The first such import in a program executes the body of the module.
import "src/my_lib";
There are only two ways to combine these styles and the order in which they appear is fixed; the default export always comes first.
Combining a default import with a namespace import.
Combining a default import with named imports.
// 1.
import theDefault, * as my_lib from "src/my_lib";
// 2.
import theDefault, { name1, name2 } from "src/my_lib";
Результатом import-выражения является объявление в текущем пространстве имен определений (bindings) из других модулей. При импорте не выполняется копирование значений из других модулей. Фактически, семантика импорта соответствует определению новой переменной и пере-присваиванию.
Синтаксис named imports похож на деструкцию, но технически ей не является. Нельзя использовать паттерны деструкции в импорте.
Imports view on exports
Импортированные значения являются read-only представлениями экспортируемых сущностей. Другими словами, любой импорт -- это живое соединение с экспортируемыми элементами.
Импорты вида
import x from 'foo'
работают аналогичноconst
Импорты вида
import * as foo from 'foo'
работают аналогично замороженным объектам.Можно модифицировать состояние подключенного модуля используя замыкания и другие приемы:
//------ lib.js ------
export let counter = 3;
export function incCounter() {
counter++;
}
//------ main.js ------
import { counter, incCounter } from "./lib";
// The imported value `counter` is live
console.log(counter); // 3
incCounter();
console.log(counter); // 4
Если значение внутри модуля поменялось, то его увидят и клиенты этого модуля. Нельзя изменить импортируемое значение, но можно изменить его содержимое, если это объект??
//------ lib.js ------
export let obj = {};
//------ main.js ------
import { obj } from "./lib";
obj.prop = 123; // OK
obj = {}; // TypeError
Last updated
Was this helpful?