standalone react implement ecmascript-6 babeljs

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...