Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Некоторые непонятки с модулями JS (https://javascript.ru/forum/misc/84325-nekotorye-neponyatki-s-modulyami-js.html)

voraa 06.08.2022 18:03

Некоторые непонятки с модулями 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>


Страница по клику вызывается из файла, модули грузятся с сервера, все работает и никаких ошибок.

Просто хотелось бы узнать, это недогляд браузеров, который когда-нибудь исправят, или так действительно можно? Где бы в доках об этом почитать.

MallSerg 06.08.2022 18:46

Это политика применяемая браузером (CORS).
Применяется она к любым запросам браузера а не только модулям.
В интернете есть описание работы CORS по протоколу file://

voraa 06.08.2022 19:22

Вопрос только, почему она применяется, когда я пытаюсь грузить через
<script> и не применяется, когда я гружу через import

Может быть просто дело в том, что я проверял работу через сервер на localhost.
Сейчас не имею возможности проверить работу при размещении модулей на другом сервере.

MallSerg 06.08.2022 21:10

>> и не применяется, когда я гружу через import

Возможно с ответом подскажет вкладка отладчика "сеть".
Предположительно в одном варианте при загрузке по протоколу "file://" идет преобразование в абсолютный путь тут и выскакивает CORS а в другом варианте путь относительный и CORS пропускает.

voraa 06.08.2022 22:03

Цитата:

Сообщение от MallSerg
Предположительно в одном варианте при загрузке по протоколу "file://" идет преобразование в абсолютный путь тут и выскакивает CORS а в другом варианте путь относительный и CORS пропускает.

Везде путь абсолютный с http://... . Как он может быть относительным, если html в локальной системе, а модули на сервере?

Я обнаружил следующее. Мой сервер на 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, то и второй способ заканчивается ошибкой.

voraa 06.08.2022 23:52

Вроде разобрался.
Это у меня были какие то ошибки при тестировании. Может сервер не перезагрузил после перенастройки.
Если сервер дает заголовок Access-Control-Allow-Origin: "*", то модули нормально загружаются в любом случае.


Часовой пояс GMT +3, время: 07:46.