Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.08.2022, 18:03
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

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


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

Просто хотелось бы узнать, это недогляд браузеров, который когда-нибудь исправят, или так действительно можно? Где бы в доках об этом почитать.
Ответить с цитированием
  #2 (permalink)  
Старый 06.08.2022, 18:46
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

Это политика применяемая браузером (CORS).
Применяется она к любым запросам браузера а не только модулям.
В интернете есть описание работы CORS по протоколу file://
Ответить с цитированием
  #3 (permalink)  
Старый 06.08.2022, 19:22
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

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

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

Последний раз редактировалось voraa, 06.08.2022 в 19:45.
Ответить с цитированием
  #4 (permalink)  
Старый 06.08.2022, 21:10
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

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

Возможно с ответом подскажет вкладка отладчика "сеть".
Предположительно в одном варианте при загрузке по протоколу "file://" идет преобразование в абсолютный путь тут и выскакивает CORS а в другом варианте путь относительный и CORS пропускает.
Ответить с цитированием
  #5 (permalink)  
Старый 06.08.2022, 22:03
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Сообщение от 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 в 22:19.
Ответить с цитированием
  #6 (permalink)  
Старый 06.08.2022, 23:52
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
BackEnd/FrontEnd Developer (Native JS) Abab Работа 0 25.12.2016 10:56
Удалить некоторые ссылки со страницы при помощи js goga5 Общие вопросы Javascript 7 12.07.2016 14:41
js стиль render для react.js vflash Ваши сайты и скрипты 5 01.04.2016 22:57
Вакансия JavaScript разработчик / JS / Frontend developer (Санкт-Петербург) Сергей Грачёв Работа 0 21.09.2015 12:31
Картинка обрабатывается js 4yBaK Общие вопросы Javascript 10 11.09.2011 09:28