2015-10-21 39 views
3

有没有一种方法可以让PhantomJS本身支持ES6,我有一堆ES6代码通过Babel转换为ES5,我需要完成的是准确测量代码覆盖率, ES6代码而不是ES5。这是客户的要求,所以我不能只告诉他停止请求这样的事情......对PhantomJS中的ES6的原生支持

Afaik NodeJS已经有ES6的本机支持,有没有办法用PhantomJS来做到这一点?

+0

我认为与PhantomJS 2使它更容易使用一个较新的WebKit版本,这可能仍然是很多工作。祝你好运。使用已支持ES6的浏览器可能更容易。 –

+0

巴别尔也打算在旧系统上运行。幻影上的失败是什么?听起来就像你问了两个问题:1.我如何填充幻影? 2.我如何获得ES6代码的覆盖? – loganfsmyth

+0

它给代码覆盖率提供了错误的观点,当使用babel时代码覆盖率的结果是针对ES5调用进行的...... – Lu4

回答

2

我已经结束了使用原始的NodeJS(不含PhantomJs)+快速+ JSDom(https://github.com/tmpvar/jsdom),POC的是这样的:

"use strict" 

const $module = require('module'); 
const path = require('path'); 
const babel = require("babel-core"); 
const Jasmine = require('jasmine'); 
const reporters = require('jasmine-reporters'); 
const express = require('express'); 
const jsdom = require("jsdom"); 
const app = express(); 
const vm = require('vm'); 
const fs = require("fs"); 

app.get('/', function (req, res) { 
    res.sendFile('index.html', { root: __dirname }); 
}); 

app.use('/bower_components', express.static('bower_components')); 

const load = function (filename) { 
    return fs.readFileSync(`./bower_components/${filename}`, "utf-8"); 
}; 

const packages = [ 
    fs.readFileSync('./bower_components/jquery/dist/jquery.js', "utf-8"), 
    fs.readFileSync('./bower_components/angular/angular.js', "utf-8"), 
    fs.readFileSync('./bower_components/angular-mocks/angular-mocks.js', "utf-8") 
]; 

const sut = { 
    './js/code.js': fs.readFileSync('./js/code.js', "utf-8") 
}; 

const tests = { 
    './tests/test.js': fs.readFileSync('./tests/test.js', "utf-8") 
}; 

function navigate(FakeFileSystem, root, cwd, filename) { 
    // Normalize path according to root 
    let relative = path.relative(root, path.resolve(root, cwd, filename)); 
    let parts = relative.split(path.sep); 
    let iterator = FakeFileSystem; 

    for (let part of parts) { 
     iterator = iterator[part] || (iterator[part] = { }); 
    } 

    return iterator; 
} 

const server = app.listen(3333, function() { 
    const host = server.address().address; 
    const port = server.address().port; 

    const url = `http://${host === '::' ? 'localhost' : host}:${port}`; 

    console.log(`Server launched at ${ url }`); 
    console.log(`Running tests...`) 

    jsdom.env({ 
     url: url, 
     src: packages, 
     done: function (err, window) { 
      let jasmine = new Jasmine(); 

      let FakeFileSystem = {}; 

      let descriptors = []; 

      jasmine.configureDefaultReporter({ showColors: true }); 

      let env = jasmine.env; 

      for (let propertyName in env) { 
       if (env.hasOwnProperty(propertyName)) { 
        window[propertyName] = env[propertyName]; 
       } 
      } 

      let context = vm.createContext(window); 
      let collections = [sut, tests]; 

      for (let collection of collections) { 
       for (let filename in collection) { 
        let descriptor = navigate(FakeFileSystem, __dirname, '.', filename); 
        let source = collection[filename]; 
        let transpiled = babel.transform(source, { "plugins": ["transform-es2015-modules-commonjs"] }); 
        let code = $module.wrap(transpiled.code); 

        let _exports = {}; 
        let _module = { exports: _exports }; 

        descriptor.code = vm.runInContext(code, context); 
        descriptor.module = _module; 
        descriptor.exports = _exports; 
        descriptor.filename = filename; 

        descriptors.push(descriptor); 
       } 
      } 

      for (let descriptor of descriptors) { 
       let cwd = path.dirname(path.relative(__dirname, descriptor.filename)); 

       descriptor.code.call(
        undefined, 
        descriptor.exports, 

        // Closure is used to capture cwd 
        (function (cwd) { 
         return function (filename) { // Fake require function 
          return navigate(FakeFileSystem, __dirname, cwd, filename).exports; 
         } 
        })(cwd), 

        descriptor.module, 
        descriptor.filename 
       ); 
      } 

      jasmine.execute(); 

      server.close(); 
     } 
    }); 
}); 

这种方法的好处是,有在transpiling没有必要有通天的代码,它允许前端软件包,如角摆脱凉亭加载,而所有配置的东西来自NPM ...

编辑

我基于这样的事实的NodeJS不支持迷迷糊糊所有的ES6功能,以及这样的功能由于ES6模块是一个真正的痛苦,他们不支持任何地方,所以我最终用babel进行了部分代码转换,期望当NodeJS开始为ES6提供更丰富和更丰富的支持时,我最终会转向-off babel功能一步一步,并切换到本地支持时,它将成为可用...