39

我正在编写一个使用新 es6 承诺的 JavaScript 库。我可以在 Firefox 中测试这个库,因为 Promise 已经定义好了。但是,当我尝试使用 Karma 和 PhantomJS 测试我的代码时,我得到了错误Can't find variable: Promise.。我猜这是因为 PhantomJS 浏览器还不支持 es6 承诺。

如何配置 Karma 以引入 polyfill 以实现承诺?

4

5 回答 5

73

你可以通过简单地安装Babel Polyfill来引入 Babel polyfill :

npm install --save-dev babel-polyfill

然后在你的源代码和测试文件之前包含 polyfillfiles文件karma.conf.js

files: [
  'node_modules/babel-polyfill/dist/polyfill.js',
  'index.js',   //could be /src/**/*.js
  'index.spec.js' //could be /test/**/*.spec.js
],

除非您知道所有目标浏览器都支持 Promises,否则您可能也希望将此 polyfill 应用到您发布的构建中。

如果你真的很喜欢冒险,你可以使用 Browserify 来拉入文件以使你的测试更加模块化,然后使用 Babelify 将 ES6 转换为 ES5。我已经用这些和一个涉及 Promise(在 PhantomJS2 上运行)的工作测试创建了一个示例项目以供参考

于 2015-07-01T16:27:52.070 回答
13

对于 Babel 6,我们需要 installbabel-polyfill来支持 Promise。

npm install --save-dev babel-polyfill

karma.conf.js并在该files部分中添加一行

files: [
  'node_modules/babel-polyfill/dist/polyfill.js',
  ....
]

它在 https://github.com/babel/karma-babel-preprocessor#polyfill中有详细记录

于 2015-11-07T01:49:39.383 回答
1

正如作者正确指出的那样,它无法识别 es6 承诺。为了加载它,可以在 webpack.ProvidePlugin 的帮助下加载 es6-promise 模块,并在 webpack 的 plugins 数组中配置它。

plugins: [
        new webpack.ProvidePlugin({
            'Promise': 'es6-promise'
        })
    ]

这似乎对我有用!

于 2017-08-18T15:28:45.587 回答
0

这个线程应该可以帮助你。根据它,您似乎应该尝试将 PhantomJS2 与 ES6 一起使用。你也可以看看这个项目,它处理了一个比你更近的主题。

我希望它可以帮助你

于 2015-04-01T12:46:54.037 回答
0

你可以对使用 ES6 特性的文件使用karma-babel-preprocessor。安装它

npm install --save-dev karma-babel-preprocessor

然后添加指定应该预处理哪些文件karma.conf

preprocessors: {
      "src/**/*.js": ["babel"],
      "test/**/*.js": ["babel"]
    },
于 2015-10-24T23:38:40.700 回答