Распространение объекта не работает в Узле 7.5

// Rest properties
require("babel-core").transform("code", {
  plugins: ["transform-object-rest-spread"]
});

let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
console.log(x); // 1
console.log(y); // 2
console.log(z); // { a: 3, b: 4 }

// Spread properties
let n = { x, y, ...z };
console.log(n); // { x: 1, y: 2, a: 3, b: 4 }

Я пробую приведенный выше пример с http://babeljs.io/docs/plugins/transform-object-rest-spread/ и он не работает.

let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
            ^^^
SyntaxError: Unexpected token ...
    at Object.exports.runInThisContext (vm.js:73:16)
    at Module._compile (module.js:543:28)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)
    at Module.runMain (module.js:605:10)
    at run (bootstrap_node.js:418:7)
    at startup (bootstrap_node.js:139:9)
    at bootstrap_node.js:533:3

Если я запускаю его с babel-node тогда работает нормально. Есть идеи почему?

2 ответа

Решение
require("babel-core").transform("code", {
  plugins: ["transform-object-rest-spread"]
});

Это Node API для преобразования кода, заданного в качестве первого аргумента .transform() функция. Вам нужно будет заменить "code" с реальным кодом, который вы хотите преобразовать. Это не коснется каких-либо файлов. С возвращенным кодом вы ничего не делаете, но вы пытаетесь регулярно запускать оставшуюся часть файла с помощью Node, который еще не поддерживает оператор распространения объектов. Вам придется либо выполнить сгенерированный код, либо записать его в файл, который вы можете запустить с помощью Node.

Вот пример того, как вы бы перенесли свой код с помощью Node API:

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

// Code that will be transpiled
const code = `let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
console.log(x); // 1
console.log(y); // 2
console.log(z); // { a: 3, b: 4 }

// Spread properties
let n = { x, y, ...z };
console.log(n); // { x: 1, y: 2, a: 3, b: 4 }`

const transformed = babel.transform(code, {
  plugins: ["transform-object-rest-spread"]
});

// Write transpiled code to output.js
fs.writeFileSync('output.js', transformed.code);

После запуска у вас есть файл output.js который преобразовал объект распространения. И тогда вы можете запустить его с:

node output.js

Смотрите также babel.transform.

Вы, вероятно, не собираетесь использовать Node API, если только вы не хотите сделать что-то очень специфичное с кодом, который является своего рода анализом или преобразованием, но, конечно, не запускает его. Или, конечно, когда вы интегрируете его в инструмент, который должен программно переносить код.

Если вы хотите просто запустить код, используйте babel-node, Если вы хотите просто перенести его, используйте babel исполняемый файл.

Вы можете проверить поддержку Node.js ES2015. Nodejs object rest/spread properties поддерживается форма v8.3.

let person = {id:1, name: 'Mahbub'};
let developer = {...person, type: 'nodeJs'};
let {name, ...other} = {...developer};

console.log(developer); // --> { id: 1, name: 'Mahbub', type: 'nodeJs' } 
console.log(name); // --> Mahbub
console.log(other); // --> { id: 1, type: 'nodeJs' } 
Другие вопросы по тегам