Norbert: Babel mit Node.js verwenden

Hallo,

vorab, ich bin ein absoluter Neuling in Sachen Node.js; ich habe es mir buchstäblich vor zwei Tagen runtergeladen. Leider weiß ich nicht, wo ich da mit „lernen“ anfangen soll – ich wäre also über ein paar Tipps in dieser Richtung sehr dankbar. Wie habt ihr da angefangen, welche Internet-Literatur könnt ihr zu diesem Thema empfehlen?

Nun zu meinem Anliegen: irgendwo muss man ja mit Node anfangen, also habe ich mir gedacht, dass ich mir ein Script schreibe, mit dem ich meine JavaScript-Dateien ganz einfach mit Babel übersetzen lassen kann.
Mit meinem Editor (Notepad++) kann ich „externe Programme“ ausführen. Ich habe mir also ein Batch-Script geschrieben, in dem ich mein compile-Script mit Node aufrufe. Dieses Batch-Script habe ich mir auf F5 gelegt. Drücke ich F5, wird mein compile-Script aufgerufen – klappt also soweit.
Scripte, die im selben Ordner wie das compile-Script liegen, kann ich problemlos compilieren, wenn ich aber ein Script compilieren will, das woanders liegt, bekomme ich so ein Error: Error: Couldn't find preset "es2015" relative to directory "../path/to/my/directory"
Entweder ich habe irgendeine Option übersehen, oder das ist unheimlich dämlich. Ich habe Babel am Start (require('babel-core')) und es kann nichts mit den Presets anfangen, sobald ich ein Script in einem anderen Ordner compilieren will – top. Hat jemand eine Idee?

Meine Batch-Script:

@echo off
node babelCompile.js -d=../path/to/my/directory/ input.es6.js output.js
pause>NUL
exit

Mein compile-Script:

let babel = require('babel-core');
let fs = require('fs');
let args = require('minimist')(process.argv.slice(2), {
    alias : {
        d : 'fileDir'
    },
    default : {
        d : './'
    }
});

if (args._.length < 2)
  return console.log('babelCompile : input file and output file are required.'), undefined;


let options = {
    presets : ['es2015'],
    babelrc : false,
    ast : false,
    compact : false,
    minified : false,
    comments : false,
    retainLines : false
};

babel.transformFile(args.fileDir + args._[0], options, function(err, res) {
    if (err)
      throw err;
    
    let compiledCode = res.code.replace(/\r\n|\n|\r/g, '\r\n');
    fs.writeFile(args.fileDir + args._[1], '\uFEFF' + compiledCode, function(err) {
        if (err)
          throw err;
        
        console.log(`Successfully compiled ${args._[0]} to ${args._[1]}`);
    });
});

Norbert

akzeptierte Antworten

  1. Scripte, die im selben Ordner wie das compile-Script liegen, kann ich problemlos compilieren, wenn ich aber ein Script compilieren will, das woanders liegt, bekomme ich so ein Error: Error: Couldn't find preset "es2015" relative to directory "../path/to/my/directory"

    Die Fehlermeldung ist wirklich etwas kryptisch. Ich vermute, dass Babel ausgehend von der zu kompilierenden Datei im Dateisystem aufwärts nach dem Preset sucht. Dort kann es aber nicht gefunden werden, weil du mit ".." aus dem Arbeitsverzeichnis heraus navigierst und dann einen benachbarten Pfad betrittst. Aber wie gesagt, das ist bloß ein Tipp ins Blaue.

  2. Hi,

    vorab, ich bin ein absoluter Neuling in Sachen Node.js; ich habe es mir buchstäblich vor zwei Tagen runtergeladen. Leider weiß ich nicht, wo ich da mit „lernen“ anfangen soll – ich wäre also über ein paar Tipps in dieser Richtung sehr dankbar. Wie habt ihr da angefangen, welche Internet-Literatur könnt ihr zu diesem Thema empfehlen?

    Kommt ganz darauf an, was du damit vorhast. Node.js ist riesig, aber das Arbeiten mit Dateien und womöglich Streams ist schon ein guter Start!

    http://rockbot.github.io/node-for-beginners/

    Nun zu meinem Anliegen: irgendwo muss man ja mit Node anfangen, also habe ich mir gedacht, dass ich mir ein Script schreibe, mit dem ich meine JavaScript-Dateien ganz einfach mit Babel übersetzen lassen kann.

    Das ist eine schöne Übung für den Anfang. Der Vollständigkeit halber der Hinweis, dass Babel auch selbst ein Command-Line-Interface mitbringt. Du kannst freilich, musst aber nicht dein eigenes schreiben. :-)

    https://babeljs.io/docs/usage/cli/

    Scripte, die im selben Ordner wie das compile-Script liegen, kann ich problemlos compilieren, wenn ich aber ein Script compilieren will, das woanders liegt, bekomme ich so ein Error: Error: Couldn't find preset "es2015" relative to directory "../path/to/my/directory"

    Babel-Presets sind nichts anderes als Sammlungen von Babel-Plugins und die kommen als eigene Node-Module daher. Wenn du "es2015" sagst, dann wird genau genommen nach dem Node-Modul "babel-preset-es2015" gesucht. Üblicherweise zuerst in ./node_modules, dann irgendwann in den globalen Node-Modules-Ordner (https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders).

    Wenn bei diesem Lookup das Paket nicht gefunden wird, lässt sich alternativ ein fester Pfad angeben:

    https://babeljs.io/docs/plugins/#pluginpreset-paths

    Vielleicht gibts noch weitere Möglichkeiten, Babel auf den richtigen Pfad zu bringen.

    Viel Erfolg!

    Richard

    1. Guten Abend,

      Babel-Presets sind nichts anderes als Sammlungen von Babel-Plugins und die kommen als eigene Node-Module daher. Wenn du "es2015" sagst, dann wird genau genommen nach dem Node-Modul "babel-preset-es2015" gesucht.

      https://babeljs.io/docs/plugins/#pluginpreset-paths

      Dass nach "babel-preset-es2015" gesucht wird, hatte ich schon gelesen. Dass die Lösung meines Problems presets : [__dirname + '/node_modules/babel-preset-es2015'] ist, finde ich irgendwie öde. Wenn ich babel-core in Verzeichnis A require'n tue, wie kommt man dann auf die verkorkste Idee, für Presets/Plugins relativ vom Input-File-Verzeichnis auszugehen?
      Wenn ich babel-core require'n tue, kann es doch __dirname speichern und für seine eigenen require-Aufrufe verwenden, um die Presets/Plugins zu laden. Warum sollten die woanders liegen, als babel-core selbst?
      Wie auch immer, jetzt läufts.

      http://rockbot.github.io/node-for-beginners/

      Werde ich mir morgen mal genauer anschauen.

      Das ist eine schöne Übung für den Anfang. Der Vollständigkeit halber der Hinweis, dass Babel auch selbst ein Command-Line-Interface mitbringt. Du kannst freilich, musst aber nicht dein eigenes schreiben. :-)

      https://babeljs.io/docs/usage/cli/

      Das hat mich komplett verwirrt. Einerseits schreiben sie:

      While you can install Babel CLI globally on your machine, it’s much better to install it locally project by project.

      Andererseits benutzen sie in den Beispielen $ babel script.js --out-file script-compiled.js. Das geht doch nur, wenn es eben global installiert wurde, oder nicht? Wie sähe das Beispiel denn aus, wenn es nun lokal installiert ist?

      Norbert