it-swarm.com.de

Wie kann ich einen es6-Import in Node verwenden?

Ich versuche, es6-Importe in Node in den Griff zu bekommen und versuche, die in diesem Beispiel bereitgestellte Syntax zu verwenden:

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

Ich durchsuche die Support-Tabelle: http://node.green/ , konnte aber nicht finden, welche Version die neuen Import-Anweisungen unterstützt (ich habe versucht, den Text zu importieren/zu benötigen) Ich führe derzeit Knoten 8.1.2 aus und bin außerdem der Meinung, dass das Cheatsheet mit .js-Dateien funktionieren sollte, da es auf .js-Dateien verweist.

Während ich den Code ausführe (entnommen aus dem ersten Beispiel des Cheatsheets):

import { square, diag } from 'lib';

Ich erhalte den Fehler: SyntaxError: Unerwarteter Token-Import.

Verweis auf die Bibliothek, die ich importieren möchte:

//------ 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));
}

Was fehlt mir und wie kann ich Knoten dazu bringen, meine Importanweisung zu erkennen?

201
Jonathan002

Node.js bietet experimentelle Unterstützung für die ES6-Unterstützung. Lesen Sie hier mehr darüber: https://nodejs.org/api/esm.html .

TLDR; Speichern Sie die Datei mit ES6-Modulen mit der Erweiterung .mjs und führen Sie sie folgendermaßen aus:

node --experimental-modules my-app.mjs

Node.js unterstützt keine ES6-Module. Dieser Blog von James beschreibt die Gründe dafür. Sie können jedoch Babel verwenden, um die ES6-Modulsyntax zu verwenden.

148
tbking

Sie können auch das npm-Paket esm verwenden, mit dem Sie ES6-Module in Node verwenden können. Es bedarf keiner Konfiguration. Mit esm können Sie Export/Import in Ihre JS-Dateien verwenden.

Führen Sie den folgenden Befehl auf Ihrem Terminal aus

yarn add esm 

oder

npm install esm

Danach benötigen Sie dieses Paket, wenn Sie Ihren Server mit Node starten. Wenn auf Ihrem Knotenserver beispielsweise die Datei index.js ausgeführt wird, verwenden Sie den Befehl

node -r esm index.js

Sie können es auch wie folgt in Ihre package.json-Datei einfügen

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

}

Führen Sie dann diesen Befehl vom Terminal aus, um Ihren Knotenserver zu starten

npm start

Überprüfen Sie dieser Link für weitere Details

115
Seunope

Ca. 3 Stunden verschwendet.

Ich wollte nur die import und export in js-Dateien verwenden.

Jeder sagt nicht möglich. Ab Mai 2018 ist es jedoch möglich, die oben genannten Dateien in plain node.js ohne Module wie babel usw. zu verwenden.

Hier ist eine einfache Möglichkeit, dies zu tun.

Erstellen Sie die folgenden Dateien, führen Sie sie aus und lassen Sie sich von der Ausgabe überzeugen.

Vergessen Sie auch nicht, unten Explanation zu sehen.

myfile.mjs

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

export default myFunc;

index.mjs

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

myFunc();

lauf

node  --experimental-modules  index.mjs

ausgabe

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

Hello from myFunc

Erläuterung:

  1. Da es sich um experimentelle Module handelt, werden .js-Dateien als .mjs-Dateien bezeichnet
  2. Während des Laufens werden Sie --experimental-modules zum node index.mjs hinzufügen
  3. Während der Ausführung mit experimentellen Modulen in der Ausgabe wird Folgendes angezeigt: "(Knoten: 12020) ExperimentalWarning: Der ESM-Modullader ist experimentell."
  4. Ich habe die aktuelle Version von Knoten js. Wenn ich also node --version ausführe, erhalte ich "v10.3.0", obwohl die LTE/stable/Recommended-Version 8.11.2 LTS ist.
  5. Eines Tages in der Zukunft könnten Sie .js anstelle von .mjs verwenden, da die Features, die Sie verwenden, stabil werden, anstatt experimentell.
  6. Weitere Informationen zu experimentellen Funktionen finden Sie unter: https://nodejs.org/api/esm.html

Hoffe das hat geholfen.

103

Wenn Sie das Modulsystem auf der Serverseite verwenden, müssen Sie Babel überhaupt nicht verwenden. Um Module in NodeJS zu verwenden, stellen Sie Folgendes sicher:

  1. Verwenden Sie eine Version des Knotens, die das Flag - experimental-modules unterstützt
  2. Ihre .js -Dateien müssen dann umbenannt werden in . mjs

Das ist es.

Dies ist jedoch ein großes Problem, auch wenn Ihr shinny-reiner ES6-Code in einer Umgebung wie NodeJS (zum Schreiben von 9.5.0) ausgeführt wird, werden Sie immer noch die Verrücktheit haben, nur zu testen. Bedenken Sie auch, dass Ecma angegeben hat, dass die Veröffentlichungszyklen für Javascript schneller werden, da regelmäßig neue Funktionen bereitgestellt werden. Während dies für einzelne Umgebungen wie NodeJS kein Problem darstellt, ist es für Browserumgebungen etwas anders. Es ist klar, dass das Testen von Frameworks viel damit zu tun hat, aufzuholen. Sie müssen wahrscheinlich noch transpilieren, um Frameworks zu testen. Ich würde vorschlagen, einen Scherz zu verwenden.

Beachten Sie auch die Bündelung von Frameworks, da Sie dort auf Probleme stoßen werden

18
Zardoz

Mit Node v12.2.0 kann ich alle Standardmodule wie folgt importieren:

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'

Im Vergleich zu dem, was ich vorher gemacht habe:

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

Jedes Modul, das ein ECMAScript-Modul ist, kann importiert werden, ohne dass die Erweiterung .mjs verwendet werden muss, sofern dieses Feld in der Datei package.json enthalten ist:

"type": "module"

Stellen Sie also sicher, dass Sie eine solche package.json-Datei im selben Ordner wie das Modul ablegen, das Sie erstellen.

Und um Module zu importieren, die nicht mit ECMAScript-Modulunterstützung aktualisiert wurden, können Sie folgendermaßen vorgehen:

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

Und vergessen Sie natürlich nicht, dass dies erforderlich ist, um ein Skript mithilfe von Modulimporten auszuführen:

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

Und dass der übergeordnete Ordner diese package.json-Datei benötigt, damit sich das Skript nicht über die Importsyntax beschwert:

{
  "type": "module"
}

Wenn das Modul, das Sie verwenden möchten, nicht aktualisiert wurde, um den Import mithilfe der Importsyntax zu unterstützen, haben Sie keine andere Wahl als require (aber mit meiner obigen Lösung ist das kein Problem).

Sie können esm versuchen.

Hier eine Einführung: https://www.npmjs.com/package/esm

13
Losses Don

Lösung

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

im Folgenden finden Sie die Definition von mixins/index.js

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

das hat in meiner node.js CLI-App prima funktioniert.

8
DmitrySemenov

Zurück zu Jonathan002 s ursprünglicher Frage über

"... welche Version unterstützt die neuen ES6-Importanweisungen?"

basierend auf dem Artikel von Dr. Axel Rauschmayer soll es in Node.js 10 standardmäßig (ohne das experimentelle Befehlszeilen-Flag) unterstützt werden. x LTS . Laut node.js 'Release Plan wird es voraussichtlich ab dem 29. März 2018 verfügbar sein. , während LTS davon im Oktober 2018 beginnen wird.

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"]
}

einstiegspunkt node.js App

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

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

Link So aktivieren Sie ES6-Importe in Node.JS https://timonweb.com/posts/how-to-enable-es6-imports-in-nodejs/

6
zloctb

Wenn Sie die Erweiterung .mjs verwenden (wie in der akzeptierten Antwort vorgeschlagen), um ECMAScript-Module zu aktivieren, können Sie diese Funktion in Node.js v12 jedoch auch global in Ihrem package.json aktivieren.

Das offizielles Dokument :

importanweisungen von .js und erweiterungslosen Dateien werden als ES-Module behandelt, wenn das nächste übergeordnete package.json "type": "module" enthält.

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

(Natürlich müssen Sie beim Starten Ihrer App noch das Flag --experimental-modules angeben).

4
B12Toaster

Ich weiß nicht, ob dies für Ihren Fall funktioniert, aber ich verwende einen Express-Server mit folgendem Code:

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

Dadurch kann ich den Spread-Operator importieren und verwenden, obwohl ich nur die Knotenversion 8 verwende.

Sie müssen Babel-CLI, Babel-Preset-ES2015, Babel-Preset-Stage-2 installieren. Tun Sie, was ich tue.

3
unflores