ecmascript-6 - react - babel standalone
Importar módulos de nodo desde el directorio raíz usando es6 y babel-node (3)
Estoy escribiendo una aplicación de nodo con es6 usando Babel Transpiler.
Tengo 2 archivos index.js
y my-module.js
en mi directorio raíz
- index.js
- my-module.js
my-module.js
export let myFunc = () => {
console.log(''myFunc was called!!!'');
}
index.js
import {myFunc} from ''./my-module'';
myFunc();
si ejecuto la siguiente línea desde la línea de comandos, todo funciona como se espera.
$ babel-node index.js >> myFunc was called!!!
pero si elimino el punto al importar my-module:
import {myFunc} from ''/my-module'';
myFunc();
Me aparece un error:
Error: Cannot find module ''/my-module''
¿Alguna razón por la que no puedo importar módulos usando una ruta absoluta? de todos modos para cambiar .babelrc config para que lo soporte?
Gracias
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'';
dentro
var _myModule = require(''/my-module'');
Y el nodo realmente busca el módulo.
Si realmente desea importar en relación con la raíz del proyecto, puede 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 en el que utilizamos un pariente del proyecto principal ~
para significar. Puedes usar cualquier cosa que te guste, 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'');
En primer lugar, Babel es simplemente un transpiler de la sintaxis de ES2015 a ES5. Su trabajo es transpilar esto:
import {myFunc} from ''/my-module''
dentro de esto:
var _myModule = require(''/my-module'');
El módulo real requiere que se realice mediante Node, y cómo lo hace Node, aquí puede leer los detalles: https://nodejs.org/api/modules.html#modules_file_modules
Para resumir, ./module
significa camino al módulo relativo al directorio local, /module
es una ruta de acceso absoluta al módulo, el module
activa el nodo para buscar el módulo en el directorio local node_modules
y todo lo que asciende.
La solución de FakeRainBrigand / Gavriguy es buena y funciona bien. Así que decidí desarrollar un plugin que puedes instalar fácilmente con npm y usar un simple Babel-Plugin.
https://github.com/michaelzoidl/babel-root-import
Espero que esto ayude...