web-dev-qa-db-fra.com

Comment utiliser une importation es6 dans le noeud?

J'essaie de comprendre les importations es6 dans le noeud et j'essaie d'utiliser la syntaxe fournie dans cet exemple:

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

Je regarde dans la table de support: http://node.green/ , mais je n'ai pas pu trouver quelle version prend en charge les nouvelles instructions d'importation (j'ai essayé de rechercher le texte importé/requis) I Je suis en train d’exécuter le noeud 8.1.2 et je pense aussi que, puisque la feuille de calcul fait référence à des fichiers .js, elle devrait fonctionner avec des fichiers .js.

Comme je lance le code (tiré du 1er exemple de Cheatsheet):

import { square, diag } from 'lib';

J'ai l'erreur: SyntaxError: Importation de jeton inattendue.

Référence à lib j'essaie d'importer:

//------ 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'est-ce qui me manque et comment puis-je faire en sorte que le noeud reconnaisse ma déclaration d'importation?

201
Jonathan002

Node.js a inclus un support expérimental pour le support ES6. En savoir plus sur ici: https://nodejs.org/api/esm.html .

TLDR; Enregistrez le fichier avec les modules ES6 avec l’extension .mjs et exécutez-le comme suit:

node --experimental-modules my-app.mjs

Node.js ne supporte pas les modules ES6. Ce blog par James en décrit les raisons. Bien que vous puissiez utiliser Babel pour utiliser la syntaxe des modules ES6.

148
tbking

Vous pouvez également utiliser le package npm appelé esm qui vous permet d'utiliser des modules ES6 dans node. Il n'a pas besoin de configuration. Avec esm, vous pourrez utiliser export/import dans vos fichiers JS.

Exécutez la commande suivante sur votre terminal

yarn add esm 

ou

npm install esm

Après cela, vous devez avoir besoin de ce paquet lors du démarrage de votre serveur avec noeud. Par exemple, si votre serveur de noeud exécute le fichier index.js, vous utiliserez la commande

node -r esm index.js

Vous pouvez également l'ajouter dans votre fichier package.json comme ceci

{
  "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"
  },

}

Ensuite, lancez cette commande depuis le terminal pour démarrer votre serveur de noeud.

npm start

Vérifiez ce lien pour plus de détails

115
Seunope

Gaspillé environ 3 heures.

Je voulais juste utiliser les variables import et export dans des fichiers js.

Tout le monde dit pas possible. Mais, à partir de mai 2018, il est possible d'utiliser ci-dessus en clair node.js, sans aucun module comme babel, etc.

Voici un moyen simple de le faire.

Créez des fichiers ci-dessous, exécutez-les et voyez les résultats par vous-même.

N'oubliez pas non plus de voir Explanation ci-dessous.

myfile.mjs

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

export default myFunc;

index.mjs

import myFunc from "./myfile"  // this is our myfile.mjs

myFunc();

courir

node  --experimental-modules  index.mjs

sortie

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

Hello from myFunc

Explication:

  1. S'agissant de modules expérimentaux, les fichiers .js sont nommés fichiers .mjs
  2. En cours d’exécution, vous ajouterez --experimental-modules au node index.mjs
  3. Lors de l'exécution avec des modules expérimentaux dans la sortie, vous verrez: "(noeud: 12020) ExperimentalWarning: le chargeur de modules ESM est expérimental."
  4. J'ai la version actuelle du noeud js, donc si je lance node --version, il me donne "v10.3.0", bien que la version LTE/stable/recommandée soit 8.11.2 LTS.
  5. Un jour, dans le futur, vous pourrez utiliser .js au lieu de .mjs, en tant que fonctionnalités devenant stables au lieu d’Experimental.
  6. Pour plus d'informations sur les fonctionnalités expérimentales, voir: https://nodejs.org/api/esm.html

J'espère que ça a aidé.

103

Si vous utilisez le système de modules côté serveur, vous n'avez absolument pas besoin d'utiliser Babel. Pour utiliser les modules dans NodeJS, assurez-vous que:

  1. Utilisez une version de noeud qui prend en charge l'indicateur - experimental-modules
  2. Vos fichiers . Js doivent ensuite être renommés en . mjs

C'est ça.

Cependant, et c’est un gros problème, bien que votre code pur et pur ES6 fonctionne dans un environnement tel que NodeJS (à l’écriture 9.5.0), vous aurez toujours la folie de transpiler juste pour tester. N'oubliez pas non plus qu'Ecma a déclaré que les cycles de publication pour Javascript seraient plus rapides et que les nouvelles fonctionnalités seraient fournies plus régulièrement. Bien que cela ne pose aucun problème pour les environnements simples tels que NodeJS, il s'agit d'une proposition légèrement différente pour les environnements de navigateur. Ce qui est clair, c’est que les frameworks de test ont beaucoup à faire pour se rattraper. Vous aurez probablement besoin de transpiler pour tester les frameworks. Je suggère d'utiliser la plaisanterie.

Sachez également que les frameworks de groupement vous poseront des problèmes

18
Zardoz

En utilisant Node v12.2.0, je peux importer tous les modules standard comme ceci:

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'

Par rapport à ce que je faisais auparavant:

const
  Http = require('http')
  ,Fs = require('fs')
  ,Path = require('path')
  ,Readline = require('readline')
  ,Os = require('os')

Tout module qui est un module ECMAScript peut être importé sans avoir à utiliser une extension .mjs tant qu'il contient ce champ dans son fichier package.json:

"type": "module"

Assurez-vous donc de placer un tel fichier package.json dans le même dossier que le module que vous créez.

Et pour importer des modules non mis à jour avec le support de module ECMAScript, procédez comme suit:

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

Et bien sûr, n'oubliez pas que cela est nécessaire pour exécuter un script en utilisant des importations de modules:

node --experimental-modules my-script-that-use-import.js

Et que le dossier parent a besoin de ce fichier package.json pour que ce script ne se plaint pas de la syntaxe d'importation:

{
  "type": "module"
}

Si le module que vous souhaitez utiliser n'a pas été mis à jour pour prendre en charge l'importation en utilisant la syntaxe d'importation, vous n'avez pas d'autre choix que d'utiliser require (mais avec la solution ci-dessus, ce n'est pas un problème).

15

Vous pouvez essayer esm.

Voici quelques introduction: https://www.npmjs.com/package/esm

13
Losses Don

solution

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

ci-dessous la définition de mixins/index.js

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

cela a très bien fonctionné dans mon application CLI node.js.

8
DmitrySemenov

Retour à la question initiale de Jonathan002 à propos de

"... quelle version prend en charge les nouvelles instructions d'importation ES6?"

basé sur le article du Dr. Axel Rauschmayer , il est prévu de le prendre en charge par défaut (sans l'indicateur de ligne de commande expérimental) dans Node.js 10. x LTS . Selon le plan de version de node.js tel qu'il est sur 3/29, 2018, il est susceptible de devenir disponible après avril 2018, tandis que LTS commencera en octobre 2018.

7
codeful.element
  "devDependencies": {
    "@babel/core": "^7.2.0",
    "@babel/preset-env": "^7.2.0",
    "@babel/register": "^7.0.0"
  }

. babelrc

{
  "presets": ["@babel/preset-env"]
}

point d'entrée node.js app

require("@babel/register")({})

// Import the rest of our application.
module.exports = require('./index.js')

Lien Comment activer les importations ES6 dans Node.JS https://timonweb.com/posts/how-to-enable-es6-imports-in-nodejs/

6
zloctb

L'utilisation de l'extension .mjs (comme suggéré dans la réponse acceptée) pour activer les modules ECMAScript fonctionne. Toutefois, avec Node.js v12, vous pouvez également activer cette fonctionnalité globalement dans votre package.json.

Le état officiel de la documentation :

les instructions d'importation de fichiers .js et sans extension sont traitées comme des modules ES si le package parent.json le plus proche contient "type": "module".

{
  "type": "module",
  "main": "./src/index.js"
}

(Bien sûr, vous devez toujours fournir le drapeau --experimental-modules lors du démarrage de votre application).

4
B12Toaster

Je ne sais pas si cela fonctionnera pour votre cas, mais j'utilise un serveur express avec ceci:

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

Cela me donne la possibilité d'importer et d'utiliser spread operator bien que je n'utilise que la version 8 du noeud.

Vous devrez installer babel-cli, babel-preset-es2015, babel-preset-stage-2 faire ce que je fais.

3
unflores