SyntaxError: Неможливо використовувати оператор імпорту поза модулем


52

У мене є проект ApolloServer, який доставляє мені проблеми, тому я подумав, що можу оновити його і зіткнувся з проблемами при використанні останнього Babel. Мій "index.js":

require('dotenv').config()
import {startServer} from './server'
startServer()

І коли я запускаю його, я отримую помилку "SyntaxError: Неможливо використовувати оператор імпорту поза модулем". Спершу я намагався робити щось, щоб переконати TPTB *, що це модуль (без успіху). Тому я змінив "імпорт" на "вимагати", і це спрацювало.

Але зараз у мене є близько двох десятків "імпортів" в інших файлах, що дає мені таку ж помилку.

* Я впевнений, що корінь моєї проблеми полягає в тому, що я навіть не впевнений, що скаржиться на це питання. Я начебто припускав, що це Babel 7 (оскільки я приходжу з Babel 6 і мені довелося змінити попередньо встановлені налаштування), але я не впевнений на 100%.

Більшість того, що я знайшов для рішень, схоже, не стосується прямого Вузла. Як ось цей:

Модуль ES6 Імпорт, що дає "Uncaught SyntaxError: Несподіваний ідентифікатор"

Каже, це було вирішено шляхом додавання "type = module", але це, як правило, входить у HTML, у мене якого немає. Я також спробував використовувати старі пресети свого проекту:

"presets": ["es2015", "stage-2"],
"plugins": []

Але від мене виникає ще одна помилка: "Помилка. Файли плагінів / попередніх налаштувань не можуть експортувати об'єкти, а лише функції."

ОНОВЛЕННЯ: Ось залежності, з яких я почав:

"dependencies": {
"@babel/polyfill": "^7.6.0",
"apollo-link-error": "^1.1.12",
"apollo-link-http": "^1.5.16",
"apollo-server": "^2.9.6",
"babel-preset-es2015": "^6.24.1",

1
Привіт, у мене зараз така ж проблема. Чи можете ви також поділитися своїми залежностями? Можливо, навіть різниця до та після оновлення. Я міг би проти моєї перевірити, чи зможемо ми знайти подібні пакети, які можуть викликати проблеми.
рись

Я просто замінив увесь "імпорт" на "вимагає" і все зараз добре. Тупий, але не варто було намагатися розібратися зараз. Я оновлю оригінал залежно від цього. Якщо ви отримаєте будь-які потенційні клієнти, я перевіряю їх у порівнянні зі своїм оригінальним кодом.
користувач3810626

1
Синтаксис CommonJS (вимагає і module.exports) був оригінальним форматом для вузла, а webpack також підтримує його, але синтаксис модуля ES6 (експорт, імпорт) - це новіший спосіб, і тепер його підтримують вузол та вебпакет. Я читав, що вузол підтримує імпорт зараз, але так багато підручників показують, що потрібні чисті матеріали вузла, що, ймовірно, краще використовувати цей синтаксис для вузла.
Тед Фіцпатрік

1
Нарешті, для мене шлях , здавалося, це: github.com/vuejs/vue-jest/issues/134#issuecomment-461755061 Установка встановлене в jest.config.jsдо 'ts-jest/presets/js-with-ts'- до сих пір деякі інші питання , але вирішити це один великий. ..... так, моя проблема була в тестуванні пов'язаних ... нормальні збірки були нормальні
рись

Рись, Цікаво. Я не використовую Jest. Тед, цікаво. Гаразд, я не буду його потіти.
користувач3810626

Відповіді:


50

Оновлення 2020 року (вузол 13.2.0+)

Переконайтеся, що у вас встановлена ​​остання версія вузла. Чи не --experimental-modulesпрапор більше не потрібен. Просто виконайте одне з наступних дій :

  • Додати "type": "module"до найближчого батька package.json. При цьому всі .jsта .mjsфайли інтерпретуються як модулі ES. Ви можете інтерпретувати окремі файли як CommonJS, використовуючи .cjsрозширення.

АБО

  • Явно називають файли з .mjsрозширенням. Усі інші файли, наприклад, .jsбуде інтерпретовано як CommonJS, що є типовим, якщо typeне визначено в package.json.

Якщо я використовую це, то змініть шлях, щоб включити "js" для потрібного файлу, а потім змінити формат експортних виписок у потрібному файлі, а потім візьміть усі зміни "вимагати", які я змінив з "імпорту" - тому що тепер "вимагати" невідомо - це спрацює, тому я прийму цю відповідь.
користувач3810626

2
Це насправді не варіант, якщо проблема знаходиться під node_modules / правда? Будь-які ідеї, як виправити в такому випадку?
Трент Бінг

18

Відповідно до офіційного документа ( https://nodejs.org/api/esm.html#esm_code_import_code_statements ):

заяви про імпорт дозволені лише в модулях ES. Для подібної функціональності у CommonJS див. Import ().

Для того, щоб Node розглядав ваш файл як модуль ES, вам потрібно ( https://nodejs.org/api/esm.html#esm_enabling ):

  • додайте "type": "module" в package.json
  • додати у виклик вузла прапор "--experimental-module"

6

У мене була та сама проблема, і її виправлено наступне (за допомогою вузла 12.13.1):

  • Змініть розширення файлів .js на .mjs
  • Додайте прапор - експериментальні модулі після запуску програми.
  • Необов’язково: додайте "type": "module" у свій package.json

більше інформації: https://nodejs.org/api/esm.html


0

У мене була ця проблема у новому проекті Express API.

Код сервера, який порушує src/server/server.js:

import express from 'express';
import {initialDonationItems, initialExpenditureItems} from "./DemoData";

const server = express();

server.get('/api/expenditures', (req, res) => {
  res.type('json');
  res.send(initialExpenditureItems);
});

server.get('/api/donations', (req, res) => {
  res.type('json');
  res.send(initialDonationItems);
});

server.listen(4242, () => console.log('Server is running...'));

Тут були мої залежності:

{
  "name": "contributor-api",
  "version": "0.0.1",
  "description": "A Node backend to provide storage services",
  "scripts": {
    "dev-server": "nodemon --exec babel-node src/server/server.js --ignore dist/",
    "test": "jest tests"
  },
  "license": "ISC",
  "dependencies": {
    "@babel/core": "^7.9.6",
    "@babel/node": "^7.8.7",
    "babel-loader": "^8.1.0",
    "express": "^4.17.1",
    "mysql2": "^2.1.0",
    "sequelize": "^5.21.7",
    "sequelize-cli": "^5.5.1"
  },
  "devDependencies": {
    "jest": "^25.5.4",
    "nodemon": "^2.0.3"
  }
}

І ось бігун, який кинув помилку:

nodemon --exec babel-node src/server/server.js --ignore dist

Це засмучувало, оскільки у мене був подібний проект Express, який працював чудово.

Рішенням було спочатку додати цю залежність:

npm install @babel/preset-env

А потім з'єднати його з використанням babel.config.jsв корені проекту:

module.exports = {
  presets: ['@babel/preset-env'],
};

Я не повністю розумію, чому це працює, але скопіював це з авторитетного джерела , тому я радий дотримуватися цього.


-2
  1. У мене була така ж проблема, коли я почав використовувати бабел ... Але пізніше у мене було рішення ... У мене вже не було проблеми до цих пір ... В даний час Node v12.14.1, "@ babel / node" : "^ 7.8.4", я використовую babel-вузол та nodemon для виконання (вузол також добре.)
  2. package.json: "start": "nodemon --exec babel-node server.js" debug ":" babel-node debug server.js "!! Примітка: server.js - це мій вхідний файл, ви можете використовувати свій.
  3. start.json При відладці вам також потрібно налаштувати файл start.json "runtimeExecutable": "$ {workspaceRoot} /node_modules/.bin/babel-node" !! Примітка: плюс runtimeExecutable у конфігурацію.
  4. Звичайно, за допомогою вузла babel-вузла вам також зазвичай потрібен і редагувати інший файл, наприклад файл babel.config.js / .babelrc

-2

Моє рішення полягало в тому, щоб включити шлях до вузла під час виконання nodemon таким чином:

nodemon node_modules/.bin/babel-node index.js

ви можете додати в свій script.json скрипт як:

debug: nodemon node_modules/.bin/babel-node index.js

ПРИМІТКА: Мій вхідний файл є index.js замініть його на ваш вхідний файл (у багатьох є app.js / server.js).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.