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

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

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

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

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

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 ответов


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

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

node --experimental-modules my-app.mjs

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


потратил около 3 часов.

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

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

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

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

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

myfile.mjs

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

export default myFunc;
.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" в "индекс узла.js"
  3. во время работы с экспериментальными модулями на выходе вы увидите: "(узел: 12020) ExperimentalWarning: The Загрузчик модуля ESM является экспериментальным. "
  4. у меня есть текущий выпуск узла js, поэтому, если я запускаю "node -- version", он дает мне " v10.3.0", хотя LTE/стабильная / рекомендуемая версия-8.11.2 LTS.
  5. когда-нибудь в будущем вы можете использовать .вместо JS на .mjs, как функции вы становитесь стабильными, а не экспериментальными.
  6. подробнее об экспериментальных функциях см.:https://nodejs.org/api/esm.html

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


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

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

на Jonathan002оригинальный вопрос о

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

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


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

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


решение

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

это отлично работало внутри моего узла.приложение JS CLI.


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

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

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

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