Como posso usar uma importação es6 no nó?

Eu estou tentando pegar o jeito de es6 importações no nó e estou tentando usar a syntax fornecida neste exemplo:

Cheatsheet Link: https://hackernoon.com/import-export-default-require-commandjs-javascript-nodejs-es6-vs-cheatsheet-different-tutorial-example-5a321738b50f

Eu estou olhando através da tabela de suporte: http://node.green/ , mas não foi capaz de encontrar o que a versão suporta as novas instruções de importação (tentei procurar o texto import / require) Estou atualmente executando o nó 8.1. 2 e também acredito que, como o cheatsheet está se referindo aos arquivos .js, ele deve funcionar com arquivos .js.

Enquanto executo o código (extraído do primeiro exemplo do cheatsheet):

import { square, diag } from 'lib'; 

Eu recebo o erro: SyntaxError: importação de token inesperado.

Referência à lib Estou tentando importar:

 //------ lib.js ------ export const sqrt = Math.sqrt; export function square(x) { return x * x; } export function diag(x, y) { return sqrt(square(x) + square(y)); } 

O que estou perdendo e como posso obter o nó para reconhecer minha declaração de importação?

O Node.js incluiu suporte experimental para suporte ao ES6. Leia mais sobre aqui: https://nodejs.org/api/esm.html .

TLDR; Salve o arquivo com os módulos ES6 com a extensão .mjs e execute-o como:

 node --experimental-modules my-app.mjs 

O Node.js não suporta módulos ES6. Este blog de James descreve as razões para isso. Embora você possa usar o Babel para usar a syntax dos módulos ES6.

Desperdiçado cerca de 3 horas.

Eu só queria usar a import e export em arquivos js.

Todo mundo diz que não é possível Mas, a partir de maio de 2018, é possível usar acima no node.js simples, sem nenhum módulo como o babel, etc.

Aqui está uma maneira simples de fazer isso.

Crie os arquivos abaixo, execute e veja a saída para você mesmo.

Também não esqueça de ver a Explanation abaixo.

myfile.mjs

 function myFunc() { console.log("Hello from myFunc") } export default myFunc; 

index.mjs

 import myFunc from "./myfile" myFunc(); 

corre

 node --experimental-modules index.mjs 

saída

 (node:12020) ExperimentalWarning: The ESM module loader is experimental. Hello from myFunc 

Explicação:

  1. Como são módulos experimentais, os arquivos .js são denominados arquivos .mjs
  2. Durante a execução, você adicionará “–experimental-modules” ao “node index.js”
  3. Durante a execução com módulos experimentais na saída, você verá: “(node: 12020) ExperimentalWarning: O carregador do módulo ESM é experimental.”
  4. Eu tenho o release atual do node js, então se eu rodar “node –version”, ele me fornecerá “v10.3.0”, embora a versão LTE / stable / recommended seja 8.11.2 LTS.
  5. Algum dia, no futuro, você poderia usar .js em vez de .mjs, como os resources que você se torna estável em vez de Experimental.
  6. Mais sobre resources experimentais, veja: https://nodejs.org/api/esm.html

Espero que tenha ajudado.

Se você estiver usando o sistema de módulos no lado do servidor, você não precisa usar o Babel. Para usar módulos no NodeJS, assegure-se de que:

  1. Use uma versão do nó que suporte o sinalizador –eximensivo-modules
  2. Seus arquivos .js devem ser renomeados para .mjs

É isso aí.

No entanto, e este é um grande porém, enquanto o seu shiny código ES6 funcionará em um ambiente como o NodeJS (ao escrever 9.5.0) você ainda terá a loucura de transpilar apenas para testar. Também tenha em mente que a Ecma afirmou que os ciclos de lançamento do Javascript serão mais rápidos, com os resources mais recentes sendo entregues com mais regularidade. Embora isso não seja problema para ambientes únicos como o NodeJS, é uma proposta ligeiramente diferente para ambientes de navegador. O que está claro é que as estruturas de teste têm muito a fazer para recuperar o atraso. Você ainda precisará provavelmente transpilar para testar estruturas. Eu sugeriria usar o gracejo.

Esteja ciente também do pacote de frameworks, você terá problemas lá

Voltar para a pergunta original de Jonathan002 sobre

“… qual versão suporta as novas instruções de importação do ES6?”

Baseado no artigo do Dr. Axel Rauschmayer , existe um plano para que seja suportado por padrão (sem o sinalizador de linha de comando experimental) no Node.js 10.x LTS . De acordo com o plano de lançamento do node.js, como está em 29/3/2018, é provável que ele esteja disponível após abril de 2018, enquanto o LTS começará em outubro de 2018.

Você pode tentar esm .

Aqui estão algumas introduções: https://www.npmjs.com/package/esm

solução

https://www.npmjs.com/package/babel-register

 // this is to allow ES6 export syntax // to be properly read and processed by node.js application require('babel-register')({ presets: [ 'env', ], }); // after that any line you add below that has typical es6 export syntax // will work just fine const utils = require('../../utils.js'); const availableMixins = require('../../../src/lib/mixins/index.js'); 

abaixo está a definição de mixins / index.js

 export { default as FormValidationMixin } from './form-validation'; // eslint-disable-line import/prefer-default-export 

que funcionou muito bem dentro do meu aplicativo CLI node.js.