Как я могу использовать импорт es6 в узле?

Я пытаюсь получить зависание импорта es6 в узле и пытаюсь использовать синтаксис, приведенный в этом примере:

Ссылка на cheatsheet: https://hackernoon.com/import-export-default-require-commandjs-javascript-nodejs-es6-vs-cheatsheet-different-tutorial-example-5a321738b50f

Я просматриваю таблицу поддержки: http://node.green/, но не смог найти, какая версия поддерживает новые операторы импорта (я попытался найти импорт текста/требует). В настоящее время я запускаю узел 8.1. 2, а также считают, что, поскольку чит-лист относится к файлам.js, он должен работать с файлами.js.

Когда я запускаю код (взятый из первого примера):

import { square, diag } from 'lib';

Я получаю сообщение об ошибке: SyntaxError: Неожиданный импорт токена.

Ссылка на lib, которую я пытаюсь импортировать:

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

Что мне не хватает, и как я могу получить узел для распознавания моего оператора импорта?

Ответ 1

Node.js включил экспериментальную поддержку поддержки ES6. Подробнее читайте здесь: https://nodejs.org/api/esm.html.

TL;DR; Сохраните файл с модулями .mjs расширением .mjs и запустите его, как:

node --experimental-modules my-app.mjs

Node.js не поддерживает модули ES6. Этот блог Джеймса описывает причины этого. Хотя вы можете использовать Babel для использования синтаксиса модулей ES6.

Ответ 2

Вы также можете использовать пакет npm под названием esm, который позволяет использовать модули ES6 в узле. Это не нуждается в конфигурации. С помощью esm вы сможете использовать экспорт/импорт в ваших файлах JS.

Запустите следующую команду на своем терминале

yarn add esm 

или

npm install esm

После этого вам потребуется этот пакет при запуске сервера с узла. Например, если ваш сервер узлов запускает файл index.js, вы должны использовать команду

node -r esm index.js

Вы также можете добавить его в свой файл package.json следующим образом

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

}

Затем запустите эту команду из терминала, чтобы запустить сервер вашего узла

npm start

Проверьте эту ссылку для получения более подробной информации.

Ответ 3

Потрачено около 3 часов.

Я просто хотел использовать import и export в файлах js.

Все говорят, что это невозможно. Но, начиная с мая 2018 года, можно использовать выше в обычном node.js без каких-либо модулей, таких как babel и т.д.

Вот простой способ сделать это.

Создайте файлы ниже, запустите и сами увидите вывод.

Также не забудьте посмотреть Explanation ниже.

myfile.mjs

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

export default myFunc;

index.mjs

import myFunc from "./myfile.mjs"  // simply using "./myfile" may not work in all resolvers

myFunc();

запустить

node  --experimental-modules  index.mjs

выход

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

Hello from myFunc

Объяснение:

  1. Поскольку это экспериментальные модули, файлы .js называются файлами .mjs
  2. .Во время работы вы добавите --experimental-modules в node index.mjs
  3. При работе с экспериментальными модулями в выходных данных вы увидите: "(узел: 12020) ExperimentalWarning: Загрузчик модулей ESM является экспериментальным. "
  4. У меня есть текущая версия узла js, поэтому, если я запускаю node --version, он выдает мне "v10.3.0", хотя LTE/стабильная/рекомендуемая версия - 8.11.2 LTS.
  5. Когда-нибудь в будущем вы можете использовать .js вместо .mjs, так как функции станут стабильными, а не экспериментальными.
  6. Подробнее об экспериментальных функциях см.: https://nodejs.org/api/esm.html

Надеюсь, что это помогло.

Ответ 4

Используя Node v12.2.0, я могу импортировать все стандартные модули, например:

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'

По сравнению с тем, что я делал раньше:

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

Любой модуль, который является модулем ECMAScript, может быть импортирован без использования расширения .mjs, если у него есть это поле в файле package.json:

"type": "module"

Поэтому убедитесь, что вы поместили такой файл package.json в ту же папку, где находится создаваемый вами модуль.

А чтобы импортировать модули, не обновленные с поддержкой модулей ECMAScript, вы можете сделать так:

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

И, конечно же, не забывайте, что это необходимо для запуска скрипта с использованием импорта модулей:

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

И что родительской папке нужен этот файл package.json, чтобы этот скрипт не жаловался на синтаксис импорта:

{
  "type": "module"
}

Если модуль, который вы хотите использовать, не был обновлен для поддержки импорта с использованием синтаксиса импорта, то у вас нет другого выбора, кроме как использовать require (но с моим решением выше, это не проблема).

Ответ 5

Если вы используете систему модулей на стороне сервера, вам не нужно вообще использовать Babel. Чтобы использовать модули в NodeJS, убедитесь, что:

  1. Используйте версию узла, которая поддерживает флаг -experimental-modules
  2. Затем ваши .js- файлы должны быть переименованы в .mjs

Это.

Тем не менее, но это большой результат, в то время как ваш shinny чистый ES6-код будет работать в среде, такой как NodeJS (при написании 9.5.0), у вас все еще будет сумасшествие транспиляции только для тестирования. Также имейте в виду, что Ecma заявила, что циклы выпуска для Javascript будут быстрее, а новые функции будут предоставляться на регулярной основе. Хотя это не будет проблемой для отдельных сред, таких как NodeJS, это несколько другое предложение для среды браузера. Понятно, что в рамках тестирования очень много предстоит сделать. Вам все равно нужно будет перераспределить для тестирования фреймворки. Я предлагаю использовать шутку.

Также имейте в виду структуру пакетов, вы столкнетесь с проблемами там

Ответ 7

Вернуться на Jonathan002 оригинальный вопрос о

"... какая версия поддерживает новые операторы импорта ES6?"

на основе статьи доктора Акселя Раушмайера существует план поддержки по умолчанию (без флага экспериментальной командной строки) в Node.js 10.x LTS. В соответствии с планом выпуска node.js, который составлен 3/29 2018 года, он, вероятно, станет доступным после апреля 2018 года,, тогда как его LTS начнется в октябре 2018 года.

Ответ 8

решение

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

ниже приведено определение mixins/index.js

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

это прекрасно работало в моем CLI-приложении node.js.

Ответ 9

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

.babelrc

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

точка входа приложение node.js

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

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

Ссылка Как включить импорт ES6 в Node.JS https://timonweb.com/posts/how-to-enable-es6-imports-in-nodejs/

Ответ 10

Используя расширение .mjs (как предложено в принятом ответе) для того, чтобы включить модули ECMAScript, работает, однако, с Node.js v12, вы также можете включить эту функцию глобально в вашем package.json.

Официальные документы утверждают:

операторы импорта файлов .js и без расширений обрабатываются как модули ES, если ближайший родительский пакет package.json содержит "тип": "модуль".

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

(Конечно, вы все равно должны --experimental-modules флаг --experimental-modules при запуске приложения).

Ответ 11

Я не знаю, будет ли это работать для вашего случая, но я использую экспресс-сервер с этим:

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

Это дает мне возможность импортировать и использовать оператор распространения, хотя я использую только узел версии 8.

Вам нужно будет установить babel-cli, babel-preset-es2015, babel-preset-stage-2, делайте то, что я делаю.