Импорт не работает в Chrome

Я создаю одностраничное приложение на ванильном JavaScript. Я хочу организовать свой код в разных файлах, чтобы сделать его модульным, а это значит, что я должен иметь доступ к функциям, определенным в одном файле, в другом файле. Для этого я использую собственный importexport ES6:

файл-1.js:

export function func1() {}
export function func2() {}

файл-2.js:

import { func1, func2 } from './file-1';

index.html:

<script src = "file-1.js"></script>

Когда я запускаю index.html в Chrome (версия 65), я получаю следующую ошибку: Uncaught SyntaxError: Unexpected token {.

Что не так в моем коде? Chrome 65 полностью поддерживает модульную систему ES6.

import { func1, func2 } from './file-1'; вы пропустили рывок
Cuong Vu 08.04.2018 16:26

Это была опечатка. Исправлено здесь. Я правильно упомянул имя файла в моем фактическом коде.

darKnight 08.04.2018 16:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
16
2
25 475
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот рабочий пример

file1.mjs

function log1() {
  console.info('log1');
}
function log2() {
  console.info('log2');
}
export { log1, log2 };

file2.mjs вы должны явно написать расширение .mjs

import { log1, log2 } from './file1.mjs';

log1();
log2();

index.html Атрибут уведомления type = "модуль"

<body>
    <script type = "module" src = "file2.mjs"></script>
</body>

Тогда вам понадобится статический сервер, чтобы избавиться от блока CORS.

$ yarn global add serve
$ serve ./

Наконец перейдите к http://localhost:5000, и он будет работать

Обновление: Для модулей рекомендуется использовать расширение файла .mjs вместо .js.

Где здесь на самом деле происходит CORS? У меня есть все из вашего ответа, кроме последней части (статический сервер), и я даже не вижу, чтобы запрос на мой модуль (file2.js) вообще происходил.

croraf 09.11.2018 15:21

Что-то изменилось внутри Chrome, теперь он даже больше не уведомляет блок CORS на вкладке консоли. Я не уверен, но, возможно, в протоколе Chrome file: // есть определенные правила, чтобы запросы не отображались в Chrome Dev Tools. Но вы всегда должны использовать локальный сервер для работы с Javascript в браузере, чтобы вы могли копировать настоящий веб-сайт во время разработки.

Cuong Vu 09.11.2018 16:23

При использовании сервера синтаксис «импорта» действительно работает. Спасибо. Как вы думаете, где происходит CORS в приведенном выше случае?

croraf 09.11.2018 16:58

Как я уже сказал, в некоторых предыдущих версиях Chrome он явно уведомлял о проблеме на вкладке ПРИСТАВКА при использовании протокола file://.

Cuong Vu 09.11.2018 17:00

Вам не нужно использовать расширение .mjs, как вы упомянули в редактировании. Я делаю это на Chrome с помощью .js, используя сервер. Что касается CORS, я теперь вижу статьи о том, что протокол "file: //" может вызывать проблемы CORS в некоторых браузерах. К сожалению, если CORS действительно является проблемой, очень жаль, что в консоли больше нет предупреждений.

croraf 09.11.2018 17:08

Получил ту же проблему. Включив type = 'module', такую ​​важную вещь, чтобы заставить его работать, запустите локальный сервер для использования протокола http: //, а не file: // one, потому что политика CORS блокирует выполнение вашего файла в Chrome v70 + Access to script at 'file:///*.js' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.

Khoa Nguyen 07.09.2019 11:50

Chrome (v70) имеет некоторые проблемы при работе с синтаксисом import для локальных файлов, обслуживаемых по протоколу file. Согласно некоторым статьям, это, вероятно, блокировка CORS, которая может произойти с использованием протокола file. Но в этом случае Chrome также не показывает предупреждение CORS в консоли - что странно. Поэтому необходим какой-то HTTP-сервер, чтобы файлы обслуживались по протоколу HTTP (как показал Ву в своем ответе). Firefox v63 (вероятно,> v60) не имеет этих проблем, и вы можете собрать html с модулями js, используя протокол file://, без специального сервера.

Также убедитесь, что:

  • при импорте используйте расширения типов файлов (import { func1, func2 } from './file-B.js';).

  • использовать type = "module" в HTML-элементе script (<script type = "module" src = "file-A.js"></script>)

На самом деле мы можем игнорировать политику CORS браузера, например Как запустить HTML в Chrome в режиме «--allow-file-access-from-files» @croraf

Khoa Nguyen 07.09.2019 12:34

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