Import.meta.url выдает file:///, а не http://?

Я прочитал документы от import.meta.url, в которых говорится:

Полный URL-адрес модуля включает параметры запроса и/или хэш. (после ? или #). В браузерах это либо URL-адрес, с которого был получен скрипт (для внешних скриптов) или URL-адрес содержащий документ (для встроенных скриптов). В Node.js это файл путь (включая протокол file://).

Я создал простое приложение React с помощью этого кода:

console.info(import.meta.url); //here
export function App() {
  ...
  ...
  console.info(import.meta.url); //also here
  ...

Затем я создал ресурсы (js, css, html) с помощью сборки npm run (webpack и т. д.) и развернул их в контейнере Nginx Docker.

Однако, когда я запускаю код, я получаю следующее:

Вопрос:
Почему я вижу file:// вместо http://? Это не режим узла, а модуль (App.tsx) — это модуль.

  • Что делает веб-пакет (я знаю, что такое объединение), что он по-прежнему извлекает фрагменты js, и эти фрагменты по-прежнему отображаются file:///, когда они лениво извлекаются?

Если вы включили модуль, file:/// правильный – и соответствующего URL-адреса http:// все равно может не быть. Вам нужен этот модуль в отдельном файле для динамического импорта или чего-то еще? Как вы собираетесь использовать URL-адрес?

Ry- 17.05.2024 21:05

@Ry- Я не понимаю. файл index.html загружает файл сценария как обычный сценарий. так почему файл:// ?? Можете ли вы дать мне тестовый пример, где, если я изменю свой простой проект, я увижу http?

Royi Namir 17.05.2024 21:19

Современный JavaScript обычно имеет этап сборки, на котором модули разрешаются во время сборки и объединяются в один или несколько сценариев, поэтому сценарий, загружаемый браузером, не соответствует ровно одному входному модулю и может вообще не быть <script type = "module">. В вашем случае какой-то этап сборки обязателен, поскольку у вас есть (потенциал) TypeScript и JSX, которые браузер не понимает. Re: test: Я не хочу тратить время на поиск патча для процесса сборки React+TypeScript, пока он не решит проблему, которая у вас действительно есть,…

Ry- 17.05.2024 21:39

… но вы можете использовать <script type = "module">import … from "/foo.js";</script> + console.info(import.meta.url) в простом JavaScript в простом HTML-файле, чтобы увидеть на практике собственные модули ES.

Ry- 17.05.2024 21:40

@Ry-f Этот вопрос возникает из следующего сценария: у меня есть веб-сайт a.com, который загружает (микроинтерфейс) другой сайт b.com и этот b.com сайт должен не загружать свои собственные конфигурации (из своего (!) nginx). но он не знает, какой адрес nginx. (конечно, мы решили это с помощью параметров). но мне было интересно: если компонент b.com запущен, и я поместил туда import.meta.url, b.com сможет ЗНАТЬ, что его URL-адрес b.com. это сценарий

Royi Namir 17.05.2024 22: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) для оценки ваших знаний,...
0
5
239
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

По умолчанию Webpack заменит значение import.meta.url URL-адресом file: модуля во время сборки. Вы не указали, какую версию Webpack вы используете, но поддержка динамических import.meta.url значений была добавлена ​​в версиях >= 5.68.0 через PR 15246 в результате проблемы 14445.

Чтобы отключить замену import.meta.url Webpack во время сборки связанным file: URL-адресом модуля, обновите конфигурацию:

module: {
  parser: {
    javascript: {
      importMeta: false,
    },
  },
},

Вот документация по включению или отключению оценки import.meta во время сборки.

Вы можете увидеть пример конфигурации сборки, которая использует это и возвращает нужное значение import.meta.url: https://github.com/morganney/import-meta . Он также размещен на страницах GitHub по адресу https://morganney.github.io/import-meta/

Почему?

Это вопрос дизайна, и поэтому вам лучше задать его дизайнерам, однако я предложу возможную причину.

Webpack поддерживает различные цели. Одним из них является node, а Node.js поддерживает модули CommonJS и ES. В CommonJS нет эквивалента import.meta.url, который поддерживался до модулей ES, и, возможно, поэтому он по умолчанию переписан во время сборки, поскольку вы можете ориентироваться на среду CJS. Более того, вы можете ориентироваться на web, где некоторые браузеры не поддерживают собственные модули ES.

Другим упаковщикам, таким как rollup и swc, пришлось пройти аналогичный процесс обработки import.meta.url в различных контекстах. Таким образом, существуют параметры конфигурации, позволяющие указать Webpack, как обрабатывать import.meta.url во время сборки. Наличие явной опции для этого, вместо того, чтобы пытаться вывести все это из вашего target и/или browserslist файла, вероятно, было более надежным способом продолжить работу с более простым в обслуживании кодом, но вам следует спросить у сопровождающих более точную причину «почему». они выбрали этот дизайн.

Что делает веб-пакет, который по-прежнему извлекает фрагменты js, и эти фрагменты по-прежнему показывают file:///, когда они лениво извлекаются?

Это исходный код Webpack на GitHub. Ссылка на проблему, о которой я упоминал выше. Внутри lib/dependencies/importMetaPlugin.js: https://github.com/webpack/webpack/blob/main/lib/dependentities/ImportMetaPlugin.js#L99

webpackversion (в node_modules): «версия»: «5.90.0»,

Royi Namir 21.05.2024 12:20

Вопрос: почему - «По умолчанию Webpack заменит значение import.meta.url файлом модуля:»? я имею в виду, что если у меня есть 5 блоков, загружаемых динамически, и в каждом из них есть модули с console.info(import.meta.url), то почему это отображается как file://? по сути ЕСТЬ HTTP-запрос. так что я действительно не понимаю, что здесь происходит и почему

Royi Namir 21.05.2024 13:40

Я добавил пример на GitHub: morganney.github.io/import-meta

morganney 22.05.2024 01:28

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