"这"在使用browserify和debowerify进行编译后,下划线未定义

时间:2015-12-09 13:28:16

标签: gulp underscore.js browserify babeljs

首先......我有下一步的任务:

gulp.task('js', function() {
    browserify('./src/js/main.js')
        .bundle()
        .on('error', onError)
        .pipe( source('main.js') )
        .pipe( gulp.dest(path.build.js) );
});

和package.json:

{
  "browserify": {
    "transform": [
      ["babelify", { "presets": ["es2015"] }],
      "debowerify"
    ]
  },
}

我在main.js中导入Backbone(或者只是下划线......它并不重要)

import Backbone from 'backbone';

在控制台中我收到错误

  

未捕获的TypeError:无法读取属性' _'未定义的

我检查了代码,发现在库root开头的下划线源中未定义

 // Establish the root object, `window` in the browser, or `exports` on the server.
  var root = this;

  // Save the previous value of the `_` variable.
  var previousUnderscore = root._;

我认为问题在于debowerify或babelfy在某些功能中包含代码。但是如果我使用没有debowerify的节点模块,一切正常。但我想用凉亭。

那么如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

在我的情况下,使用带下划线的browserify时出现了同样的错误。我通过从下划线切换到lodash来解决问题。它们通常(肯定不是完全)兼容,但最糟糕的是我宁愿从下划线源复制一些缺失的函数,而不是使用它的deisolated加载方法。

答案 1 :(得分:0)

对于此问题的任何未来访问者,

这类似于Underscore gives error when bundling with Webpack

问题的关键在于babel可能正在运行underscore.js代码,因为underscore.js使用this,并且在es6 this中,当函数外部未定义时,自然this._ 1}}失败了。

在代码中我通过确保babel不在node_modules上运行来解决问题。