Есть ли способ импортировать из этого модуля узла с помощью «импорта» вместо «требовать»?

Я использую этот модуль node 'deep-equal'(), и до сих пор единственный способ получить доступ к функции в нем — это var equal = require('deep-equal');, как это предлагается в документации. Я обычно использую import вместо require, и мне интересно, можно ли использовать import с этим модулем. Основная функция экспортируется из файла в эту строку:

var deepEqual = module.exports = function (actual, expected, opts) {...}

Можно ли импортировать эту функцию с помощью import или только с помощью require?

Спасибо!

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
985
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, вы действительно можете.

Если вы используете nodejs LTS, вам нужно будет использовать расширение .mjs для файла, в котором вы используете import, и передать флаг experimental-modules во время запуска процесса node.

// foo.mjs
import equal from 'deep-equal';

node --experimental-modules foo.mjs

Начиная с nodejs 12.3.0 вы можете просто передать experimental-modules. Из документы

Once enabled, Node.js will treat the following as ES modules when passed to node as the initial input, or when referenced by import statements within ES module code

Также вы можете указать type как module в своем package.json:

// package.json
{
  "type": "module"
}

Из документов

Files ending with .js or .mjs, or lacking any extension, will be loaded as ES modules when the nearest parent package.json file contains a top-level field "type" with a value of "module"

Привет @ 1556089774, спасибо за информацию. Почему вы не можете импортировать его обычным способом с помощью «import equal from 'deep-equal'» без других вещей?

gkeenley 22.05.2019 17:51

Функция имеет флаг experimental. Короче говоря, не поддерживается как стабильный

1565986223 22.05.2019 18:11

Извините, я имею в виду, что это за способ написания модуля, с "var deepEqual = module.exports = function (actual, expect, opts) {...}", который делает так, что вы не можете импортировать с помощью " import equal from 'deep-equal' ", как вы могли бы, если бы модуль был написан как "export default deep-equal {...}"

gkeenley 22.05.2019 18:22

проверено на моей машине, и импорт с экспериментальным флагом работает нормально. var deepEqual = module.exports = это всего лишь назначение объекта module.exports в deepEqual, теперь они ссылаются на один и тот же объект, вот и все

1565986223 22.05.2019 18:32

Что касается «это только назначение объекта module.exports для deepEqual» и т. д.: почему это делает его таким, что вы можете импортировать с помощью «var deep = require ('deep-equal')», но не с «import {deep} from 'deep -равный'"?

gkeenley 22.05.2019 19:49
but not with "import {deep} from 'deep-equal'", теперь вы путаете default экспорт и named экспорт, import { something } ... импортирует именованный экспорт, если объект экспорта не содержит something как именованный экспорт, вы не можете его импортировать (что-то будет undefined). эквивалент var deep = require('deep-equal') с использованием синтаксиса импорта: import deep from 'deep-equal'
1565986223 22.05.2019 20:04

Да, но здесь я тоже не могу использовать import deep from 'deep-equal'. Модуль не имеет экспорта по умолчанию. Мне все еще интересно, что это за var deepEqual = module.exports = function (actual, expected, opts) {...}, который позволяет мне импортировать функцию из него с помощью require, но не позволяет мне импортировать ее с помощью import, если я не использую что-то вроде foo.mjs.

gkeenley 22.05.2019 20:14

Этот var deepEqual = module.exports = function (actual, expected, opts) {...} является экспортом по умолчанию. Также я проверил на своей машине, и это работает. import deep from 'deep-equal' дает мне экспортированную функцию

1565986223 22.05.2019 20:16

Интересно, что «импорт глубоко…» работает в моем приложении React Native, но выдает ошибку, когда я пытаюсь сделать это в файле .js, который я запускаю с помощью node. Ошибка "(функция (экспорт, требование, модуль, __filename, __dirname) { import deep from 'deep-equal' ^^^^ SyntaxError: Неожиданный идентификатор" . Любая идея, почему это может быть?

gkeenley 22.05.2019 21:06

В React Native вы можете импортировать благодаря плагину babel. Ошибка связана с тем, что вы либо не передаете --experimental-modules (до узла 12 вам также нужно будет называть файлы с расширением .mjs), либо используете старую версию узла, которая не поддерживает событие модуля с экспериментальными модулями.

1565986223 23.05.2019 06:46

Другие вопросы по теме