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 (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');
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With