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

Gav*_*guy 42 ecmascript-6 babeljs

我正在用一个使用babel transpiler的es6编写节点应用程序.

我有2个文件index.jsmy-module.js我的根目录

- index.js
- my-module.js
Run Code Online (Sandbox Code Playgroud)

我-module.js

export let myFunc = () => {
  console.log('myFunc was called!!!');
}
Run Code Online (Sandbox Code Playgroud)

index.js

import {myFunc} from './my-module';
myFunc();
Run Code Online (Sandbox Code Playgroud)

如果我从命令行运行以下行,一切都按预期工作.

$ babel-node index.js >> myFunc was called!!!
Run Code Online (Sandbox Code Playgroud)

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

import {myFunc} from '/my-module';
myFunc();
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

Error: Cannot find module '/my-module'
Run Code Online (Sandbox Code Playgroud)

我无法使用绝对路径导入模块的任何原因?无论如何改变.babelrc配置来支持它?

谢谢

Bri*_*and 56

像(几乎)任何工具'/ x'在文件系统的根目录中表示'x'.Babel实际上并不看路径,它只是编译

import {myFunc} from '/my-module';
Run Code Online (Sandbox Code Playgroud)

var _myModule = require('/my-module');
Run Code Online (Sandbox Code Playgroud)

节点实际上查找模块.


如果您确实想要相对于项目的根目录导入,则可以使用插件.我建议使用不太模糊的东西,并确保为下一个阅读代码的人记录这些内容!

这是一个我们使用导致~平均项目相对的例子.你可以使用任何你喜欢的东西,例如^也会很好.

示例输入:

import {a} from '~my-module';
import {b} from '/my-module';
import {c} from './my-module';
Run Code Online (Sandbox Code Playgroud)

脚本/巴贝尔,插件项目后相对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;
    }
  });
};
Run Code Online (Sandbox Code Playgroud)

.babelrc

{
    "plugins": [
        "./scripts/babel-plugin-project-relative-require.js"
    ]
}
Run Code Online (Sandbox Code Playgroud)

输出(如果在/ tmp中运行):

'use strict';

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

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

var _myModule2 = require('./my-module');
Run Code Online (Sandbox Code Playgroud)


Mic*_*idl 41

来自FakeRainBrigand/Gavriguy的解决方案很好并且效果很好.所以我决定开发一个插件,你可以用npm轻松安装并使用一个简单的Babel-Plugin.

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

希望这可以帮助...

  • 再次检查:)自上次发布以来我们支持windows\o / (2认同)

vta*_*ine 8

首先,Babel只是从ES2015到ES5语法的转换器.它的工作是转发这个:

import {myFunc} from '/my-module'
Run Code Online (Sandbox Code Playgroud)

进入这个:

var _myModule = require('/my-module');
Run Code Online (Sandbox Code Playgroud)

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

总结,./module表示模块相对于本地目录/module的路径,是模块的绝对路径,module触发Node查找本地node_modules目录中的模块以及所有升序.