протокол

учаю эту ошибку:

Не удалось загрузить скрипт модуля: сервер ответил не MIME-типом не-JavaScript "". Строгая проверка типов MIME применяется для скриптов модулей в соответствии со спецификацией HTML.

Проект запускается из локальных файлов, например:file:///D:/path/project.html.

Работает без проблем в Firefox, но не работает в Google Chrome. Я хочу проверить это таким образом в целях разработки - это удобнее, чем создавать сервер и запоминать, на каком порту он находится.

 Tomáš Zato21 нояб. 2017 г., 02:18
Тогда возникает вопрос: как отключить эту проверку для локальных файлов?
 Tomáš Zato21 нояб. 2017 г., 02:12
Конечные пользователи получают страницу, заполненную веб-пакетом. Но для меня удобнее всего тестировать с файлами. Я могу запустить сервер python или node.js, я просто не хочу.
 Dr. Pain25 мая 2018 г., 19:07
Я не думаю, что вы когда-нибудь получили ответ на этот вопрос? Я хотел бы иметь обходной путь.
 loganfsmyth21 нояб. 2017 г., 01:47
Вам нужно настроить локальный HTTP-сервер. Использование файла: URL-адреса никогда не являются хорошей идеей, потому что они не могут вести себя как настоящая страница.
 Kaiido21 нояб. 2017 г., 02:14
На самом деле, я только что попробовал и .. вы не сталкиваетесь с этим ограничением того же происхождения. Это похоже на сообщение об ошибке: они строго проверяют тип js MIME, а ваша файловая система их не предоставляет.

Ответы на вопрос(4)

стандартная политика того же происхождения ограничения, которые применяются браузерами и имеют множество других ограничений безопасности, в то время как файлы «сценариев» JavaScript имеют гораздо более слабую защиту, чтобы избежать взлома существующих веб-сайтов, так как с течением времени в браузеры были добавлены лучшие стандарты безопасности. Вы нажимаете один из них, то есть файлы должны быть отправлены с правильным типом MIME.

file:// URL-адреса не являются обычными HTTP-запросами, и поэтому имеют разные правила для запросов. Там также почти нет правил для того, какой тип MIME должен быть отправлен. Если вы хотите использовать модули ES6, вам нужно локально запустить настоящий HTTP-сервер для обслуживания ваших файлов.

 loganfsmyth21 нояб. 2017 г., 02:23
Я не верю, что у вас есть другой выбор, кроме как запустить сервер.
 Tomáš Zato21 нояб. 2017 г., 02:13
Я спрашивал о возможных флагах / опциях разработки, которые позволили бы мне тестировать файлы без сервера.
 Michael Fulton24 янв. 2019 г., 05:28
Я использую SimpleHTTPServer на Python. Почему этого недостаточно?

У меня была инструкция import, переносящая объект из другого файла, что я и сделал через эту строку:

import { Cell } from './modules/Cell';

Что сломало код и вызвало ошибку типа MIME не было.js добавлен в конец./modules/Cell.

Обновленная строка исправила мою проблему:

import { Cell } from './modules/Cell.js';

 Jay Gould01 июл. 2018 г., 11:56
@Джона, да, в прошлом это имело смысл, но я сошел с ума, пытаясь понять это.
 Karla Danitza Duran Memijes20 сент. 2018 г., 07:24
JayGould здорово !, я сходил с ума ни от чего, говоря так, что это понятно. @Jona, это имеет смысл для меня, Гений!
 Tom Russell11 янв. 2019 г., 08:49
К счастью, консоль браузера выдала мне полезное сообщение об ошибке, поэтому мне не пришлось тратить час на поиск этого решения. Не! Кстати, я использую HTTP-сервер (Python2).
 Jona01 июл. 2018 г., 00:03
Ух ты. Ага. Прямо здесь. Имеет смысл также, потому что это явно говорит ему, какой тип модуля импорта
 Jona01 июл. 2018 г., 13:05
Хаха, я рад, что ты нашел это, прежде чем я наткнулся на тот же вопрос: p

Вы можете установитьModuleSpecifier кdata URI

<script type="module">
  import {Test} from "data:application/javascript,const%20Mod={this.abc=123};export%20{Mod};";
  console.log(Test);
</script>

установитьModuleSpecifier программно вы можете запустить Chromium / Chrome с помощью--allow-file-access-from-files помечать и использоватьXMLHttpRequest() запросить файл JavaScript уfile: протокол

<script>
(async() => {

  const requestModule = ({url, dataURL = true}) => 
    new Promise((resolve, reject) => {
      const request = new XMLHttpRequest();
      const reader = new FileReader();
      reader.onload = () => { resolve(reader.result) };
      request.open("GET", url);
      request.responseType = "blob";
      request.onload = () => { reader[dataURL ? "readAsDataURL" : "readAsText"](request.response) };
      request.send();
   })

  let moduleName = `Mod`;
  // get `Mod` module
  let moduleRequest = await requestModule({url:"exports.js"});
  // do stuff with `Mod`; e.g., `console.log(Mod)`
  let moduleBody = await requestModule({url:"ModBody.js", dataURL: false}); 
  let scriptModule = `import {${moduleName}} from "${moduleRequest}"; ${moduleBody}`;
  let script = document.createElement("script");
  script.type = "module";
  script.textContent = scriptModule;
  document.body.appendChild(script);

})();
</script>
Решение Вопроса

это означает, что это не проблема того же происхождения.

Как сказано в сообщении об ошибке, реальная проблема заключается в том, что скрипты модулей требуют, чтобы MIME вашего файла скриптов был одним из типов MIME javascript.

Ваша файловая система не предоставляет MIME, поэтому загрузка не удалась.

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

Но так как вы настаиваете;) Один из обходных путей - сначала получить файл сценария как Blob с помощью XHR (fetch не может быть использован наfile:// протокол), а затем заставить егоtype свойство быть одним из JIM MIMEs, и установите свой<script>src к blobURI, подбирающему к этому Blob.

// requires to start chrome with the --allow-file-access-from-file flag
var xhr = new XMLHttpRequest();
xhr.onload = e => {
    let blob = xhr.response;
    blob.type = 'application/javascript'; // force the MIME
    moduleScript.src = URL.createObjectURL(blob);
};
xhr.open('get', "yourmodule.js");
xhr.responseType = 'blob';
xhr.send();

НОвы не сможетеimport любые зависимости внутри вашего модуля.

 SeanKPS27 янв. 2019 г., 17:57
Что делать, если вы запускаете это на локальном сервере и по-прежнему получаете эту проблему?
 Kaiido21 нояб. 2017 г., 02:47
@ TomášZato обратите внимание, что это может быть возможно черезхром сценарии (расширение), чтобы заставить MIME в таких случаях, используяAPI webRequest, но я не знаю этого достаточно, чтобы показать, как именно ...
 Tomáš Zato21 нояб. 2017 г., 02:32
Это на самом деле не помогает, но слава для обходного пути. Может пригодиться в других ситуациях ...

Ваш ответ на вопрос