2014-07-16 2 views
5

Angular version of the $q library을 사용하고 있는데 이는 original q library에도 해당됩니다.자바 스크립트 키워드를 대체하는 전처리 기

사용 예 :

$q 
    .when(someFunction) 
    .then(function(){ 
    // .. 
    }) 
    .catch(function(){ 
    // .. 
    }) 
    .finally(function(){ 
    // .. 
    }); 

불행하게도 일부 함수 이름 자바 스크립트 키워드 (예를 들어, finally) 충돌합니다. 마지막으로 예약어는 자바 스크립트이며 예약 된 키워드가 ES3에 의해 속성 이름으로 지원되지 않기 때문에 promise['finally'](callback)이 코드를 만들기 위해 같은

"당신이 메소드를 호출해야합니다 : 각 기준에서
IE8 및 Android 2.x 호환
. "

는 ECMA-262, http://www.ecma-international.org/publications/standards/Ecma-262.htm에서 제공하는 공식 표준은 상태

:

7.6.1.1 키워드

다음의 토큰이 ECMAScript를 키워드입니다 및 으로 사용할 수 없습니다 수 ECMAScript 프로그램의 식별자. 이 코드는 유지하기 어렵

$q 
    .when(someFunction) 
    .then(function(){ 
    // .. 
    }) 
    ['catch'](function(){ 
    // .. 
    }) 
    ['finally'](function(){ 
    // .. 
    }); 

으로 내가 자바 스크립트를 찾고 있어요 :

break   do    instanceof  typeof 
case   else   new    var 
catch   finally   return   void 
continue  for    switch   while 
debugger  function  this   with 
default   if    throw    
delete   in    try 

이 첫 번째 예는 다음 코드로 변경하는 것이 IE8 작업을 얻을 것을 의미합니다 첫 번째 예제를 IE8 호환 버전으로 바꾸는 전처리 기 (아마도 쓸데없는 작업).

그런 전 처리기가 있습니까?

+0

내가 아는 사람이 하나도 없습니다. 당신은 아마 당신 자신을 구현해야 할 것입니다. – RevanProdigalKnight

+0

@RevanProdigalKnight 소스 맵을 지원하는 훌륭한 참조 프로젝트를 알고 계십니까? – jantimon

+0

불행히도, 실제로는 아닙니다. [C 스타일 전처리 기] (http://csserver.evansville.edu/~wg24/senior_project/other/node.js/preprocessor.js)를 구현할 때 원본 맵을 사용하지 않았습니다. – RevanProdigalKnight

답변

8

친절한 동네 인 Stef Panner가 몇 달 전에 그런 도구를 만들었습니다. es3-safe-recast이라고합니다. 그것에 대해서도 grunt task이 있습니다.

무엇을하는지 살펴 보겠습니다. 첫째는 JS 구문 트리 분석을위한 Esprima 패키지를 필요로하며, 이러한 변환에 내장되어 그 위에 개주 :

'use strict'; 
var esprima = require('esprima'); 
var recast = require('recast'); 
var Visitor = recast.Visitor; 
var types = recast.types; 
var namedTypes = types.namedTypes; 
var builders = types.builders; 

는 그 다음 모든 식별자의 큰지도를 포함 - 당신의 목록처럼 :

여기
identifierToLiteral.finally = true; // here is `finally` for example 

이 트리를 분석하고 방문자로 대체하는 방법이다 : 마지막으로

var ES6Safe = Visitor.extend({ 
    visitProperty: function(node) { // go through all properties 
    // check if need to replace name with literal 
    if (namedTypes.Identifier.check(node.key) && identifierToLiteral[node.key.name]) { 
     node.key = builders.literal(node.key.name); 
    } 

    return this.genericVisit(node); 
    }, 

    visitMemberExpression: function(node) { // and all member expressions 
    var property = node.property; 
    var newNode; 
    // check if need to replace name with literal 
    if (namedTypes.Identifier.check(property) && identifierToLiteral[property.name]) { 
     newNode = builders.memberExpression(node.object, builders.literal(property.name), true); 
    } else { 
     newNode = node; 
    } 
    return this.genericVisit(newNode); 
    } 
}); 

, 그것은 참 -_- 통해 코드를 실행합니다 :

ast = recast.parse(source, { esprima: esprima }); 
new ES6Safe().visit(ast); 
code = recast.print(ast).code; 

위 코드의 안전한 버전 생성.

관련 문제