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?
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.
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
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.
function myFunc() {
console.log("Hello from myFunc")
}
export default myFunc;
import myFunc from "./myfile" // this is our myfile.mjs
myFunc();
node --experimental-modules index.mjs
(node:12020) ExperimentalWarning: The ESM module loader is experimental.
Hello from myFunc
Explication:
--experimental-modules
au node index.mjs
node --version
, il me donne "v10.3.0", bien que la version LTE/stable/recommandée soit 8.11.2 LTS.J'espère que ça a aidé.
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:
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
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).
Vous pouvez essayer esm
.
Voici quelques introduction: https://www.npmjs.com/package/esm
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');
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.
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.
"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/
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).
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.