使用es6和babel-node从根目录导入节点模块

我正在用es6使用babel编译器来编写节点应用程序。

我的根目录下有两个文件index.jsmy-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!!! 

但是如果我在导入my-module时删除了这个点:

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

我收到一个错误:

 Error: Cannot find module '/my-module' 

任何我无法使用绝对path导入模块的原因? 无论如何改变.babelrcconfiguration来支持它?

谢谢

像(几乎)任何工具'/ x'都是在文件系统根目录下的'x'。 巴贝尔实际上并没有看到path,只是编译而已

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

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

而节点实际上查找模块。


如果你真的想要相对于项目的根目录导入,你可以使用一个插件。 我build议使用一些不太含糊的东西,并确保为下一个读取代码的人logging下这些内容!

这里有一个例子,我们使用了一个领先的~平均项目相对。 你可以使用任何你喜欢的东西,例如^也是好的。

input示例:

 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 eg ~/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'); 

从FakeRainBrigand / Gavriguy的解决scheme是好的,运作良好。 所以我决定开发一个插件,你可以用npm轻松安装,使用一个简单的Babel-Plugin。

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

希望这可以帮助…

首先,Babel只是一个从ES2015到ES5语法的转换器。 它的工作是传递这个:

 import {myFunc} from '/my-module' 

进入这个:

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

需要由Node执行的实际模块以及Node如何执行,您可以在此处详细阅读: https : //nodejs.org/api/modules.html#modules_file_modules

总结一下,./ ./module表示模块相对于本地目录的path, /module/module的绝对path, module触发Node在本地node_modules目录下查找模块,并全部升序。