Babel не разрешает импорт без расширения файла .js

#javascript #babeljs

Вопрос:

Я установил babel и теперь могу, например, использовать синтаксис импорта. Однако этот код import { dbConnect } from './utils/dbConnect.js'; работает, но этот код import { dbConnect } from './utils/dbConnect'; не работает.

Я часами искал в Интернете, и, насколько я понимаю, эта функция должна быть автоматически включена в @babel/preset-env, которую я уже установил. Вот мои зависимости:

 "dependencies": {
    "@babel/core": "^7.14.6",
    "@babel/node": "^7.14.5",
    "@babel/preset-env": "^7.14.5",
    "body-parser": "^1.19.0",
    "cors": "^2.8.5",
    "dotenv": "^10.0.0",
    "express": "^4.17.1",
    "mongoose": "^5.12.14",
    "nodemon": "^2.0.7"
  },
  "devDependencies": {
    "eslint": "^7.28.0",
    "eslint-config-airbnb-base": "^14.2.1",
    "eslint-plugin-import": "^2.23.4"
  }
 

В настоящее время у меня нет .babelrc файла.

Вот в чем ошибка:

 internal/process/esm_loader.js:74
    internalBinding('errors').triggerUncaughtException(
                              ^

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/Users/me/Repositories/myrepo/server/utils/dbConnect' imported from /Users/me/Repositories/myrepo/server/index.js
Did you mean to import ../utils/dbConnect.js?
    at finalizeResolution (internal/modules/esm/resolve.js:276:11)
    at moduleResolve (internal/modules/esm/resolve.js:699:10)
    at Loader.defaultResolve [as _resolve] (internal/modules/esm/resolve.js:810:11)
    at Loader.resolve (internal/modules/esm/loader.js:88:40)
    at Loader.getModuleJob (internal/modules/esm/loader.js:241:28)
    at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:56:40)
    at link (internal/modules/esm/module_job.js:55:36) {
  code: 'ERR_MODULE_NOT_FOUND'
 

Комментарии:

1. Так в чем же заключается ошибка, которую вы получаете? «не работает» — не очень полезное описание.

2. @loganfsmyth извиняется, я думал, что описания было достаточно. Отредактировал мою операцию, чтобы включить ошибку.

3. Эта ошибка, похоже, не из Вавилона, хотя это трудно сказать без отслеживания стека. Вы используете собственный модуль Node? (Как "type":"module" в вашем package.json ?)

4. Да, мой пакет.json имеет тип module. Я постараюсь опубликовать полный след, когда вернусь домой.

Ответ №1:

В итоге я разрешил импорт без расширения файла со следующим: --experimental-modules --es-module-specifier-resolution=node добавлен в узел во время запуска моего приложения.

Мой начальный сценарий теперь: "start": "nodemon --exec babel-node --require dotenv/config --experimental-modules --es-module-specifier-resolution=node index.js"

Ответ №2:

Если вы используете встроенную поддержку модуля ES узла через "type": "module" или .mjs , то вы выбираете более строгие требования. Узел требует, чтобы вы явно указывали расширения файлов как часть этого.

Официальные плагины Babel не имеют никакой логики для добавления расширений, поскольку это на самом деле не связано с ECMAScript как языком/спецификацией. Вы могли бы рассмотреть возможность использования плагина сообщества, такого как https://www.npmjs.com/package/babel-plugin-add-import-extension, что, по-видимому, подтверждает то, что вы ищете.

Комментарии:

1. Как мне сделать так, чтобы я мог импортировать файлы .js без указания расширения файла? Я в замешательстве, потому что я думал, что babel позаботится об этом, и при преобразовании кода он добавит расширение файла в конце.