2016-06-01 8 views
0

Ich habe eine Reihe von voneinander abhängigen Node.js-Module, die ich als ES6-Module erstellt habe, und ich möchte im Idealfall in der Lage sein, ein einzelnes Modul als Einstiegspunkt angeben und diese (unter Verwendung von grunt) in einer einzigen Datei aufbauen, die von einer Node-Anwendung benötigt werden kann.Packing ES6-ausgedrückt Knotendateien in einem einzigen Knoten-Modul

Grunt-Babel scheint nicht in der Lage zu sein, diese Verpackung zu handhaben.

Ich weiß, dass browserify dies für den Browser tun kann, und ich weiß, dass browserify Node-Module enthalten kann, aber ich konnte nicht herausfinden, wie browserify den einzelnen Moduleintrittspunkt in einen require-fähigen Node transformiert Modul.

Also, wenn meine Quelldatei (und Einstiegspunkt), src/hello.js waren:

import world from './world.js'; 
export default function() {console.log('Hello' + world + '!');}; 

und src/world.js waren:

export default 'world'; 

Ich mag es in der Lage sein, um es von einem verwenden normale Knotenanwendung wie:

var hw = require('./dest/hello-world.js'); 
hw(); 

Wie müsste meine Grunt-Datei aussehen?

Antwort

0

Es stellte sich heraus, dass ich zwei Probleme hatte:

In meiner .babelrc Datei, die ich brauchte:

{ 
    "presets": ["es2015"], 
    "plugins": ["add-module-exports"] 
} 

... während in meiner Grunt Datei, die ich brauchte:

browserify: { 
     myNode: { 
      options: { 
       transform: [['babelify', {sourceMaps: true}]], 
       browserifyOptions: { 
        standalone: 'dummyPlaceholder' 
       } 
       // Depending on your needs, you may also 
       // need `node: true` here or the options 
       // in the 2nd argument of the `browserify` call 
       // (as I required to allow GLOBAL.window = GLOBAL 
       // injection) 
       // at https://github.com/substack/node-browserify/issues/1277#issuecomment-115198436 
      }, 
      files: { 
       'dist/<%= pkg.name%>-node.js': 'src/node.js' 
      } 
     } 
    }, 

Das Plugin "add-module-exports" war notwendig, um eine Änderung in Babel zu vermeiden, die Anrufe wie var mod = require('mod').default; statt nur var mod = require('mod'); erfordert.

Die Eigenschaft standalone wird hier nicht verwendet, um eine globale Variable zu erstellen, da sie in einer Modulumgebung (Node/CommonJS) verwendet wird, aber das Vorhandensein der Eigenschaft erforderlich ist, um einen Export auszulösen.