Подтвердить что ты не робот

Импорт модулей node из корневого каталога с помощью es6 и babel- node

Я пишу приложение node с помощью es6 с помощью транспондера babel.

У меня есть 2 файла index.js и my-module.js в корневом каталоге

- index.js
- my-module.js

мой-module.js

export let myFunc = () => {
  console.log('myFunc was called!!!');
}

index.js

import {myFunc} from './my-module';
myFunc();

если я запускаю следующую строку из командной строки, все работает так, как ожидалось.

$ babel-node index.js >> myFunc was called!!!

но если я удаляю точку при импорте my-модуля:

import {myFunc} from '/my-module';
myFunc();

Я получаю сообщение об ошибке:

Error: Cannot find module '/my-module'

Любая причина, по которой я не могу импортировать модули с использованием абсолютного пути? в любом случае, чтобы изменить конфигурацию .babelrc для поддержки?

Спасибо

4b9b3361

Ответ 1

Как (почти) любой инструмент '/x' означает "x" в корне вашей файловой системы. Бабель фактически не смотрит на пути, он просто компилирует

import {myFunc} from '/my-module';

в

var _myModule = require('/my-module');

И node действительно ищет модуль.


Если вы действительно хотите импортировать относительно корня проекта, вы можете использовать плагин. Я рекомендую использовать что-то, что не очень двусмысленно, и убедитесь, что вы документируете это для следующего человека, читающего ваш код!

Здесь пример, в котором мы используем ведущий ~ для обозначения отношения к проекту. Вы можете использовать все, что вам нравится, например. ^ также будет хорошим.

Пример ввода:

import {a} from '~my-module';
import {b} from '/my-module';
import {c} from './my-module';

Сценарии/столпотворение-плагин-проект-Относительный-require.js

module.exports = function (babel) {
  // get the working directory
  var cwd = process.cwd();

  return new babel.Transformer("babel-plugin-project-relative-require", {
    ImportDeclaration: function(node, parent) {
      // probably always true, but let be safe
      if (!babel.types.isLiteral(node.source)) {
        return node;
      }

      var ref = node.source.value;

      // ensure a value, make sure it not home relative e.g. ~/foo
      if (!ref || ref[0] !== '~' || ref[1] === '/') {
        return node;
      }

      node.source.value = cwd + '/' + node.source.value.slice(1);

      return node;
    }
  });
};

.babelrc

{
    "plugins": [
        "./scripts/babel-plugin-project-relative-require.js"
    ]
}

Выход (если выполняется в /tmp ):

'use strict';

var _tmpMyModule = require('/tmp/my-module');

var _myModule = require('/my-module');

var _myModule2 = require('./my-module');

Ответ 2

Решение от FakeRainBrigand/Gavriguy хорошо и хорошо работает. Поэтому я решил разработать плагин, который вы можете легко установить с помощью npm и использовать простой Babel-Plugin.

https://github.com/michaelzoidl/babel-root-import

Надеюсь, что это поможет...

Ответ 3

Прежде всего, Babel является просто транспилером от ES2015 до синтаксиса ES5. Его задача состоит в том, чтобы превзойти это:

import {myFunc} from '/my-module'

в это:

var _myModule = require('/my-module');

Фактический модуль, требуемый для выполнения Node, и как это можно сделать здесь Node: https://nodejs.org/api/modules.html#modules_file_modules

К итогу, ./module означает путь к модулю относительно локального каталога, /module - это абсолютный путь к модулю, module триггеры Node для поиска модуля в локальном каталоге node_modules и все возрастающие.