node.js - instalar - ¿Cómo puedo usar una importación es6 en el nodo?
node js es un framework (11)
Esta pregunta ya tiene una respuesta aquí:
- Node.js - SyntaxError: token inesperado import 9 respuestas
Estoy tratando de acostumbrarme a las importaciones de es6 en el nodo 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 la tabla de soporte: http://node.green/ , pero no pude encontrar qué versión admite las nuevas declaraciones de importación (intenté buscar la importación / solicitud de texto) Actualmente estoy ejecutando el nodo 8.1. 2 y también creo que dado que la hoja de referencia se refiere a archivos .js, debería funcionar con archivos .js.
Mientras ejecuto el código (tomado del primer ejemplo de la hoja de trucos):
import { square, diag } from ''lib'';
Me sale el error: SyntaxError: Importación de token inesperada.
Referencia a lib que estoy intentando 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 estoy perdiendo y cómo puedo hacer que el nodo reconozca mi declaración de importación?
Node.js ha incluido soporte experimental para soporte ES6. Lea más sobre aquí: https://nodejs.org/api/esm.html .
TLDR;
Guarde el archivo con módulos ES6 con extensión
.mjs
y ejecútelo como:
node --experimental-modules my-app.mjs
Node.js no admite módulos ES6.
Este blog de James
describe las razones para ello.
Aunque puede usar
Babel
para usar la sintaxis de los módulos ES6.
El uso de la extensión
.mjs
(como se sugiere en la respuesta aceptada) para habilitar los módulos ECMAScript funciona, sin embargo, con Node.js v12, también puede habilitar esta característica globalmente en su
package.json
.
Los documentos oficiales indican :
las declaraciones de importación de .js y los archivos sin extensión se tratan como módulos ES si el paquete padre más cercano.json contiene "type": "module".
{
"type": "module",
"main": "./src/index.js"
}
(Por supuesto, aún debe proporcionar la bandera
--experimental-modules
al iniciar su aplicación).
No sé 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 aunque solo estoy usando la versión 8 del nodo.
Deberá instalar babel-cli, babel-preset-es2015, babel-preset-stage-2, haga lo que estoy haciendo.
Perdido alrededor de 3 horas.
Solo quería usar la
import
y
export
en archivos js.
Todos dicen que no es posible. Pero, a partir de mayo de 2018, es posible usar el anterior en node.js simple, sin ningún módulo como babel, etc.
Aquí hay una manera simple de hacerlo.
Cree los archivos a continuación, ejecute y vea la salida por sí mismo.
Además, no olvide ver la
Explanation
continuación.
myfile.mjs
npm install esm
index.mjs
node -r esm index.js
correr
{
"name": "My-app",
"version": "1.0.0",
"description": "Some Hack",
"main": "index.js",
"scripts": {
"test": "echo /"Error: no test specified/" && exit 1",
"start": "node -r esm index.js"
},
}
salida
npm start
Explicación:
- Como se trata de módulos experimentales, los archivos .js se denominan archivos .mjs
-
Mientras se ejecuta, agregará
--experimental-modules
alnode index.mjs
- Mientras se ejecuta con módulos experimentales en la salida, verá: "(nodo: 12020) Advertencia experimental: el cargador de módulos ESM es experimental".
-
Tengo la versión actual del nodo js, por lo que si ejecuto
node --version
, me da "v10.3.0", aunque la versión LTE / estable / recomendada es 8.11.2 LTS. - Algún día en el futuro, podría usar .js en lugar de .mjs, ya que las características se vuelven estables en lugar de Experimental.
- Más sobre características experimentales, ver: https://nodejs.org/api/esm.html
Espero que haya ayudado.
Puedes probar
esm
.
Aquí hay alguna introducción: esm
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:
- Use una versión de nodo que admita el indicador --experimental-modules
- Sus archivos .js se deben renombrar a .mjs
Eso es.
Sin embargo, y esto es un gran problema, mientras que su brillante código ES6 puro se ejecutará en un entorno como NodeJS (al escribir 9.5.0), todavía tendrá la locura de transpilar solo para probar. También tenga en cuenta que Ecma ha declarado que los ciclos de lanzamiento de Javascript serán más rápidos, con nuevas funciones entregadas de manera más regular. Si bien esto no será un 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 ver para ponerse al día. Es probable que aún necesites transpilar para probar marcos. Sugeriría usar broma.
También tenga en cuenta los marcos de agrupación, se encontrará con problemas allí
También puede usar el paquete npm llamado esm que le permite usar módulos ES6 en el nodo. No necesita configuración. Con esm podrás usar export / import en tus archivos JS.
Ejecute el siguiente comando en su terminal
function myFunc() {
console.log("Hello from myFunc")
}
export default myFunc;
o
import myFunc from "./myfile" // this is our myfile.mjs
myFunc();
Después de eso, debe requerir este paquete al iniciar su servidor con nodo. Por ejemplo, si su servidor de nodo ejecuta el archivo index.js, usaría el comando
node --experimental-modules index.mjs
También puede agregarlo en su archivo package.json como este
(node:12020) ExperimentalWarning: The ESM module loader is experimental.
Hello from myFunc
Luego ejecute este comando desde la terminal para iniciar su servidor de nodo
yarn add esm
Mira este enlace para más detalles
Usando Node v12.2.0 puedo importar todos los módulos estándar como este:
// 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'');
Contra lo que hice antes:
export { default as FormValidationMixin } from ''./form-validation''; // eslint-disable-line import/prefer-default-export
Cualquier módulo que sea un módulo ECMAScript puede importarse sin tener que usar una extensión .mjs siempre que tenga este campo en su archivo package.json:
import * as Http from ''http''
import * as Fs from ''fs''
import * as Path from ''path''
import * as Readline from ''readline''
import * as Os from ''os''
Así que asegúrese de colocar dicho archivo package.json en la misma carpeta que el módulo que está creando.
Y para importar módulos no actualizados con el soporte del módulo ECMAScript puede hacer lo siguiente:
const
Http = require(''http'')
,Fs = require(''fs'')
,Path = require(''path'')
,Readline = require(''readline'')
,Os = require(''os'')
Y, por supuesto, no olvide que esto es necesario para ejecutar realmente un script utilizando las importaciones de módulos:
"type": "module"
Y que la carpeta principal necesita este archivo package.json para que ese script no se queje de la sintaxis de importación:
// Implement the old require function
import { createRequire } from ''module''
const require = createRequire(import.meta.url)
// Now you can require whatever
const
WebSocket = require(''ws'')
,Mime = require(''mime-types'')
,Chokidar = require(''chokidar'')
Si el módulo que desea usar no se ha actualizado para admitir la importación utilizando la sintaxis de importación, entonces no tiene otra opción que usar require (pero con mi solución anterior eso no es un problema).
Volver a la pregunta original de sobre
"... ¿qué versión admite las nuevas declaraciones de importación ES6?"
Según el artículo del Dr. Axel Rauschmayer , existe un plan para que sea compatible de forma predeterminada (sin el indicador de línea de comando experimental) en Node.js 10.x LTS . De acuerdo con el plan de lanzamiento de node.js como está en 29/03/2018, es probable que esté disponible después de abril de 2018, mientras que LTS comenzará en octubre de 2018.
solución
https://www.npmjs.com/package/babel-register
node --experimental-modules my-script-that-use-import.js
a continuación se muestra la definición de mixins / index.js
{
"type": "module"
}
eso funcionó bien dentro de mi aplicación de la CLI de node.js.
"devDependencies": {
"@babel/core": "^7.2.0",
"@babel/preset-env": "^7.2.0",
"@babel/register": "^7.0.0"
}
.babelrc
{
"presets": ["@babel/preset-env"]
}
punto de entrada aplicación node.js
require("@babel/register")({})
// Import the rest of our application.
module.exports = require(''./index.js'')
Enlace Cómo habilitar importaciones ES6 en Node.JS https://timonweb.com/posts/how-to-enable-es6-imports-in-nodejs/