В Node.js была создана модульная система под названием CommonJS, которая используется с: const module = require('module'); В ES2015/6 к языку была добавлена собственная модульная система с использованием следующего синтаксиса: импортировать модуль из «модуля»; Хотя в основном кажется, что они делают одно и то же, на самом деле они работают по-разному на более низком уровне.
CommonJS, когда вы загружаете модуль, предоставляет вам копию модуля, чтобы вы могли его использовать, в то время как ES2015 предоставляет ссылку на этот модуль. Это означает, что если в вашем модуле есть переменная и вы экспортируете функцию, которая изменяет эту переменную, любая другая часть вашего приложения, использующая эту переменную, увидит отражение изменения, тогда как с CommonJS каждый будет иметь свою собственную копию переменной. .
Вы можете прочитать лучшее и более полное объяснение здесь
С одной стороны, require — это глобальная функция, введенная средой выполнения, тогда как import — это новый синтаксис, добавленный в язык. Поскольку функция require такая же, как и любая другая, ее можно вызывать в любом месте кода. Таким образом, позволяя динамическую загрузку модулей. Это может быть хорошо или плохо в зависимости от того, как вы его используете, но правильное выполнение может ускорить запуск приложений. С другой стороны, импорт — это просто синтаксис, поэтому его нельзя присвоить переменной, поэтому загрузка модуля определяется статически. Эта секунда также может быть плохой или хорошей в зависимости от того, как вы на нее смотрите. С одной стороны, поскольку взаимосвязь между модулями статична, ее анализ можно проводить без выполнения кода, что позволяет использовать более совершенные средства разработки, а с другой стороны, ее недостатком является то, что она очень жесткая.
Чтобы проиллюстрировать разницу, давайте возьмем в качестве примера библиотеку sequenceize. Эта библиотека предлагает возможность импортировать модуль javascript в качестве модели. Это возможно, потому что, поскольку require — это такая же функция, как и любая другая, ее аргументом может быть любое значение. Это невозможно сделать так же, как с помощью импорта.
Разница, на которую указывает Даниэль Эрнандес, больше связана с тем, как используется модуль и с особенностями Javascript как языка, чем с самой используемой системой модулей. Также заявлениеCommonJS cuando cargas un módulo te trae una copia del módulo para que lo puedas usar, mientras que ES2015 trae una referencia a ese módulo.это совершенно неверно. См. официальную документацию Nodejs для получения дополнительной информации об этом. require возвращает только ссылку на модуль, загруженный в кэш модуля Node. import поддерживает существование локальных символов, указывающих на объекты в других модулях, в то время как require поддерживает только указание на модуль в целом. Следовательно, создание локального символа, который ссылается на переменную в другом модуле, должно пройти через процесс назначения новой локальной переменной. Учитывая природу Javascript, если эта локальная переменная переназначается, она изменяется только там, где она указывает, и поэтому переменная в модуле, начальное значение которой требуется, не изменяется.
Пример:
// aquí x no es una variable local sino un símbolo, no puede ser reasignado por definición debido a la nueva sintaxis
import {x} from 'x';
// aquí y es una variable definida localmente que puede sufrir modificaciones
var y = require('x').x;
// aquí la variable local y se ha reasignado para que referencie el valor 35.
y = 35;
Приведенный выше пример не означает, что невозможно изменить переменную x, экспортированную из модуля x, в локальном коде. Но при использовании локальной переменной мы модифицируем именно эту переменную. В следующем примере переменная x в модуле x изменяется с использованием системы модулей CommonJS.
var x = require('x');
x.x = 35;
Как видно, поскольку локальная переменная не используется, можно напрямую изменить значение атрибута x модуля x. Это новое значение теперь доступно из любого другого модуля, для которого требуется модуль «x».
В Node.js была создана модульная система под названием CommonJS, которая используется с: const module = require('module'); В ES2015/6 к языку была добавлена собственная модульная система с использованием следующего синтаксиса: импортировать модуль из «модуля»; Хотя в основном кажется, что они делают одно и то же, на самом деле они работают по-разному на более низком уровне.
CommonJS, когда вы загружаете модуль, предоставляет вам копию модуля, чтобы вы могли его использовать, в то время как ES2015 предоставляет ссылку на этот модуль. Это означает, что если в вашем модуле есть переменная и вы экспортируете функцию, которая изменяет эту переменную, любая другая часть вашего приложения, использующая эту переменную, увидит отражение изменения, тогда как с CommonJS каждый будет иметь свою собственную копию переменной. .
Вы можете прочитать лучшее и более полное объяснение здесь
Разница между import и require огромна.
С одной стороны, require — это глобальная функция, введенная средой выполнения, тогда как import — это новый синтаксис, добавленный в язык. Поскольку функция require такая же, как и любая другая, ее можно вызывать в любом месте кода. Таким образом, позволяя динамическую загрузку модулей. Это может быть хорошо или плохо в зависимости от того, как вы его используете, но правильное выполнение может ускорить запуск приложений. С другой стороны, импорт — это просто синтаксис, поэтому его нельзя присвоить переменной, поэтому загрузка модуля определяется статически. Эта секунда также может быть плохой или хорошей в зависимости от того, как вы на нее смотрите. С одной стороны, поскольку взаимосвязь между модулями статична, ее анализ можно проводить без выполнения кода, что позволяет использовать более совершенные средства разработки, а с другой стороны, ее недостатком является то, что она очень жесткая.
Чтобы проиллюстрировать разницу, давайте возьмем в качестве примера библиотеку sequenceize. Эта библиотека предлагает возможность импортировать модуль javascript в качестве модели. Это возможно, потому что, поскольку require — это такая же функция, как и любая другая, ее аргументом может быть любое значение. Это невозможно сделать так же, как с помощью импорта.
Разница, на которую указывает Даниэль Эрнандес, больше связана с тем, как используется модуль и с особенностями Javascript как языка, чем с самой используемой системой модулей. Также заявление
CommonJS cuando cargas un módulo te trae una copia del módulo para que lo puedas usar, mientras que ES2015 trae una referencia a ese módulo.
это совершенно неверно. См. официальную документацию Nodejs для получения дополнительной информации об этом. require возвращает только ссылку на модуль, загруженный в кэш модуля Node. import поддерживает существование локальных символов, указывающих на объекты в других модулях, в то время как require поддерживает только указание на модуль в целом. Следовательно, создание локального символа, который ссылается на переменную в другом модуле, должно пройти через процесс назначения новой локальной переменной. Учитывая природу Javascript, если эта локальная переменная переназначается, она изменяется только там, где она указывает, и поэтому переменная в модуле, начальное значение которой требуется, не изменяется.Пример:
Приведенный выше пример не означает, что невозможно изменить переменную x, экспортированную из модуля x, в локальном коде. Но при использовании локальной переменной мы модифицируем именно эту переменную. В следующем примере переменная x в модуле x изменяется с использованием системы модулей CommonJS.
Как видно, поскольку локальная переменная не используется, можно напрямую изменить значение атрибута x модуля x. Это новое значение теперь доступно из любого другого модуля, для которого требуется модуль «x».