我正在编写一个使用新 es6 承诺的 JavaScript 库。我可以在 Firefox 中测试这个库,因为 Promise 已经定义好了。但是,当我尝试使用 Karma 和 PhantomJS 测试我的代码时,我得到了错误Can't find variable: Promise.
。我猜这是因为 PhantomJS 浏览器还不支持 es6 承诺。
如何配置 Karma 以引入 polyfill 以实现承诺?
我正在编写一个使用新 es6 承诺的 JavaScript 库。我可以在 Firefox 中测试这个库,因为 Promise 已经定义好了。但是,当我尝试使用 Karma 和 PhantomJS 测试我的代码时,我得到了错误Can't find variable: Promise.
。我猜这是因为 PhantomJS 浏览器还不支持 es6 承诺。
如何配置 Karma 以引入 polyfill 以实现承诺?
你可以通过简单地安装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 上运行)的工作测试创建了一个示例项目以供参考。
对于 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中有详细记录
正如作者正确指出的那样,它无法识别 es6 承诺。为了加载它,可以在 webpack.ProvidePlugin 的帮助下加载 es6-promise 模块,并在 webpack 的 plugins 数组中配置它。
plugins: [
new webpack.ProvidePlugin({
'Promise': 'es6-promise'
})
]
这似乎对我有用!
你可以对使用 ES6 特性的文件使用karma-babel-preprocessor。安装它
npm install --save-dev karma-babel-preprocessor
然后添加指定应该预处理哪些文件karma.conf
:
preprocessors: {
"src/**/*.js": ["babel"],
"test/**/*.js": ["babel"]
},