2015-06-26 10 views
40

Ich schreibe eine Knoten-App mit es6 mit Babel transpiler.Importieren von Knoten-Modulen aus dem Stammverzeichnis mit es6 und babel-Knoten

Ich habe 2 Dateien index.js & my-module.js auf meinem Stammverzeichnis

- index.js 
- my-module.js 

my-module.js

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

index.js

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

wenn ich laufen die folgende Zeile Von der Kommandozeile aus funktioniert alles wie erwartet.

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

aber wenn ich den Punkt entfernen, wenn mein-Modul einge:

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

Ich erhalte eine Fehlermeldung:

Error: Cannot find module '/my-module' 

Gibt es Gründe, warum ich nicht Module importieren können mit ein absoluter Pfad? sowieso um .babelrc config zu ändern, um es zu unterstützen?

Dank

Antwort

53

Wie (fast) jedes Werkzeug '/ x' bedeutet 'x' in der Root-Partition. Babel sieht nicht wirklich auf den Pfaden, es kompiliert nur

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

in

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

Und Knoten sieht eigentlich das Modul auf.


Wenn Sie wirklich relativ zum Stamm des Projekts importieren möchten, könnten Sie ein Plugin verwenden. Ich empfehle, etwas zu verwenden, das nicht sehr zweideutig ist, und stellen Sie sicher, dass Sie dies für die nächste Person dokumentieren, die Ihren Code liest!

Hier ist ein Beispiel, wo wir eine führende ~ verwenden, um Projekt relativ zu meinen. Du könntest alles verwenden, was du magst, z.B. ^ wäre auch gut.

Beispiel Eingabe:

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

Skripte/babel-Plugin-Projekt-Relativ 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" 
    ] 
} 

Output (wenn in/tmp laufen):

'use strict'; 

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

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

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

btw, wenn Ihr angebracht Plugin läuft bekomme ich folgendes: Typeerror: Das Plugin“./scripts/babel-plugin-project-relative-require. js "hat keine Plugin-Instanz exportiert – Gavriguy

+1

@Gavriguy update babel? Stellen Sie sicher, dass die lokale und die globale Version auf dem neuesten Stand sind. 'Npm i -g babel @ latest; npm i -D Babel-Core @ neuesten " – FakeRainBrigand

+0

Sobald ich das Plugin als Knoten-Modul verpackt (' Npm installieren https://github.com/gavriguy/babel-plugin-project-relative-require.git --save') es wirkt wie ein Zauber. sehr geschätzt @FakeRainBrigand – Gavriguy

7

Zunächst ist Babel nur ein Transpiler von ES2015 zu ES5 Syntax.Seine Aufgabe ist es, dies transpile:

import {myFunc} from '/my-module' 

in diese:

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

Actual Modul von Knoten ausgeführt erfordern, und wie Knoten tut es Sie in Details hier lesen: https://nodejs.org/api/modules.html#modules_file_modules

Zur Übersicht ./module bedeutet Pfad zum Modul relativ zum lokalen Verzeichnis, /module ist ein absoluter Pfad zum Modul, module löst den Knoten aus, um nach dem Modul im lokalen Verzeichnis node_modules und aufsteigend zu suchen.

39

Die Lösung von FakeRainBrigand/Gavriguy ist gut und funktioniert gut. Also habe ich mich entschlossen, ein Plugin zu entwickeln, das man einfach mit npm installieren kann und ein einfaches Babel-Plugin benutzt.

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

hoffe, das hilft ...

+3

löst mein Problem ohne Kopfschmerzen. Danke –

+1

Dieses Plugin hat einige Probleme mit Windows angesichts der SourcePath von Windows-Betriebssystemen. Unter Linux funktioniert es gut, dachte – Borjante

+2

Überprüfen Sie erneut :) Wir unterstützen Windows seit der letzten Veröffentlichung \ o/ –

Verwandte Themen