¿Cómo puedo usar una importación es6 en node?


Estoy tratando de acostumbrarme a las importaciones es6 en node y estoy tratando de usar la sintaxis proporcionada en este ejemplo:

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

Estoy mirando a través de la tabla de soporte: http://node.green/, pero no fue capaz de encontrar qué versión admite las nuevas instrucciones de importación (intenté buscar el texto import/require) actualmente se está ejecutando el nodo 8.1.2 y también creo que ya que el cheatsheet se refiere a .archivos js con los que debería funcionar .archivos js.

Mientras corro el código (tomado del 1er ejemplo de cheatsheet):

import { square, diag } from 'lib';

Recibo el error: SyntaxError: Importación inesperada de tokens.

Referencia a lib que estoy tratando de 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));
}

¿Qué me falta y cómo puedo hacer que node reconozca mi declaración de importación?

Author: Jonathan002, 2017-08-24

7 answers

Nodo.js ha incluido soporte experimental para soporte ES6. Leer más sobre aquí: https://nodejs.org/api/esm.html .

TLDR; Guarde el archivo con los módulos ES6 con la extensión .mjs y ejecútelo de la siguiente manera:

node --experimental-modules my-app.mjs

Nodo.js no soporta módulos ES6. Este blog de James describe las razones para ello. Aunque puedes usar Babel para usar la sintaxis de los módulos ES6.

 50
Author: tbking,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-21 19:05:02

Desperdiciado alrededor de 3 horas.

Solo quería usar import y export en archivos js.

Todo el mundo dice que no es posible. Pero, a partir de mayo de 2018, es posible usar arriba en nodo plano.js, sin ningún módulo como babel, etc.

Aquí hay una manera sencilla de hacerlo.

Cree los archivos a continuación, ejecute y vea la salida por sí mismo.

También no se olvide de ver Explanation debajo.

Miarchivo.mjs

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

export default myFunc;

Index.mjs

import myFunc from "./myfile"

myFunc();

Corre

node  --experimental-modules  index.mjs

Salida

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

Hello from myFunc

Explicación:

  1. Dado que se trata de módulos experimentales, .los archivos js se nombran .mjs files
  2. Mientras se ejecuta, agregará "experimental experimental-modules" al "node index.js "
  3. Mientras se ejecuta con módulos experimentales en la salida verá: "(nodo:12020) ExperimentalWarning: El cargador de módulos ESM es experimental. "
  4. Tengo corriente lanzamiento de node js, por lo que si corro "node version version", me da "v10.3.0", aunque la versión LTE/stable/recommended es 8.11.2 LTS.
  5. Algún día en el futuro, usted podría utilizar .js en lugar de .mjs, como las características que se vuelven estables en lugar de Experimental.
  6. Más sobre características experimentales, ver: https://nodejs.org/api/esm.html

Espero que eso haya ayudado.

 33
Author: Manohar Reddy Poreddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-27 15:31:43

Si está utilizando el sistema de módulos en el lado del servidor, no necesita usar Babel en absoluto. Para usar módulos en NodeJS asegúrese de que:

  1. Use una versión del nodo que soporte la bandera modules experimental-modules
  2. Su .js los archivos deben ser renombrados a .mjs

Eso es todo.

Sin embargo, y esto es un gran sin embargo, mientras que su código ES6 shinny pure se ejecutará en un entorno como NodeJS (al escribir 9.5.0) usted todavía tener la locura de transpilar solo para probar. También tenga en cuenta que Ecma ha declarado que los ciclos de lanzamiento para Javascript van a ser más rápidos, con características más nuevas entregadas de forma más regular. Si bien esto no será ningún problema para entornos individuales como NodeJS, es una propuesta ligeramente diferente para entornos de navegador. Lo que está claro es que los marcos de prueba tienen mucho que hacer para ponerse al día. Todavía necesitará probablemente transpile para probar marcos. Yo sugeriría usar broma.

También tenga en cuenta los frameworks de agrupación, se encontrará con problemas allí

 12
Author: Zardoz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-27 14:05:04

Volver a La pregunta original de Jonathan002 sobre

"... ¿qué versión admite las nuevas instrucciones de importación de ES6?"

Basado en el artículo del Dr. Axel Rauschmayer, hay un plan para tenerlo soportado por defecto (sin la bandera experimental de la línea de comandos) en Node.js 10.x LTS. Según el nodo .el plan de lanzamiento de js como está el 3/29, 2018, es probable que esté disponible después de abril de 2018, mientras que LTS del mismo lo hará comience en octubre de 2018.

 5
Author: codeful.element,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-26 14:48:39

Puede intentar esm.

Aquí hay una introducción: https://www.npmjs.com/package/esm

 5
Author: Losses Don,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-18 02:02:34

Solución

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');

A continuación se muestra la definición de mixins/index.js

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

Eso funcionó bien dentro de mi nodo.js CLI app.

 3
Author: DmitrySemenov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-23 13:26:01

No se si esto funcionará para su caso pero estoy ejecutando un servidor express con esto:

nodemon --inspect ./index.js --exec babel-node --presets es2015,stage-2

Esto me da la capacidad de importar y usar el operador de propagación a pesar de que solo estoy usando la versión de nodo 8.

Tendrá que instalar babel-cli, babel-preset-es2015, babel-preset-stage-2 hacer lo que estoy haciendo.

 0
Author: unflores,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-21 13:01:53