JavaScript: различие между require и import
import
используется для импорта привязок, которые экспортируются другим модулем, а функция require()
используется для загрузки модуля в приложении Node.js. Эти два механизма похожи, но у них есть важные отличия о которых вам следует знать. Мы обсудим их в этой статье.В JavaScript ключевые слова require
и import
используются для импорта модулей. require
— функция используемая для импорта модулей в Node.js, а import
— новое ключевое слово используемое для импорта модулей в ECMAScript 6(ES6).
require()
— синхронная операция блокирующая выполнение скрипта до тех пор, пока модуль не будет загружен и готов к использованию. import()
— асинхронная операция, не блокирующая скрипт во время загрузки модуля.
Основное различие между require
и import
заключает в том, что require
можно использовать только для импорта модулей, тогда как import
можно использовать для импорта как модулей, так и индивидуальных экспортов из модулей.
Индивидуальный экспорт — отдельное значение, функция или объект, который экспортируется модулем и может быть импортирован и использован другим кодом.
Например, если у вас модуль с именем myModule
, вы можете использовать require
для импорта всего модуля следующим образом:
const myModule = require('myModule');
Для импорта определённого экспорта из модуля, вы должны использовать нотацию .
как в этом примере:
const myFunction = require('myModule').myFunction;
Используя import
, вы можете импортировать весь модуль и все его экспорты следующим образом:
import * as myModule from 'myModule';
Или импортировать определённый экспорт следующим образом:
import {myFunction} from 'myModule';
В общем, import
предпочтительное require
, потому что это боле современный и гибкий синтаксис, и в конечном итоге он заменит require
в языке. Однако в Node.js по-прежнему будет поддерживаться require
, поэтому вы можете использовать любой синтаксис в зависимости от ваших потребностей и предпочтений.
import
Основное преимущество import
в том, что он позволяет выбирать какие привязки мы хотим импортировать из модуля, а не импортировать весь модуль как отдельный объект.
Это может помочь уменьшить объём кода и сделает его более лёгким для чтения и понимания.
Пример использования ключевого слова import
для импорта определённых привязок из другого модуля:
// moduleA.js
export const x = 1;
export const y = 2;
// moduleB.js
import { x, y } from './moduleA';
console.log(x); // outputs 1
console.log(y); // outputs 2
Сборщик модулей Webpack имеет встроенную систему кэширования, которую можно использовать для кэширования модулей импортированных с использованием ключевого слова
import
. Так же в Rollup и других сборщиках.
require
В контексте Node.js — require()
встроенная функция для подключения внешних модулей, существующих в отдельных файлах. Выражение читает файл JavaScript, выполняет его, а затем возвращает экспортированный объект.
// app.js
const _ = require('lodash');
const arr = [1, 2, 3];
const sum = _.sum(arr);
console.log(sum); // outputs 6
Важно отметить, что функция require()
является синхронной — она блокирует выполнение кода до тех пор, пока модуль не будет загружен.
Преимущество require()
в использовании системы кэширования, чтобы гарантировать, что модули загружаются только один раз, даже если они требуются в нескольких файлах. Это означает, что когда вы используете require()
для загрузки модуля, Node.js сначала проверяет, был ли модуль уже загружен и кэширован. Если это так, он вернёт кэшированную версию модуля, а не загрузит и не проанализирует её снова.