【问题标题】:How do I rewrite this ES6 code to be Safari-compatible?如何重写此 ES6 代码以与 Safari 兼容?
【发布时间】:2016-07-22 13:43:50
【问题描述】:

我有一些使用 ES6 箭头函数的 Vue.js 代码。然而,显然 Safari(在一种情况下它出现在 OSX 上的 Chrome)不喜欢这个。代码如下:

fetchItemCount: function(){
                this.$http.get('/api/fetchItemCount')
                    .then(response => {
                        this.itemCount = response.data;
                    })
                    .catch(response => {

                    });
            },

我有几个使用箭头语法的函数。我怎样才能重写它们以避免使用它但仍然执行相同的工作?

我曾尝试使用 Babel 转译代码,但这似乎会引入错误(无法设置未定义或空引用的属性 'Vue')

【问题讨论】:

  • 你可以使用babeljs.io将你的代码转译成ES5
  • 下一个版本的 Safari (10) 也将支持箭头函数和 ES6 的所有其他部分。但是,旧版浏览器仍然需要 ES5 代码,可以使用诸如 babel 之类的转译器进行转译(在上面的评论中提到)。
  • 请查看我的编辑 - 我曾尝试使用 Babel,但它会引入错误。
  • 你遇到了什么错误?
  • @OskarSzura 我已将其添加到我的问题中

标签: javascript vue.js


【解决方案1】:

正如其他人所指出的那样,使用诸如 babel 之类的转译器可以解决问题,但由于这并不总是可行的,因此这里是没有箭头函数的情况。

fetchItemCount: function(){
    var that = this;
    this.$http.get('/api/fetchItemCount')
        .then(function(response) {
            that.itemCount = response.data;
        })
        .catch(function(response) {

        });
},

箭头函数给你的本质上是一个函数,它保持this 范围的声明它,所以要重现我们只需将外部范围内的this 分配给一个新变量并在内部使用它功能。

正如 LinusBorg 在 cmets 中指出的那样,当使用 vue-resource 时,您不必执行 var that = this; 部分,因为库会在回调中为您更改 this。这是特定于 vue-resource 资源的,而不是它通常如何使用 Promise 完成的,因此它通常不适用于其他库。

【讨论】:

  • 虽然您的解释通常是正确的,但 that = this 闭包在使用 vue-resource 时是不必要的,因为它为您将回调函数绑定到 vm 的范围。
  • 很高兴知道,虽然我会保持我的回答,因为它不是绑定到外部上下文的承诺的正常行为。不过我会记下来的!
【解决方案2】:

实际上你需要重写你的代码,至少不需要手动。您可以做的就是继续编写您提供的示例代码并使用转译器(例如 Babel)将您的 ES6 代码重写为 ES5。

您可以使用GulpGrunt 等任务管理器使其对自己几乎透明。

如果您需要了解如何使用任务管理器,请查看this article。它为您提供了有关如何使用 Gulp 的简短而集中的概述。

读完之后,您会发现通过一些 Gulp 脚本自动监视文件并简化其内容是多么容易。因此,只需使用 Gulp Babel plugin 自动为您执行此转换任务。

例如:

const gulp = require('gulp');
const babel = require('gulp-babel');

gulp.task('transpile', () => {
    return gulp.src('src/MY-VUE-SOURCE.js')
        .pipe(babel({
            presets: ['es2015']
        }))
        .pipe(gulp.dest('SOME_DESTINATION'));
});

gulp.task('watch', function() {
    gulp.watch(['src/**/*'], ['transpile']);
});

运行 gulp watch 后,它会一直运行直到您手动停止它,您对 MY-VUE-SOURCE.js 所做的任何更改都将自动为您转译。

【讨论】:

  • 我确实使用 Gulp 并尝试使用 Bower。但是,当我切换到使用 Babelified 代码时,我开始收到一个错误,该错误发生在 Vue.js 库代码的开头:Unable to set property 'Vue' of undefined or null reference。这是使用 ES2015 Babel 预设。
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 2022-10-17
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多