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

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

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

Я просматриваю таблицу поддержки: http://node.green/, но не смог найти, какая версия поддерживает новые операторы импорта (я пытался найти текст import/require). Сейчас я работаю с узлом 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));
}

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

7 ответов

Решение

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

TLDR; Сохраните файл с модулями ES6 с помощью .mjs расширение и запустить его как:

node --experimental-modules my-app.mjs

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

Вы также можете использовать пакет 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 часов.

Я просто хотел использовать 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"

myFunc();

бежать

node  --experimental-modules  index.mjs

выход

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

Hello from myFunc

Объяснение:

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

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

Используя 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 (но с моим решением выше, это не проблема).

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

.babelrc

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

точка входа

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/

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

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

Вот и все.

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

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

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

Вот некоторые введения: https://www.npmjs.com/package/esm

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

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

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

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

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

решение

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.

Вернуться к первоначальному вопросу Jonathan002 о

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

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

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

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

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

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

Другие вопросы по тегам