Некоторые непонятки с модулями JS
Я как то всегда считал, что модулями можно пользоваться только, если сама страница загружается с сервера по протоколу http(s), и ничего не будет работать, если страница находится на локальном компьютере и грузится по file://
Предполагается, что сами модули находятся на сервере и грузятся по http(s). Так и есть, если грузить модуль, как <script type="module" src="serverurl.srv/mymodul.mjs"></script> Возникает ошибка CORS. Но я с удивлением обнаружил, что все прекрасно работает, если грузить модуль так <script type="module"> import "serverurl.srv/mymodul.mjs"; </script> Страница по клику вызывается из файла, модули грузятся с сервера, все работает и никаких ошибок. Просто хотелось бы узнать, это недогляд браузеров, который когда-нибудь исправят, или так действительно можно? Где бы в доках об этом почитать. |
Это политика применяемая браузером (CORS).
Применяется она к любым запросам браузера а не только модулям. В интернете есть описание работы CORS по протоколу file:// |
Вопрос только, почему она применяется, когда я пытаюсь грузить через
<script> и не применяется, когда я гружу через import Может быть просто дело в том, что я проверял работу через сервер на localhost. Сейчас не имею возможности проверить работу при размещении модулей на другом сервере. |
>> и не применяется, когда я гружу через import
Возможно с ответом подскажет вкладка отладчика "сеть". Предположительно в одном варианте при загрузке по протоколу "file://" идет преобразование в абсолютный путь тут и выскакивает CORS а в другом варианте путь относительный и CORS пропускает. |
Цитата:
Я обнаружил следующее. Мой сервер на localhost передает заголовок Access-Control-Allow-Origin: "*" вместе с файлами .js и .mjs Но при загрузке методом <script type="module" src="http://localhost/tests/lm/modul1.mjs"></script> Возникает ошибка Access to script at 'http://localhost/tests/lm/modul1.mjs' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Это понятно. origin null не равен ничему. Но почему эта же ошибка не возникает, если грузить как <script type="module"> import "http://localhost/tests/lm/modul1.mjs"; </script> Если все заморочки с CORS вводились в целях какой то безопасности, то получается, что это дыра. Origin то все равно null Если сервер не передает заголовка Access-Control-Allow-Origin, то и второй способ заканчивается ошибкой. |
Вроде разобрался.
Это у меня были какие то ошибки при тестировании. Может сервер не перезагрузил после перенастройки. Если сервер дает заголовок Access-Control-Allow-Origin: "*", то модули нормально загружаются в любом случае. |
Часовой пояс GMT +3, время: 07:46. |