Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I'm writing a node app with es6 using babel transpiler.

I have 2 files index.js & my-module.js on my root directory

- index.js - my-module.js 

my-module.js

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

index.js

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

if I run the following line from the command line everything works as expected.

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

but if I remove the dot when importing my-module:

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

I'm getting an error:

Error: Cannot find module '/my-module' 

Any reason why I can't import modules using an absolute path? anyway to change .babelrc config to support it?

Thanks

like image 231
Gavriguy Avatar asked Jun 26 '15 08:06

Gavriguy


1 Answers

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] === '/') {         return node;       }        node.source.value = cwd + '/' + 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'); 
like image 76
Brigand Avatar answered Sep 17 '22 12:09

Brigand