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

前端 未结 3 1651
[愿得一人]
[愿得一人] 2020-12-13 23:57

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

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

-          


        
相关标签:
3条回答
  • 2020-12-14 00:07

    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');
    
    0 讨论(0)
  • 2020-12-14 00:17

    First of all, Babel is just a transpiler from ES2015 to ES5 syntax. Its job is to transpile this:

    import {myFunc} from '/my-module'
    

    into this:

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

    Actual module requiring performed by Node, and how Node does it you can read in details here: https://nodejs.org/api/modules.html#modules_file_modules

    To summary, ./module means path to module relative to local directory, /module is an absolute path to module, module triggers Node to look for module in local node_modules directory and all ascending.

    0 讨论(0)
  • 2020-12-14 00:31

    The solution from FakeRainBrigand/Gavriguy is good and works well. So i decided to develop a plugin which you can easily install with npm in and use a simple Babel-Plugin.

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

    Hope this helps...

    0 讨论(0)
提交回复
热议问题