2017-01-05 2 views
5

Учитывая следующее:Как перевести выражение * с помощью babel?

require('babel-core').transform('3').code 

Есть ли способ, чтобы получить это вернуть 3 (выражение) вместо 3; (заявление)?

Я пробовал:

  • Поиск в Интернете и различные сайты для «выражения Бабель», «Вавилонская transpile выражения», и тому подобное.
  • Передача (3), но это также было преобразовано в 3;.
  • Высунув внутренности babel, чтобы выяснить, что происходит, но я не знаю, как это работает, чтобы разобраться в этом.
  • Передача опции minified: true, которая утверждает, что удаляет конечную точку с запятой, но на самом деле ничего не делает.

Прямо сейчас я использую .replace(/;$/, ''), который работает но кажется абсурдным и подвержен ошибкам.

+0

Что делать, если вы передали выражение, которое нужно было преобразовать в несколько операторов? Babel не предоставляет гарантии, как то, что вы ищете. Плюс без полного контекста файла вокруг выражения, Babel не имеет возможности обрабатывать область видимости, например, убедиться, что он не генерирует имя переменной, которое уже используется вокруг выражения. – loganfsmyth

+0

@loganfsmyth Какое выражение будет преобразовано в операторы? Я не могу думать ни о чем с головы. Кроме того, это не вызовет проблем, например. программа, которая устанавливает переменную в значение выражений? Мне не нужно беспокоиться о области, поскольку это автономные выражения, они не имеют никакого контекста. – Wolfgang

+0

Что делать, если вы делаете '({x: {y, z}} = foo)'? Для этого в настоящее время требуется временная переменная для хранения 'foo.x', поэтому объявление переменной будет разделено. например 'var _tmp; _tmp = foo.x; y = _tmp.y; z = _tmp.z; '. Вы могли бы назначить задания в одном выражении, если хотите, но объявление переменной должно быть отдельным. – loganfsmyth

ответ

3

@loganfsmyth предоставил недостающее звено на BabelJS.slack - parserOpts.allowReturnOutsideFunction. Вот код, который я придумал:

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

let script = 'return ((selector, callback) => Array.prototype.map.call(document.querySelectorAll(selector), callback))("#main table a.companylist",a => a.innerText)'; 

let transform = babel.transform(script, { 
    ast: false, 
    code: true, 
    comments: false, 
    compact: true, 
    minified: true, 
    presets: [ 
     ['env', { 
      targets: { 
       browsers: ['> 1%', 'last 2 Firefox versions', 'last 2 Chrome versions', 'last 2 Edge versions', 'last 2 Safari versions', 'Firefox ESR', 'IE >= 8'], 
      } 
     }] 
    ], 
    parserOpts: { 
     allowReturnOutsideFunction: true, 
    } 
}); 

let code = `return function(){${transform.code}}()`; 

Выход:

return function(){"use strict";return function(selector,callback){return Array.prototype.map.call(document.querySelectorAll(selector),callback)}("#main table a.companylist",function(a){return a.innerText});}() 

Мой сценарий ввода выглядит немного смешно только потому, что, как я создал это, но вы можете видеть, что она трансформировалась эти выражения со стрелками в регулярные функции и все это все еще выражение.

N.B. вы можете изменить эту последнюю строку на что-то вроде

let code = `(function(){${transform.code}})()`; 

в зависимости от ваших потребностей. Я нуждался в моем, чтобы быть return ed.

Смежные вопросы