Я не понимаю, что не так. Node v5.6.0 NPM v3.10.6
Код:
function (exports, require, module, __filename, __dirname) {
import express from 'express'
};
Ошибка:
SyntaxError: Unexpected token import
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:387:25)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Function.Module.runMain (module.js:447:10)
at startup (node.js:140:18)
at node.js:1001:3
Обновление 3: Начиная с Node 13, вы можете использовать либо расширение .mjs, либо установить "тип": "модуль" в вашем package.json. Вам **не нужно использовать флаг --experimental-modules
.
Обновление 2: Начиная с Node 12, вы можете использовать либо расширение .mjs
, либо установить "тип": "модуль"
в вашем package.json. И вам нужно запустить node с флагом --experimental-modules
.
Обновление: В Node 9 это включено с помощью флага и использует расширение .mjs
.
node --experimental-modules my-app.mjs
Хотя import
действительно является частью ES6, он, к сожалению, еще не поддерживается в NodeJS по умолчанию, и только совсем недавно получил поддержку в браузерах.
Смотрите таблицу совместимости браузеров на MDN и этот вопрос Node.
Из статьи James M Snell's Update on ES6 Modules in Node.js (февраль 2017):
Работа ведется, но это займет некоторое время - в настоящее время мы рассчитываем на год, не меньше.
Пока поддержка не появится в Node, вам придется продолжать использовать классические операторы require
:
const express = require("express");
Если вы действительно хотите использовать новые возможности ES6/7 в NodeJS, вы можете скомпилировать его с помощью Babel. Вот'пример сервера.
К сожалению, Node.js пока не поддерживает ES6's import
.
Чтобы выполнить то, что вы пытаетесь сделать (импортировать модуль Express), достаточно следующего кода
var express = require("express");
Также, убедитесь, что у вас установлен Express, выполнив команду
$ npm install express
Дополнительные сведения об изучении Node.js см. в Node.js Docs.
Ошибка: SyntaxError: Неожиданная лексема import или SyntaxError: Неожиданная лексема экспорт
Решение: Измените все ваши импорты, как показано в примере
const express = require('express');
const webpack = require('webpack');
const path = require('path');
const config = require('../webpack.config.dev');
const open = require('open');
А также измените export default = foo;
на module.exports = foo;
.
Как уже упоминалось в других ответов узел с JS не'т поддерживать импорт на ES6.
(Как сейчас, читать правка 2)
Включить импорта ЕС6 в узел JS предоставляет решение этого вопроса. Я попытался это и он работал для меня.
Выполните команду:
npm install babel-register babel-preset-env --save-dev
Теперь вам нужно создать новый файл (config.js) и добавьте в него следующий код.
require('babel-register')({
presets: [ 'env' ]
})
// Import the rest of our application.
module.exports = require('./your_server_file.js')
Теперь вы можете писать операторы импорта, не получая каких-либо ошибок.
Надеюсь, что это помогает.
Редактировать:
Вам нужно запустить новый файл, который вы создали с выше код. В моем случае это было config.js
. Так что мне надо бежать:
node config.js
Редактировать 2:
Экспериментируя, я нашел простое решение этой проблемы.
Создать
.babelrcфайл
в корне вашего проекта.
Добавить следующее (и любой другой Бабеля пресетов необходимо, могут быть добавлены в этот файл):
{
"presets": ["env"]
}
Установите Вавилон-предустановки-ОКР
с помощью команды НПМ установить Бабель-предустановки-ОКР --` сохранить`, а затем установите `Вавилон-интерфейс командной строки, используя команду
НПМ установить Бабель-Кинк -г --сохранить
Теперь перейдите к папке, в которой существует ваш сервер или файл индекса и выполняется с помощью: Бабель-узел fileName.js
Или вы можете запустить с помощью НПМ старт
, добавив следующий код в ваш пакет
.JSON-файл``:
"scripts": {
"start": "babel-node src/index.js"
}
В случае, если вы все еще можете'т использовать на "импорт" и вот как я справился с этим: Просто перевести его на узел дружелюбный требуют. Пример:
import { parse } from 'node-html-parser';
Такой же как:
const parse = require('node-html-parser').parse;
если вы можете использовать 'Вавилон', попробуйте добавить скрипты сборки в пакет.формат JSON(--пресеты=es2015), как показано ниже. это делают для предварительной компиляции импортировать код в es2015
"build": "babel server --out-dir build --presets=es2015 && webpack"
предложение Бабель 7 вы можете добавить зависимости Дев
npm i -D @babel/core @babel/preset-env @babel/register
и добавить .babelrc в корень
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "current"
}
}
]
]
}
и добавить в .файл JS
require("@babel/register")
или если вы запустите его в командной строке, вы можете использовать требуют крюк -Р @Бабеля/зарегистрируйтесь, экс.
$node -r @babel/register executeMyFileWithESModules.js
Как Node.js В12 (и это, наверное, довольно стабильный, но до сих пор помечены "подопытные"), у вас есть несколько вариантов для использования ЭОР (еХМаОВсклепом мodules) в Node.js (для файлов, там'с третьего пути для evaling строк), здесь's что документация говорит:
в <цитата> <п>в <код>--опытно-модули</код> флаг может использоваться, чтобы включить поддержку Модули в ECMAScript (модулей Эс).</п> <п>после включения Node.js будем рассматривать следующие как ES модулей при передаче в <код>В узел</код> в качестве входных или когда ссылаются на <код>импорт</код> отчетность в Код модуля Эс:</п> &л;ул> <ли> <п>файлы, заканчивающиеся на <код>.mjs</код и GT;.</п> </ли> <ли> <п>файлы, заканчивающиеся на <код>.Яш</код> или без расширений файлов, когда ближайший родитель в <код>пакет.в JSON</код> файл содержит топ-уровне в <код>"и типа„</код> со значением в <код> По себе"модуля"</код и GT;.</п> </ли> <ли> <п>строки, переданные в качестве аргумента в <код>--ивала</код и GT; или <код>--печать</код> или передается в в <код>В узел</код> Через в <код>По почте</код>, с флагом в <код>--входной тип=модуль</код и GT;.</п> </ли> </ул> <п>Node.js будут лечить как на CommonJS всех других форм ввода, такие как <код>.Яш</код> файлы где ближайшие родителей в <код>пакет.в JSON</код> файл не содержит верхнего уровня в <код>"и типа„</код> поле или строку ввода без флага на <код>--ввод-тип</код>. Такое поведение является сохранение обратной совместимости. Однако, теперь, когда Node.js поддерживает CommonJS и модулей Эс, лучше быть явным, когда это возможно. Node.js будем рассматривать следующие на CommonJS, когда перешел в <код>В узел</код> в качестве входных, или когда ссылаются на <код>импорт</код> отчетность в Эс код модуля:</п> &л;ул> <ли> <п>файлы, заканчивающиеся на <код>.КВН</код и GT;.</п> </ли> <ли> <п>файлы, заканчивающиеся на <код>.Яш</код> или без расширений файлов, когда ближайший родитель в <код>пакет.в JSON</код> файл содержит топ-уровне в <код>"и типа„</код> со значением в <код>"и на CommonJS" и</код и GT;.</п> </ли> <ли> <п>строки, переданные в качестве аргумента в <код>--ивала</код и GT; или <код>--печать</код> или передается в в <код>В узел</код> Через в <код>По почте</код>, с флагом в <код>--входной тип=на CommonJS</код и GT;.</п> </ли> </ул> </цитата>
В моем случае это было после.файл babelrc, и он должен содержать что-то вроде этого:
{
"presets": ["es2015-node5", "stage-3"],
"plugins": []
}
Когда я начала с экспресс-всегда хотел решение, а не использовать импорт требует
константный экспресс = требуют (на"Экспресс" - а); // для ;экспресс на" импорт экспресс от "
Сколько времени ехать по этой линии: - к сожалению, Node.js не'т поддерживать ES6 в's пока импорт`.
Теперь, чтобы помочь другим создать здесь новые два решения
Гениально простое, Бабель-менее, связки-менее в ECMAScript модуль загрузчика.
позвольте's сделать его работу
пряжа добавить ЭОР / НПМ установить ЭОР
создать start.js или использовать пространства имен
требуют = требуют (и"эсм-то")(Модуль/* параметры*/) // Импорта остальные наши приложения. модуль.экспорт = требуют('./в src/сервер.Яш') // где server.js файл экспресс-запуска сервера
Изменения в пакете.путь пройти josn
о start.js
``
quot и;сценарии" по -: {
на "СТАРТ" и: "и узел запуска.Яш" и,
на "Пуск:Дев" и: "по nodemon начать.Яш" и,
},
на "зависимости" с: {
Это может быть разделить на 2 части
а) решения 1 Спасибо timonweb.com
б) решения 2
используйте Бабель 6 (старая версия Бабель-предустановки-Этап-3 ^6.0) создать `.файл babelrc в корневую папку
{ на "заготовки" ПО: [на"еже" и, "на этапе-3" и] }
Установите Бабель-предустановки-Этап-3
пряжа добавить Бабель-Бабель Кинк-полифилл Бабель-предустановки-ОКР bable-предустановки-Этап-3 nodemon --Дев
Изменения в пакете.в JSON
``
quot и;сценарии" по -: {
Запустить свой сервер
пряжа пуск / НПМ начать
Оооо нет, мы создаем новые проблемы
regeneratorRuntime.Марк(функция _callee(email, пароль) {
^
ReferenceError: regeneratorRuntime не определен
Эта ошибка приходит только тогда, когда вы использовать async/await в ваш код. Затем использовать полифилл, которая включает в себя пользовательский регенератор выполнения и ядра-Яш. добавить сверху `index.js`
импорт и"Бабель-полифилл"и
``
Это позволит вам использовать асинхронный/ждутиспользуйте Бабель 7
Нужно до даты каждая вещь в вашем проекте
давайте начнем с Вавилонской 7
.babelrc
{ на "заготовки" ПО: [на"@Бабеля/предустановка-ОКР" и] }
Некоторые изменения в пакет.в JSON
``
quot и;сценарии" по -: {
и использовать `импорт " у Бабеля/полифилл-то"@;` на точке старта
импорт и"@Бабеля/полифилл"и
импорт экспресс из 'Экспресс'
константный App = экспресс()//Получаем запрос
приложение.вам('/', асинхронный (req, действительно) {
// ждем операции
РЭС.отправить('Привет мир')
})
приложение.слушать(4000, () => В консоли.журнал('🚀 сервер прослушивает порт 400!'))
` Вы думаете почему старт:Дев
Серьезно. Это хороший вопрос, если вы новичок. Каждое изменение вы кабана с запустить сервер каждый раз затем используем пряжу старт:Дев` как сервер разработки каждого изменить сервер перезагрузится автоматически подробнее о nodemon
Я'м шокирован эсм
ничего'т было сказано. Этот небольшой, но могучий пакет позволяет использовать импорт
и требуют
.
*Установка ЭОР в ваш проект**
$ НПМ установки-сохранить эсм
Обновление вашего узла сценария начинают использовать ЭОР
узел -Р ЭОР app.js
эсм
просто работает. Я потратил кучу времени с .mjs
и --опытно-модули только для того, чтобы выяснить
.файл mjsне могу импортировать файл, который использует
требуется модульили
.экспорт. Это была огромная проблема, в то время как
эсмпозволяет смешивать и матч, и он только что это понял...
эсм` просто работает.