Importación de módulos de nodo desde el directorio raíz utilizando es6 y babel-node


Estoy escribiendo una aplicación de nodo con es6 usando babel transpiler.

Tengo 2 archivos index.js & my-module.js en mi directorio raíz

- index.js
- my-module.js

Mi-módulo.js

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

Index.js

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

Si corro la siguiente línea desde la línea de comandos todo funciona como se esperaba.

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

Pero si elimino el punto al importar my-module:

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

Estoy recibiendo un error:

Error: Cannot find module '/my-module'

¿Hay alguna razón por la que no pueda importar módulos usando una ruta absoluta? de todos modos para cambiar .babelrc config para apoyarla?

Gracias

Author: gtournie, 2015-06-26

3 answers

Como (casi) cualquier herramienta '/x' significa 'x' en la raíz de su sistema de archivos. Babel en realidad no mira los caminos, solo compila

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

Hacia

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

Y node realmente busca el módulo.


Si realmente desea importar en relación con la raíz del proyecto, podría usar un complemento. Recomiendo usar algo que no sea muy ambiguo, y asegúrese de documentar esto para la próxima persona que lea su código.

Aquí hay un ejemplo donde usamos un llevando ~ a significar relativo del proyecto. Podría usar cualquier cosa que desee, por ejemplo, ^ también sería bueno.

Ejemplo de entrada:

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

Scripts/babel-plugin-project-relative-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's be safe
      if (!babel.types.isLiteral(node.source)) {
        return node;
      }

      var ref = node.source.value;

      // ensure a value, make sure it's 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"
    ]
}

Salida (si se ejecuta en /tmp):

'use strict';

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

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

var _myModule2 = require('./my-module');
 55
Author: FakeRainBrigand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-26 09:06:27

La solución de FakeRainBrigand/Gavriguy es buena y funciona bien. Así que decidí desarrollar un plugin que se puede instalar fácilmente con npm y utilizar un simple Babel-Plugin.

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

Espero que esto ayude...

 40
Author: Michael J. Zoidl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-31 06:48:03

En primer lugar, Babel es solo un transpiler de la sintaxis ES2015 a ES5. Su trabajo es transpilar esto:

import {myFunc} from '/my-module'

En esto:

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

Módulo real que requiere realizado por Nodo, y cómo lo hace Nodo se puede leer en detalles aquí: https://nodejs.org/api/modules.html#modules_file_modules

Para resumir, ./module significa ruta al módulo relativa al directorio local, /module es una ruta absoluta al módulo, module activa el nodo para buscar el módulo en el directorio local node_modules y todos ascendiendo.

 7
Author: vtambourine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-26 10:07:47