2015-07-20 7 views
8

Ich kann babel/polyfill mit Schluck nicht richtig laden. In meinem Fall Array.from Methode ist nicht definiert. Wenn jedoch versuchen, browser-polyfill.js mit Schluck .add(require.resolve("babel/polyfill")) laden, erhalte ich einen Fehler "only one instance of babel/polyfill is allowed". Quellcode ist korrekt, weil ich es mit babel browser-polyfill.js getestet habe.Babel Polyfill und Schluck

Quellcode:

//Lib.js 
export default class Lib 
{ 
    constructor() 
    { 
    var src = [1, 2, 3]; 
    this.dst = Array.from(src); 
    } 
    foo() 
    { 
    return this.dst; 
    } 
} 

//main.js 
import Lib from "./Lib"; 

var l = new Lib(); 
console.log(l.foo()); //Uncaught TypeError: Array.from is not a function 

Gulpfile:

var gulp  = require('gulp'); 
var sourcemaps = require('gulp-sourcemaps'); 
var source  = require('vinyl-source-stream'); 
var buffer  = require('vinyl-buffer'); 
var browserify = require('browserify'); 
var watchify = require('watchify'); 
var babelify = require('babelify'); 
var uglify  = require('gulp-uglify'); 

var entryPoint = "./js/main.js"; 


function compile(watch) 
{ 
    var bundler; 

    function debug() 
    { 
    bundler.bundle() 
    .on('error', function(err) { console.error(err); this.emit('end'); }) 
    .pipe(source('main.debug.js')) 
    .pipe(buffer()) 
    .pipe(sourcemaps.init({ loadMaps: true })) 
    .pipe(sourcemaps.write('./')) 
    .pipe(gulp.dest('./bin')); 
    } 

    function release() 
    { 
    bundler.bundle() 
    .on('error', function(err) { console.error(err); this.emit('end'); }) 
    .pipe(source('main.release.js')) 
    .pipe(buffer()) 
    .pipe(uglify()) 
    .pipe(gulp.dest('./bin')); 
    } 

    if(watch) 
    { 
    bundler = watchify(browserify(entryPoint, { debug: watch }) 
         .add(require.resolve("babel/polyfill")) 
         .transform(babelify)); 

    bundler.on('update', function() 
    { 
     console.log('Sources has changed. Rebuilding...'); 
     debug(); 
    }); 

    debug(); 
    } 
    else 
    { 
    bundler = browserify(entryPoint, { debug: watch }) 
       .add(require.resolve("babel/polyfill")) 
       .transform(babelify); 
    release(); 
    } 
} 


gulp.task('release', function() { return compile(false); }); 
gulp.task('debug', function() { return compile(true); }); 

gulp.task('default', ['debug']); 
+1

Die Art und Weise Sie sind '.ADD()' ing in die richtige Reihenfolge gebracht werden, die polyfill Last nach dem Eintrittspunkt machen. Statt 'browserify (entryPoint', versuche vielleicht' browserify ([require.resolve ("babel/polyfill"), entryPoint] ' – loganfsmyth

+0

Es ist Arbeit. Ich muss aufmerksamer eine Dokumentation lernen. Vielen Dank. –

Antwort

7
browserify(entryPoint, { debug: watch }) 
      .add("babel/polyfill") 

wird ein Bündel mit zwei Einstiegspunkte erstellen, mit entryPoint zuerst ausgeführt wird. Das bedeutet, dass das Polyfill geladen nach Ihre Anwendung geladen hat. Entweder tun

require('babel/polyfill'); 

in Ihrem entryPoint Datei, oder sie

browserify(["babel/polyfill", entryPoint], { debug: watch }) 
+0

Ist da eine ähnliche Lösung dafür mit Webpack? Ich versuche, ein Projekt in Webpack zu konvertieren, aber beim Testen bekomme ich den gleichen Fehler. –

+0

Korrigieren, in Webpack würden Sie 'Eintrag ändern: './app.js'' oder was auch immer du haben musst: ''babel-polyfill', './app.js' ' – loganfsmyth