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
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');
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...
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.
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