2015-07-20 2 views
8

Я не могу правильно загрузить babel/polyfill с глотком. В моем случае метод Array.from не определен. Однако при попытке загрузить browser-polyfill.js с помощью gulp .add(require.resolve("babel/polyfill")) Я получаю ошибку "only one instance of babel/polyfill is allowed". Исходный код правильный, потому что я проверил его с babel browser-polyfill.js.Вавилонский полиполн и глоток

код Источник:

//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

Путь вы '.Добавьте()' ИНГ сделает нагрузку polyfill после точки входа. Вместо 'browsify (entryPoint', возможно, попробуйте' browserify ([require.resolve ("babel/polyfill"), entryPoint] ' – loganfsmyth

+0

Это работа. Мне нужно более внимательно изучить документацию. Большое спасибо. –

ответ

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

создаст пакет с двумя точками входа, с entryPoint работает первым. Это означает, что полипол будет загружать после, загруженное ваше приложение. Либо сделать

require('babel/polyfill'); 

внутри файла entryPoint, или положить их в правильном порядке

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

Есть ли аналогичное исправление для этого с помощью webpack? Я пытаюсь преобразовать проект в webpack, но при тестировании получаю ту же ошибку. –

+0

Правильно, в webpack вы хотите изменить «entry:»./app.js'' или что бы вы ни вводили: ['babel-polyfill', './app.js'] ' – loganfsmyth

Смежные вопросы