--- title: import slug: Web/JavaScript/Reference/Statements/import tags: - ECMAScript 2015 - ECMAScript6 - JavaScript - import - Инструкция - Модули - динамический импорт - импорт translation_of: Web/JavaScript/Reference/Statements/import ---
Инструкция import используется для импорта ссылок на значения, экспортированные из внешнего модуля. Импортированные модули находятся в {{JSxRef ("Strict_mode", "строгом режиме")}} независимо от того, объявляете ли вы их как таковые или нет. Для работы инструкции во встроенных скриптах нужно прописать у тэга script type="module"
.
Существует также function-like динамический import()
, который не требует скриптов с типом "module
".
Обратная совместимость может быть обеспечена с помощью атрибута nomodule
тега script.
Динамический импорт полезен в ситуациях, когда вы хотите загрузить модуль условно или по требованию. Статическая форма предпочтительна для загрузки начальных зависимостей и может быть более полезна для инструментов статического анализа и tree shaking.
Внимание: На данный момент эта функциональность только начинает поддерживаться браузерами. Полноценная реализация присутствует во многих транспайлерах, таких как TypeScript и Babel, а также в сборщиках, например, в Rollup и Webpack.
import defaultExport from "module-name"; import * as name from "module-name"; import { export } from "module-name"; import { export as alias } from "module-name"; import { export1 , export2 } from "module-name"; import { export1 , export2 as alias2 , […] } from "module-name"; import defaultExport, { export [ , […] ] } from "module-name"; import defaultExport, * as name from "module-name"; import "module-name"; import("/module-name.js").then(module => {…}) // Динамический импорт
defaultExport
module-name
.js
файлу модуля без указания расширения .js
. Некоторые сборщики могут разрешать или даже требовать использования расширения; проверяйте своё рабочее окружение. Допускаются только строки с одиночными или двойными кавычками.name
export, exportN
alias, aliasN
Параметр name
это имя локального обьекта, который будет использован как своего рода пространство имен, ссылающееся на импортируемые значения. Параметры export
определяют отдельные именованные значения, в то время как import * as name
импортирует все значения. Примеры ниже объясняют синтаксис.
Этот код вставляет объект myModule
в текущую область видимости, содержащую все экспортированные значения из модуля, находящегося в файле /modules/my-module.js
.
import * as myModule from '/modules/my-module.js';
В данном случае, доступ к импортируемым значениям можно осуществить с использованием имени модуля (в данном случае "myModule") в качестве пространства имен. Например, если импортируемый выше модуль включает в себя экспорт метода doAllTheAmazingThings()
, вы можете вызвать его так:
myModule.doAllTheAmazingThings();
Определенное ранее значение, названное myExport,
которое было экспортировано из модуля my-module
либо неявно (если модуль был экспортирован целиком), либо явно (с использованием инструкции {{jsxref("Statements/export", "export")}}), позволяет вставить myExport
в текущую область видимости.
import {myExport} from '/modules/my-module.js';
Этот код вставляет оба значения foo
и bar
в текущую область видимости.
import {foo, bar} from '/modules/my-module.js';
Вы можете переименовать значения, когда импортируете их. Например, этот код вставляет shortName
в текующую область видимости.
import {reallyReallyLongModuleExportName as shortName} from '/modules/my-module.js';
Код, который импортирует несколько значений из модуля, используя более удобные имена.
import { reallyReallyLongModuleExportName as shortName, anotherLongModuleName as short } from '/modules/my-module.js';
Импорт всего модуля только для использования побочного эффекта от его вызова, не импортируя что-либо. Это запускает глобальный код модуля, но в действительности не импортирует никаких значений.
import '/modules/my-module.js';
Есть возможность задать дефолтный {{jsxref("Statements/export", "export")}} (будь то объект, функция, класс или др.). Инструкция import
затем может быть использована для импорта таких значений.
Простейшая версия прямого импорта значения по умолчанию:
import myDefault from '/modules/my-module.js';
Возможно также использование такого синтаксиса с другими вариантами из перечисленных выше (импорт пространства имен или именованный импорт). В таком случае, импорт значения по умолчанию должен быть определён первым. Для примера:
import myDefault, * as myModule from '/modules/my-module.js'; // myModule использовано как пространство имен
или
import myDefault, {foo, bar} from '/modules/my-module.js'; // именованный импорт конкретных значений
Если вы импортируете переменные, то в данной области видимости они ведут себя как константы.
Такой код выведет ошибку:
export let a = 2; export let b = 3;
import {a, b} from '/modules/my-module.js'; a = 5; b = 6; // Uncaught TypeError: Assignment to constant variable.
Для импорта можно воспользоваться объектом в котором хранятся эти переменные.
Такой код будет рабочим:
export let obj = {a:2, b:4};
import {obj} from '/modules/my-module.js'; obj.a = 1; obj.b = 4;
Учитывая, что import
хранит именно ссылки на значения, экспортированные из внешнего модуля, то это можно использовать как замыкания.
Ключевое слово import
можно использовать как функцию для динамического импорта модулей. Вызов import()
возвращает Promise.
import('/modules/my-module.js') .then(module => { // Делаем что-нибудь с модулем })
Как следствие возврата Promise, с динамическим импортом можно использовать ключевое слово await
let module = await import('/modules/my-module.js');
Обратите внимание, что несмотря на то, что динамический импорт выглядит как вызов функции, он им по сути не является, т.е. не наследует от Function.prototype
и, как следствие, его невозможно использовать вместе с методами .call
, .apply
и .bind
Импорт из вспомогательного модуля для помощи в обработке запроса AJAX JSON.
function getJSON(url, callback) { let xhr = new XMLHttpRequest(); xhr.onload = function () { callback(this.responseText) }; xhr.open('GET', url, true); xhr.send(); } export function getUsefulContents(url, callback) { getJSON(url, data => callback(JSON.parse(data))); }
import { getUsefulContents } from '/modules/file.js'; getUsefulContents('http://www.example.com', data => { doSomethingUseful(data); });
Этот пример показывает, как можно загрузить на страницу дополнительный модуль в зависимости от действий пользователя (в данном случае, по клику на кнопку), а затем использовать функции из загруженного модуля. Промисы - это не единственный способ использовать динамический импорт. Функция import()
также может использоваться совместно с await
.
const main = document.querySelector("main"); for (const link of document.querySelectorAll("nav > a")) { link.addEventListener("click", e => { e.preventDefault(); import('/modules/my-module.js') .then(module => { module.loadPageInto(main); }) .catch(err => { main.textContent = err.message; }); }); }
Спецификация | Статус | Комменарий |
---|---|---|
{{SpecName('ES2015', '#sec-imports', 'Imports')}} | {{Spec2('ES2015')}} | Начальное определение. |
{{SpecName('ES2020', '#sec-imports', 'Imports')}} | {{Spec2('ES2020')}} | |
{{SpecName('ESDraft', '#sec-imports', 'Imports')}} | {{Spec2('ESDraft')}} |
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
{{Compat("javascript.statements.import")}}