2015-06-26 104 views
40

我正在用es6使用babel轉譯器編寫節點應用程序。使用es6和babel-node從根目錄導入節點模塊

我有我的根目錄下2個文件index.js & my-module.js

- index.js 
- my-module.js 

我-module.js

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

index.js

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

如果我運行下面的行從命令行一切都按預期工作。

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

但如果我輸入我的模塊時,刪除點:

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

我得到一個錯誤:

Error: Cannot find module '/my-module' 

有什麼理由用我無法導入模塊絕對路徑?無論如何改變.babelrc配置來支持它?在你的文件系統的根目錄中的 'x'

感謝

回答

53

贊(幾乎)任何工具 '/ X' 表示。巴貝爾實際上不看路,它只是編譯

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

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

和節點實際上查找模塊。


如果你真的想要相對於項目的根目錄導入,你可以使用插件。我建議使用一些不太含糊的東西,並確保爲下一個閱讀代碼的人記錄下這些內容!

下面是一個示例,我們使用領先的~來表示相對項目。你可以使用任何你喜歡的東西^也會很好。

示例輸入:

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

腳本/巴別-插件項目相對-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" 
    ] 
} 

輸出(如果在/ tmp中運行):

'use strict'; 

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

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

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

BTW運行您的連接的插件時,我得到如下: 類型錯誤:該插件」 ./scripts/babel-plugin-project-relative-require。 js「沒有導出插件實例 – Gavriguy

+1

@Gavriguy更新babel?確保本地和全球版本是最新版本,'npm i -g babel @ latest; npm i -D babel-core @ latest' – FakeRainBrigand

+0

一旦我將插件打包爲節點模塊('npm install https://github.com/gavriguy/babel-plugin-project-relative-require.git --save')它的作用就像一種魅力。非常感謝@FakeRainBrigand – Gavriguy

7

首先,Babel只是ES2015到ES5語法的轉譯器。它的任務是transpile這樣的:

import {myFunc} from '/my-module' 

成這樣:

var _myModule = require('/my-module'); 
需要按節點進行

實際模塊和節點如何做它,你可以在細節在這裏讀到:https://nodejs.org/api/modules.html#modules_file_modules

要總結,./module表示模塊相對於本地目錄的路徑,/module是模塊的絕對路徑,module觸發節點在本地node_modules目錄中查找模塊,並全部升序。

39

FakeRainBrigand/Gavriguy的解決方案很好,效果很好。 所以我決定開發一個插件,您可以使用npm輕鬆安裝並使用簡單的Babel-Plugin。

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

希望這有助於...

+3

解決了我的問題,沒有頭痛。謝謝 –

+1

鑑於windows操作系統的sourcePath,這個插件在Windows上有一些麻煩。在Linux上它的工作原理很好,我認爲 – Borjante

+2

再次檢查:)自從上次發佈以來,我們支持windows \ o/ –