Как получить глобальную функцию, распознаваемую моим файлом JS, загруженным через AJAX? - PullRequest
0 голосов
/ 26 мая 2018

Я запутался в областях в Javascript и в том, как получить глобальную функцию, распознаваемую.На моей странице я определил

<script src="base64.js"></script>

.Затем в другом файле у меня есть

var xhr = new XMLHttpRequest;
...
        var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
            alert(Base64.decode("abc"));
        xhr.open("get", full + "myotherfile.js", true);
        xhr.send()

Предупреждение выполняется без проблем.Однако в «mytoherfile.js» ссылки на класс Base64 приводят к RerefernceError.Поэтому в верхней части моего myotherfile.js я попытался

import {Base64} from 'base64';

, но это приводит к ошибке «Uncaught SyntaxError: Unexpected token {».Как правильно включить распознавание моей глобальной функции в файле JS, загруженном через AJAX?

Редактировать: Загруженный удаленный файл JS загружается с использованием

this.worker = new Worker(xhrResponseText);

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Скрипты, загруженные на главную страницу, недоступны для веб-работников, их необходимо импортировать с помощью importScripts, а не команды импорта

importScripts("base64.js");
0 голосов
/ 07 июня 2018

Проблема связана с указанным вами путем.Вот допустимые пути в модуле типа.

// Supported:
import {foo} from 'https://jakearchibald.com/utils/bar.js';
import {foo} from '/utils/bar.js';
import {foo} from './bar.js';
import {foo} from '../bar.js';

// Not supported:
import {foo} from 'bar.js';
import {foo} from 'utils/bar.js';

Попробуйте напрямую обратиться к пути.как-то так

import {addTextToBody} from '../../someFolder/someOtherfolder/utils.js';

здесь допустимы pathName

Starts with ./  :- same folder
Starts with ../ :- Parent folder
Starts with ../../ :- above parentfolder
0 голосов
/ 26 мая 2018

В старомодных (немодульных) файлах javascript глобальные переменные должны создаваться в окне.Таким образом, в первом примере Base64.decode("abc") совпадает с window.Base64.decode("abc").Однако в модулях это не так.Если вы хотите получить доступ к глобальной переменной в окне, это должно быть сделано явно.

В модуле попробуйте изменить ссылку на Base64 на window.Base64.

Sidenote: Еслифайл base64.js работает с базовым импортом тега скрипта, тогда он не будет работать как модуль es6, как вы сделали (import {Base64} from 'base64';).Вы можете прочитать больше о том, как импортировать модули здесь !

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

Обновление

Для ясности, вот пара примеров.По сути, все, что вы помещаете в фигурные скобки ({ Base64}), должно быть экспортировано из импортируемого скрипта, а не помещено в окно.

<script src=".../base64.js"></script>

<script>
  // both are accessible this way because this is NOT a module
  // and global variables are assumed to be on the window.
  console.log(Base64);
  console.log(window.Base64);
</script>

<script type="module">
  // Will not work:
  // import { Base64 } from ".../base64.js
  // import { window.Base64 } from ".../base64.js

  // The same as importing view the script tag
  // (not needed because the script tag already imported it)
  // import ".../base64.js"

  // the "global variable" is accessible on the window
  console.log(window.Base64)
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...