Hoe kan ik een ES6-import in Node.js gebruiken? [DUPLICEER]

Ik probeer de HAND van ES6-invoer in Node.js te krijgen en probeer de syntaxis in dit voorbeeld te gebruiken:

Cheatsheet Link

Ik kijk door de ondersteuningstabel , maar ik kon niet vinden welke versie de nieuwe importverklaringen ondersteunt (Ik heb geprobeerd op zoek naar de tekst importeren / vereisen). Ik loop momenteel Node.js 8.1.2 en geloof ook dat sinds de cheatsheet verwijst naar .JS-bestanden, het moet werken met .js-bestanden.

Zoals ik de code uitvoer (genomen uit het eerste voorbeeld van de cheatsheet):

import { square, diag } from 'lib';

Ik krijg de foutmelding:

SyntaxError: Onverwachte Token Import.

Verwijzing naar bibliotheek Ik probeer te importeren:

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

Wat ben ik mis en hoe kan ik nodekrijgen om mijn importVerklaring te herkennen?


Antwoord 1, Autoriteit 100%

Node.js heeft experimentele ondersteuning voor ES6-ondersteuning opgenomen.
Lees meer over hier: https://nodjs.org/docs/ Laatste-V13.x / API / ESM.HTML # ESM_ENABLING .

TLDR;

node.js & gt; = v13

Het is heel eenvoudig in Node.js 13 en hoger. U moet ofwel:

  • Sla het bestand op met de extensie .mjs, of
  • Voeg { "type": "module" }toe aan de dichtstbijzijnde package.json.

U hoeft slechts één van de bovenstaande handelingen uit te voeren om ECMAScript-modules te kunnen gebruiken.

Node.js <= v12

Als je Node.js versie 8-12 gebruikt, slahet bestand op met ES6-modules met de extensie .mjsen voer het uit als:

node --experimental-modules my-app.mjs

Antwoord 2, autoriteit 68%

U kunt ook het npm-pakket gebruiken met de naam esmwaarmee u om ES6-modules te gebruiken in Node.js. Het heeft geen configuratie nodig. Met esm kunt u exporteren/importeren in uw JavaScript-bestanden.

Voer de volgende opdracht uit op uw terminal

yarn add esm

of

npm install esm

Daarna moet u dit pakket nodig hebben bij het starten van uw server met node. Als uw node-server bijvoorbeeld het index.js-bestand uitvoert, gebruikt u de opdracht

node -r esm index.js

Je kunt het ook op deze manier aan je package.json-bestand toevoegen

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

Voer vervolgens deze opdracht uit vanaf de terminal om uw node-server te starten

npm start

Bekijk deze link voor meer details.


Antwoord 3, autoriteit 37%

Ik wilde alleen de importen exportgebruiken in JavaScript-bestanden.

Iedereen zegt dat het niet mogelijk is. Maar vanaf mei 2018 is het mogelijk om het bovenstaande in gewone Node.js te gebruiken, zonder modules zoals Babel, enz.

Hier is een eenvoudige manier om het te doen.

Maak de onderstaande bestanden, voer ze uit en bekijk de uitvoer zelf.

Vergeet ook niet om Explanationhieronder te bekijken.

Bestand mijnbestand.mjs

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

Bestand index.mjs

import myFunc from "./myfile.mjs"  // Simply using "./myfile" may not work in all resolvers
myFunc();

Rennen

node  --experimental-modules  index.mjs

Uitvoer

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

Uitleg:

  1. Omdat het experimentele modules zijn, worden .js-bestanden .mjs-bestanden genoemd
  2. Tijdens het uitvoeren voegt u --experimental-modulestoe aan de node index.mjs
  3. Terwijl je met experimentele modules in de uitvoer draait, zie je: “(node:12020) ExperimentalWarning: De ESM-modulelader is experimenteel.
  4. Ik heb de huidige versie van Node.js, dus als ik node --versiongebruik, krijg ik “v10.3.0”, hoewel de LTE/stabiele/aanbevolen versie 8.11.2 is LTS.
  5. In de toekomst zou je .js kunnen gebruiken in plaats van .mjs, omdat de functies stabiel worden in plaats van experimenteel.
  6. Meer over experimentele functies, zie: https://nodejs.org/api/esm.html

Antwoord 4, autoriteit 14%

Met Node.js v12.2.0 kan ik alle standaardmodules als volgt importeren:

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'

Vergeleken met wat ik eerder deed:

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

Elke module die een ECMAScript-module is, kan worden geïmporteerd zonder een .mjs-extensie te hoeven gebruiken, zolang het dit veld in het pakket.json-bestand heeft:

"type": "module"

Zorg er dus voor dat je zo’n package.json-bestand in dezelfde map plaatst als de module die je aan het maken bent.

En om modules te importeren die niet zijn bijgewerkt met ondersteuning voor ECMAScript-modules, kunt u dit als volgt doen:

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

En vergeet natuurlijk niet dat dit nodig is om een script daadwerkelijk uit te voeren met behulp van module-import (niet nodig na v13.2):

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

En dat de bovenliggende map dit package.json-bestand nodig heeft om dat script niet te laten klagen over de importsyntaxis:

{
  "type": "module"
}

Als de module die u wilt gebruiken niet is bijgewerkt om het importeren te ondersteunen met behulp van de importsyntaxis, dan heeft u geen andere keuze dan het gebruik van required (maar met mijn bovenstaande oplossing is dat geen probleem).

Ik wil ook dit stukje code delen dat de ontbrekende __filenameen __dirnameconstanten in modules implementeert:

import {fileURLToPath} from 'url'
import {dirname} from 'path'
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)

Antwoord 5, autoriteit 5%

Als u het modulesysteem aan de serverzijde gebruikt, hoeft u niet te gebruiken Babelhelemaal niet. Om modules in Node.js te gebruiken, moet u ervoor zorgen dat:

  1. Gebruik een versie van node die de vlag –experimental-modulesondersteunt
  2. Uw *.js-bestanden moeten dan worden hernoemd naar *.mjs

Dat is het.

En dit is echter een grote, terwijl je Shinny Pure ES6-code in een omgeving zoals Node.js (bijvoorbeeld 9.5.0) loopt, heb je nog steeds de gekte van het transpillen om te testen. Houd er ook rekening mee dat Ecma heeft verklaard dat release-cycli voor Javascript sneller zullen zijn, met nieuwere functies die regelmatig worden afgeleverd. Hoewel dit geen problemen zal zijn voor enkele omgevingen zoals Node.js, is het een iets andere propositie voor browseromgevingen. Wat duidelijk is, is dat testkaders veel hebben om te doen bij het inhalen. U moet nog steeds waarschijnlijk uitzetten voor het testen van frameworks. Ik zou willen aanraden jest .

Wees ook op de hoogte van het bundelen van frameworks. Je zult daar problemen in rennen.


Antwoord 6, Autoriteit 4%

Gebruik:

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

Bestand .BABELRC

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

Entry Point voor de toepassing Node.js:

require("@babel/register")({})
// Import the rest of our application.
module.exports = require('./index.js')

Zie Hoe ES6-invoer in te schakelen Node.js


Antwoord 7, Autoriteit 3%

U kunt esmproberen.

Hier is een introductie: eSM


Antwoord 8, Autoriteit 2%

De extensie .mjsgebruiken (zoals gesuggereerd in het geaccepteerde antwoord) om ECMAScript-modules in te schakelen, werkt. Met Node.js v12 kunt u deze functie echter ook globaal inschakelen in uw package.json-bestand.

In de officiële documentatie staat:

importinstructies van .js en extensieloze bestanden worden behandeld als ES-modules als het dichtstbijzijnde bovenliggende pakket.json “type”: “module” bevat.

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

(Natuurlijk moet je nog steeds de vlag --experimental-modulesopgeven bij het starten van je applicatie.)


Antwoord 9, autoriteit 2%

Terug naar Jonathan002‘s oorspronkelijke vraag over

“… welke versie ondersteunt de nieuwe ES6-importinstructies?”

op basis van het artikel van Dr. Axel Rauschmayeris er een plan om het standaard te laten ondersteunen (zonder de experimentele opdrachtregelvlag) in Node.js 10.x LTS. Volgens het releaseplan van node.jszoals het is op 29-3-2018, is het waarschijnlijk om beschikbaar te worden na april 2018, terwijl LTS ervan in oktober 2018 begint.


Antwoord 10, autoriteit 2%

Oplossing

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

Hieronder staat de definitie van bestand *mixins/index.js

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

Dat werkte prima in mijn Node.js CLI-toepassing.


Antwoord 11

Ik weet niet of dit in jouw geval werkt, maar ik gebruik een Express .jsserver met dit:

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

Dit geeft me de mogelijkheid om de spread-operator te importeren en te gebruiken, ook al gebruik ik alleen Node.js versie 8.

Je moet babel-cli, babel-preset-es2015 en babel-preset-stage-2 installeren om te kunnen doen wat ik doe.

Other episodes