【问题标题】:Babel polyfill and gulpBabel polyfill 和 gulp
【发布时间】:2015-10-09 18:41:57
【问题描述】:

我无法使用 gulp 正确加载 babel/polyfill。在我的情况下,Array.from 方法是未定义的。 但是,如果尝试使用 gulp .add(require.resolve("babel/polyfill")) 加载 browser-polyfill.js,我会收到错误 "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

Gulp 文件:

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']);

【问题讨论】:

  • .add()ing 的方式将使polyfill 在您的入口点之后加载。而不是browserify(entryPoint,也许试试browserify([require.resolve("babel/polyfill"), entryPoint]
  • 它的工作。我必须更专心地学习文档。非常感谢。

标签: javascript gulp browserify ecmascript-6 babeljs


【解决方案1】:
browserify(entryPoint, { debug: watch })
          .add("babel/polyfill")

将创建一个包含两个入口点的包,entryPoint 首先运行。这意味着 polyfill 将在您的应用程序加载后 加载。要么做

require('babel/polyfill');

在您的 entryPoint 文件中,或按正确的顺序放置它们

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

【讨论】:

  • webpack 有类似的解决方法吗?我正在尝试将项目转换为 webpack,但在测试中遇到了同样的错误。
  • 正确,在 webpack 中你想将 entry: './app.js' 或任何你想要的更改为 entry: ['babel-polyfill', './app.js']
猜你喜欢
  • 2021-03-12
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多