Узел 14: Импорт модулей с использованием абсолютного пути для собственного модуля ES6

#javascript #node.js #ecmascript-6

#javascript #node.js #ecmascript-6

Вопрос:

Я пишу приложение в node 14.9.0 . Я создал модуль ES6, добавив его "type": "module" в свой package.json . Я пытаюсь импортировать модули для своего проекта. Я хочу избежать использования относительного импорта (потому что ../../ это так читаемо) и вместо этого хочу использовать абсолютный импорт, как если бы каждый модуль импортировался из index.js файла в корне моего проекта.

Из того, что я собрал о том, как узел обнаруживает модули, опуская . в начале моего пути импорта, должно было заставить узел по умолчанию искать модули из корня моего проекта. Однако вместо этого он пытается выполнить поиск из корня моего жесткого диска.

 ...
import User from '/models/user.model';
...
Error [ERR_MODULE_NOT_FOUND]: Cannot find module 'C:modelsuser.model' imported from C:UsersUserDocumentsMy Appmy-appindex.js
  

Я не использую typescript, webpack, babel или любой другой транспилер. Возможно ли получить абсолютный импорт без них?

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

1. «опуская . в начале моего пути импорта должен был быть установлен узел по умолчанию для поиска модулей из корня моего project.t «. Нет, это неверно. Если ваш путь начинается с / , то он будет начинаться в корне вашего диска, как и любой путь, заданный для любой функции ОС. Нет префикса, который заставляет его начинаться в корне вашего проекта. Модули не знают о вашем проекте. Они знают только о себе (в этом отношении они самодостаточны) и текущем рабочем каталоге (который может варьироваться в зависимости от того, как была запущена программа).

2. Если вы хотите перейти относительно каталога вашего модуля, то вам нужно будет использовать ./ или один или более ../ в вашем пути, чтобы подняться на один или несколько уровней.

3. Как бы вы порекомендовали настроить абсолютный импорт в этом случае?

4. @Nostupidquestions Если вы хотите разрешить их относительно папки вашего проекта, это не абсолютный импорт. Вы бы написали import User from 'models/user.model'; и указали своему загрузчику модуля, из какого места это разрешить.

5. Для абсолютного импорта (который обычно не является тем, что вы хотите), вы бы просто указали полный путь, даже включая диск. Если вы покажете нам иерархию каталогов, которая показывает, где находится целевой модуль и где находится модуль, в который вы пытаетесь импортировать, тогда мы могли бы помочь вам создать относительный путь, который не зависел бы от того, где проект был установлен на диске. Или, если вы действительно хотите абсолютный, мы могли бы показать, как выполнить и абсолютный импорт, но вы не показали нам, где что-либо находится на вашем жестком диске, поэтому мы не можем посоветовать более конкретно.

Ответ №1:

Потому что вам не хватает *.js расширения. Это требуется для модулей узла ECMA (https://nodejs.org/api/esm.html#esm_mandatory_file_extensions). Это будет работа (сейчас я разрабатываю в узле 14 без Babel):

 import User from '/models/user.model.js';
  

и в корневом package.json вы должны добавить:

 "type": "module"
  

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

1. Похоже, это не работает. Если я использую это, я получаю сообщение об ошибке Cannot find module 'C:modelsuploader.model.js'

2. и есть ли у вас этот файл в C:modelsuploader.model.js ? где у вас есть файл package.json с "type": "module" ?

3. Нет, файл package.json находится в папке проекта в моих документах. Если я импортирую без . , он пытается получить модули из C:/ , которые находятся не там, где они расположены. Файл package.json имеет "type": "module" .

4. Вы должны использовать пример относительного пути ../../uploader.model.js . Относительно файла, в который вы включаете эту модель.