Importing node modules from root directory using es6 and babel-node

Like (almost) any tool ‘/x’ means ‘x’ in the root of your filesystem. Babel doesn’t actually look at the paths, it just compiles

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

into

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

And node actually looks up the module.


If you really want to import relative to the root of the project, you could use a plugin. I recommend using something that isn’t very ambiguous, and make sure you document this for the next person reading your code!

Here’s an example where we use a leading ~ to mean project relative. You could use anything you like e.g. ^ would also be good.

Example Input:

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

scripts/babel-plugin-project-relative-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] === "https://stackoverflow.com/") {
        return node;
      }

      node.source.value = cwd + "https://stackoverflow.com/" + node.source.value.slice(1);

      return node;
    }
  });
};

.babelrc

{
    "plugins": [
        "./scripts/babel-plugin-project-relative-require.js"
    ]
}

Output (if run in /tmp):

'use strict';

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

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

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

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)