Как я могу использовать импорт 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
Объяснение:
- Поскольку это экспериментальные модули, файлы .js называются файлами .mjs
- .Во время работы вы добавите
--experimental-modules
в node index.mjs
- При работе с экспериментальными модулями в выходных данных вы увидите: "(узел: 12020) ExperimentalWarning: Загрузчик модулей ESM является экспериментальным.
"
- У меня есть текущая версия узла js, поэтому, если я запускаю
node --version
, он выдает мне "v10.3.0", хотя LTE/стабильная/рекомендуемая версия - 8.11.2 LTS.
- Когда-нибудь в будущем вы можете использовать .js вместо .mjs, так как функции станут стабильными, а не экспериментальными.
- Подробнее об экспериментальных функциях см.: 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, убедитесь, что:
- Используйте версию узла, которая поддерживает флаг -experimental-modules
- Затем ваши .js- файлы должны быть переименованы в .mjs
Это.
Тем не менее, но это большой результат, в то время как ваш shinny чистый ES6-код будет работать в среде, такой как NodeJS (при написании 9.5.0), у вас все еще будет сумасшествие транспиляции только для тестирования. Также имейте в виду, что Ecma заявила, что циклы выпуска для Javascript будут быстрее, а новые функции будут предоставляться на регулярной основе. Хотя это не будет проблемой для отдельных сред, таких как NodeJS, это несколько другое предложение для среды браузера. Понятно, что в рамках тестирования очень много предстоит сделать. Вам все равно нужно будет перераспределить для тестирования фреймворки. Я предлагаю использовать шутку.
Также имейте в виду структуру пакетов, вы столкнетесь с проблемами там
Ответ 6
Вы можете попробовать esm
.
Вот некоторые введения: https://www.npmjs.com/package/esm
Ответ 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, делайте то, что я делаю.