使用es6和babel-node从根目录导入节点模块
我正在用es6使用babel编译器来编写节点应用程序。
我的根目录下有两个文件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!!!
但是如果我在导入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
目录下查找模块,并全部升序。