Модуль Javascript не работает в браузере?

Хорошо, я посмотрел на этом сайте и нашел несколько разных ответов, ни один из которых не работал для меня. В основном имелся файл js, в котором было много функций, а также основной код приложения. Я хотел переместить все свои функции в другой файл js, чтобы немного очистить свой код. Я новичок в js, но я знаю, что в python это было так же просто, как сказать "import (module) as (nickname) from (path)"

В любом случае, допустим, у меня есть функция с именем show message в моем модуле functions.js.

export function show_message(){
    alert("Hello");
}

а потом я в верхней части моего файла main.js я сделал

import { show_message } from './functions.js'
//I have also tried to import like this:
import * as func from './functions.js'

//And then I call it
show_message();
//I have also tried
func.show_message();

Я знаю, что это что-то простое, но, как я сказал везде, где я смотрел, я видел разные ответы, ни один из которых не работает для меня. Я использую Firefox, кстати. Я также получаю сообщение об ошибке в консоли, в котором говорится, что мои объявления импорта должны быть в верхней части моего модуля, я исправил это, указав тип в моей ссылке HTML (script src= "/static/main.js" type = " module ") Ошибка исчезла, но теперь говорится, что" та же самая политика происхождения запрещает чтение удаленного ресурса в файле (путь) (причина: запрос cors не HTTP). "

А другая ошибка гласит: "URI источника модуля не разрешен в этом документе".

что заставляет меня думать, что мой синтаксис для импорта правильный, и ошибка в моем HTML-коде?

Любая помощь приветствуется.

Ответы

Ответ 1

В теге скрипта, который вы используете для загрузки js в браузер, вам нужно добавить атрибут

type="module"

Это будет выглядеть следующим образом:

<script type="module">
  import {addTextToBody} from './utils.mjs';

  addTextToBody('Modules are pretty cool.');
</script>

utils.mjs:

export function addTextToBody(text) {
  const div = document.createElement('div');
  div.textContent = text;
  document.body.appendChild(div);
}

Это если вы не используете такой пакет, как веб-пакет, а работаете непосредственно в браузере.

Источник кода: https://jakearchibald.com/2017/es-modules-in-browsers/

Ответ 2

Подумайте о том, чтобы пройти через этот URL-адрес, некоторые расширения могут вызывать проблемы с загрузкой модулей:

Этот блог может быть ответом на то, что вы ожидаете.

Сначала вы должны проверить, принимает ли браузер type = "module", и использовать резервный вариант, если это не нравится:

<script type="module" src="module.mjs"></script>
<script nomodule src="fallback.js"></script>

Это может быть основной причиной ошибки CORS, как написано здесь:

В отличие от обычных скриптов, скрипты модуля (и их импорт) выбираются с помощью CORS. Это означает, что сценарии модуля с несколькими источниками должны возвращать действительные заголовки CORS, такие как Access-Control-Allow-Origin: *

Поэтому вам нужно добавить CORS-заголовок в файл модуля

Рассмотрите этот блог для проблемы CORS. Вы должны добавить заголовок CORS т.е. Access-Control-Allow-Origin: * к конфигурации сервера наиболее вероятно.

Ответ 3

function show_message(){
    alert("Hello");
}

export { show_message };

а также

import { show_message } from './functions'

Я думаю, что это должно сработать. это именованный метод экспорта/импорта. под этим именем вы можете найти больше информации, если хотите.

Ответ 4

Вы можете использовать вместо этого broswerify. Он позволяет вам писать модули в стиле NodeJS, а затем компилировать их в один удобный для JavaScript файл JavaScript, что позволяет вам получить все преимущества производительности при загрузке только одного файла. Это также означает, что вы можете легко использовать один и тот же код как на стороне сервера, так и на стороне клиента.

Если вы хотите придерживаться отдельных файлов, похоже, вы уже в пути. В отличие от обычных файлов JavaScript, на модули распространяются ограничения общего доступа к ресурсам (CORS). Они должны быть загружены из одного источника и не могут быть загружены из локальной файловой системы. Если вы загружаете их из локальной файловой системы, перенесите их на сервер. Если вы уже размещаете их на сервере, добавьте заголовок Access-Control-Allow-Origin: * к ответу, который обслуживает файл модуля.

Много больше ошибок и решений здесь и здесь.

Ответ 5

У JavaScript уже давно есть модули. Однако они были реализованы через библиотеки, а не встроены в язык, т.е. вы не можете импортировать или экспортировать часть этих модулей в ваши js файлы (необходимо загрузить целую библиотеку). ES6 - это первый раз, когда JavaScript имеет встроенные модули.

Пожалуйста, обратитесь сюда для получения дополнительной информации о модулях ES.

Но все изменилось, и модули ES теперь доступны в браузерах! Они в...

Safari 10. 1+, Chrome 6 1+, Firefox 60+, Edge 16+ и т.д.

Теперь вам нужно создать JS файл с новым расширением.mjs, например,

// utils.mjs
export function addTextToBody(text) {
  const div = document.createElement('div');
  div.textContent = text;
  document.body.appendChild(div);
}

а затем вы можете импортировать этот файл на свою HTML-страницу, как,

<script type="module">
 import {addTextToBody} from './utils.mjs';

 addTextToBody('Modules are pretty cool.');
</script>

Пожалуйста, обратитесь сюда для получения дополнительной информации об использовании модуля ES в браузерах.

Ответ 6

Использование модулей JS в браузере В Интернете вы можете указать браузерам обрабатывать элемент как модуль, установив атрибут type в module.

<script type="module" src="main.mjs"></script>
<script nomodule src="fallback.js"></script>

Подробнее на https://developers.google.com/web/fundamentals/primers/modules

Ответ 7

Если вы используете webpack и babel и хотите импортировать код в ваш пакет, я думаю, это должно быть одно из следующих:

export default function show_message(){
    alert("Hello");
}

а затем в вашем коде:

import show_message from 'path/to/show_message.js'
// or 
import { default as someOtherName } from 'path/to/show_message.js'

Или, если вы хотите экспортировать несколько функций:

const show_message = function(){
    alert("Hello");
}
export { show_message };

а затем в вашем коде:

import { show_message } from 'path/to/show_message.js'
// or 
import { show_message as someOtherName } from 'path/to/show_message.js'

Надеюсь, это поможет.