Я пытаюсь разобраться с импортом ES6 в Node.js, и я пытаюсь использовать синтаксис, представленный в этом примере:

Ссылка на шпаргалку

Я просматриваю таблицу поддержки, но мне не удалось найти, какая версия поддерживает новые операторы импорта (я пытался найти текст import / require). В настоящее время я использую Node.js 8.1.2 и также считаю, что, поскольку шпаргалка относится к файлам .js, она должна работать с файлами .js.

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

import { square, diag } from 'lib';

Получаю ошибку:

SyntaxError: неожиданный импорт токена.

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

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

Что мне не хватает и как получить node, чтобы распознать мой import оператор?

Jonathan002

Ответов: 11

Ответы (11)

В Node.js включена экспериментальная поддержка ES6. Подробнее здесь: https://nodejs.org/docs/latest-v13.x/api/esm.html#esm_enabling.

TL; DR;

Node.js> = v13

Это очень просто в Node.js 13 и выше. Вам необходимо:

  • Сохраните файл с расширением .mjs или
  • Добавьте {"type": "module"} в ближайший package.json.

Чтобы использовать модули ECMAScript, вам нужно выполнить только одно из вышеперечисленных действий.

Node.js <= v12

Если вы используете Node.js версии 8-12, сохраните файл с модулями ES6 с расширением .mjs и запустите его следующим образом:

node --experimental-modules my-app.mjs

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

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

Вот и все.

• 100001 Также имейте в виду, что Ecma заявила, что циклы выпуска JavaScript будут быстрее, а новые функции будут поставляться на более регулярной основе. Хотя это не будет проблемой для отдельных сред, таких как Node.js, для сред браузера это немного другое предложение. Ясно одно: фреймворки тестирования должны многое сделать, чтобы наверстать упущенное. Возможно, вам все равно потребуется транспилировать для тестирования фреймворков. Я бы предложил использовать Jest.

Также не забывайте о фреймворках. Там у вас будут проблемы.

Решение

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.

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

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

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

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

Также не забудьте увидеть Пояснение ниже.

File 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. Во время работы вы добавите - экспериментальные модули к node index.mjs
  3. При работе с экспериментальными модулями на выходе вы увидите: «(node: 12020) ExperimentalWarning: Загрузчик модуля ESM является экспериментальным. "
  4. У меня текущая версия Node.js, поэтому, если я запустил node --version, я получу «v10.3.0», хотя LTE / стабильная / рекомендуемая версия - 8.11.2 LTS .
  5. Когда-нибудь в будущем вы сможете использовать .js вместо .mjs, поскольку функции станут стабильными, а не экспериментальными.
  6. Подробнее об экспериментальных функциях см .: https://nodejs.org/api/esm.html

Используя Node.js 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')

И, конечно, не забывайте, что это необходимо для фактического запуска скрипта с использованием импорта модулей (не требуется после v13.2):

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

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

{
  "type": "module"
}

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

Я также хочу поделиться этим фрагментом кода, который реализует отсутствующие константы __ filename и __ dirname в модулях:

импортировать {fileURLToPath} из 'url'
импортировать {dirname} из "пути"
const __filename = fileURLToPath (import.meta.url)
const __dirname = dirname (__ filename)

Вы можете попробовать esm.

Вот введение: esm

Я не знаю, подойдет ли это для вашего случая, но я использую сервер Express.js со следующим:

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

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

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

Используйте:

  "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

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

В официальной документации указано:

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

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

(Конечно, вы все равно должны предоставить флаг - экспериментальные модули при запуске вашего приложения.)

Вы также можете использовать пакет npm под названием esm, который позволяет использовать модули ES6 в Node.js. Не требует настройки. С esm вы сможете использовать экспорт / импорт в своих файлах JavaScript.

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

yarn add esm

или

npm install esm

После этого вам необходимо потребовать этот пакет при запуске вашего сервера с node. Например, если ваш сервер узлов запускает файл 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

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

Вернуться к исходному вопросу Jonathan002о

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

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

2022 WebDevInsider