I can'not correctly load babel/polyfill
with gulp. In my case Array.from
method is undefined.
However if try to load browser-polyfill.js
with gulp .add(require.resolve("babel/polyfill"))
I get an error "only one instance of babel/polyfill is allowed"
.
Source code is correct because I've tested its with babel browser-polyfill.js
.
Source code:
//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']);
Babel includes a polyfill that includes a custom regenerator runtime and core-js. This will emulate a full ES2015+ environment (no < Stage 4 proposals) and is intended to be used in an application rather than a library/tool. (this polyfill is automatically loaded when using babel-node ).
So long story short, just using babel is not enough for your application to work because all the latest Javascript features are not supported in all browsers. So to fix this problem, we need to use a polyfill.
Babel Polyfill adds support to the web browsers for features, which are not available. Babel compiles the code from recent ecma version to the one, which we want. It changes the syntax as per the preset, but cannot do anything for the objects or methods used.
Babel: Use next generation JavaScript, today. Babel will turn your ES6+ code into ES5 friendly code, so you can start using it right now without waiting for browser support; gulp: The streaming build system. Build system automating tasks: minification and copying of all JavaScript files, static images.
browserify(entryPoint, { debug: watch })
.add("babel/polyfill")
will create a bundle with two entry points, with entryPoint
running first. That means that the polyfill will load after your application has loaded. Either do
require('babel/polyfill');
inside your entryPoint
file, or put them in the right order
browserify(["babel/polyfill", entryPoint], { debug: watch })
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With