2015-06-26 13 views
40

Piszę aplikację węzła z es6 za pomocą transpilka babel.Importowanie modułów węzłów z katalogu root przy użyciu es6 i węzeł-babel

mam 2 pliki index.js & my-module.js na moim katalogu

- index.js 
- my-module.js 

moi-module.js

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

index.js

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

jeśli uruchomić następującą linię z linii poleceń wszystko działa zgodnie z oczekiwaniami.

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

ale jeśli usunąć kropkę podczas importowania mój moduł:

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

Dostaję błąd:

Error: Cannot find module '/my-module' 

Każdy powód, dlaczego nie mogę importować moduły za pomocą absolutna ścieżka? mimo to zmienić konfigurację .babelrc, aby ją obsłużyć?

Dzięki

Odpowiedz

53

jak (prawie) każde narzędzie '/ x' oznacza 'x' w katalogu głównym systemu plików. Babel nie spojrzy na ścieżkach, po prostu kompiluje

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

do

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

I węzeł faktycznie patrzy moduł.


Jeśli naprawdę chcesz zaimportować względem katalogu głównego projektu, możesz użyć wtyczki. Zalecam użycie czegoś, co nie jest zbyt niejednoznaczne, i upewnij się, że dokumentujesz to dla następnej osoby czytającej twój kod!

Oto przykład, w którym używamy wiodącego ~ do określenia względnego projektu. Możesz użyć czegokolwiek, na przykład ^ również byłby dobry.

Przykład wejściowe:

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

scripts/babel-plugin-project-względnego 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" 
    ] 
} 

wyjścia (jeśli działają w/tmp):

'use strict'; 

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

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

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

btw kiedy prowadzenie załączony wtyczki uzyskać następujące: TypeError: Wtyczka”./scripts/babel-plugin-project-relative-require. js "nie wyeksportował instancji Plugin – Gavriguy

+1

@ Babel aktualizuj Babel? Upewnij się, że wersje lokalne i globalne są aktualne, 'npm i -g babel @ latest; npm i -D babel-core @ latest' – FakeRainBrigand

+0

Raz pakowałem wtyczkę jako moduł węzła ('npm install https://github.com/gavriguy/babel-plugin-project-relative-require.git --save') To działa jak urok. bardzo doceniany @FakeRainBrigand – Gavriguy

7

Przede wszystkim Babel jest tylko transpilerem ze składni ES2015 do ES5.Jej zadaniem jest transpile to:

import {myFunc} from '/my-module' 

w tym:

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

Rzeczywista moduł wymagających wykonywane przez węzeł i jak Node robi to można przeczytać w informacji tutaj: https://nodejs.org/api/modules.html#modules_file_modules

Aby podsumowanie , ./module oznacza ścieżkę do modułu względem katalogu lokalnego, /module jest bezwzględną ścieżką do modułu, module wyzwala Węzeł do wyszukiwania modułu w lokalnym katalogu node_modules i wszystkich rosnących.

39

Rozwiązanie z FakeRainBrigand/Gavriguy jest dobre i działa dobrze. Postanowiłem więc opracować wtyczkę, którą można łatwo zainstalować za pomocą npm i użyć prostego dodatku Babel-Plugin.

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

Nadzieja to pomaga ...

+3

rozwiązuje mój problem bez bólów głowy. dzięki –

+1

Ta wtyczka ma pewne problemy z działaniem w systemie Windows, biorąc pod uwagę sourcePath systemów operacyjnych Windows. W Linuksie działa dobrze przemyśl – Borjante

+2

Sprawdź ponownie :) Obsługujemy okna od ostatniego wydania \ o/ –

Powiązane problemy