Я только начал работать над небольшим проектом, который будет взаимодействовать с MongoDB. Тем не менее, я не могу заставить соответствующие модули узла правильно импортировать, даже если я правильно их установил npm
.
Например, следующий код выдает ошибку, сообщая, что «экспресс не имеет экспорта по умолчанию»:
import express from "express";
Тем не менее, этот код работает:
const express = require("express");
Итак, мой вопрос: в чем разница в том, как функционируют методы import и variable / require? Я хотел бы исправить все, что мешает моему импорту в проекте, так как это может вызвать дополнительные проблемы в будущем.
node.js
typescript
import
require
austinthemassive
источник
источник
express
будет иметь типany
. Вы можете включить определения отсюда npmjs.com/package/@types/expressОтветы:
Эта простая диаграмма, которая помогает мне понять разницу между
require
иimport
.Помимо этого,
Вы не можете выборочно загружать только те части, которые вам нужны,
require
ноimports
вы можете выборочно загружать только те части, которые вам нужны. Это может сохранить память.Загрузка является синхронной (шаг за шагом), поскольку,
require
с другой стороны,import
может быть асинхронной (без ожидания предыдущего импорта), поэтому она может работать немного лучше, чемrequire
.источник
module.exports
когда код инициализации модуля завершает работу. Одно это различие создает проблемы совместимости при попытке заставить работать один модуль как для ESM, так и для CommonJS.Основное различие между
require
иimport
заключается в том, что онrequire
будет автоматически сканироватьnode_modules
для поиска модулей, ноimport
, исходя из ES6, не будет.Большинство людей используют Babel для компиляции
import
иexport
, что делает такimport
же, какrequire
.Будущая версия Node.js может поддерживать
import
себя (фактически, экспериментальная версия уже поддерживает ) и, судя по примечаниям Node.js,import
не будет поддерживатьnode_modules
, она основана на ES6 и должна указывать путь модуля.Поэтому я бы посоветовал вам не использовать
import
с babel, но эта функция еще не подтверждена, она может поддержатьnode_modules
в будущем, кто бы знал?Для справки ниже приведен пример того, как babel может преобразовать
import
синтаксис ES6 в синтаксис CommonJSrequire
.Скажем, файл
app_es6.js
содержит этот импорт:Это директива для импорта функции форматирования из пакета узла date-fns .
Связанный
package.json
файл может содержать что-то вроде этого:Связанный
.babelrc
файл может быть примерно таким:Этот
build-server-file
скрипт, определенный вpackage.json
файле, является для babel директивой для анализаapp_es6.js
файла и вывода файлаapp.js
.После запуска
build-server-file
скрипта, если вы откроетеapp.js
и посмотрите наdate-fns
импорт, вы увидите, что он был преобразован в это:Большая часть этого файла запутана для большинства людей, однако компьютеры это понимают.
Также для справки, в качестве примера того, как модуль может быть создан и импортирован в ваш проект, если вы установите
date-fns
и откроете его,node_modules/date-fns/get_year/index.js
вы увидите, что он содержит:Используя описанный выше процесс babel, ваш
app_es6.js
файл может содержать:И Babel будет конвертировать импорт в:
И обрабатывать все ссылки на функцию соответственно.
источник
require
равноimport won't support node_modules
Что ты имел в виду под этим?Позвольте мне привести пример для включения экспресс-модуля с require & import
-require
-Импортировать
Таким образом, после использования любого из приведенных выше утверждений у нас будет переменная с именем «express». Теперь мы можем определить переменную app как:
Поэтому мы используем 'require' с 'CommonJS' и 'import' с 'ES6'.
Чтобы узнать больше о 'require' & 'import', прочитайте ссылки ниже.
require - Требование модулей в Node.js: все, что вам нужно знать
import - Обновление модулей ES6 в Node.js
источник
Здесь нет ответа и больше похоже на комментарий, извините, но я не могу комментировать.
В узле V10 вы можете использовать флаг,
--experimental-modules
чтобы сообщить Nodejs, что вы хотите использоватьimport
. Но ваш сценарий входа должен заканчиваться.mjs
.Обратите внимание, что это все еще экспериментальная вещь и не должна использоваться в производстве.
Ссылка 1 - Документ Nodejs
Ссылка 2 - выпуск github
источник
новый ES6:
«import» следует использовать с ключевыми словами «export» для совместного использования переменных / массивов / объектов между js-файлами:
старая школа:
'require' должен использоваться с 'module.exports'
источник