Как импортировать немодульный(!) JavaScript в Polymer 3.0

Polymer 3 использует импорт для загрузки внешнего Javascript. Например

import {GoogleCharts} from 'google-charts';

Однако, чтобы это работало, внешняя библиотека должна использовать экспорт.

Я пытаюсь использовать библиотеку mapbox-gl.js. Эта библиотека, установленная с помощью:

npm install mapbox-gl

вроде ничего не экспортирует.

В HTML5 вы можете использовать mapbox-gl следующим образом:

<script src="node_modules/mapbox-gl/dist/mapbox-gl.js"></script>
<link href="node_modules/mapbox-gl/dist/mapbox-gl.css" rel="stylesheet" />
<script>
   const options = {...}
   const map = new mapboxgl.Map(options);
</script>

Я попытался использовать «импорт» для загрузки mapbox-gl:

import {mapboxgl} from './node_modules/mapbox-gl/dist/mapbox-gl.js';
import mapboxgl from './node_modules/mapbox-gl/dist/mapbox-gl.js';

Это не работает:

Uncaught SyntaxError: The requested module './node_modules/mapbox-gl/dist/mapbox-gl.js' does not provide an export named 'mapboxgl'
Uncaught SyntaxError: The requested module './node_modules/mapbox-gl/dist/mapbox-gl.js' does not provide an export named 'default'

Итак, затем я попытался добавить скрипт и css в document.head изнутри модуля javascript (<script type="module">..</script>):

// load external mapbox-gl.js script
const mapboxgljs = document.createElement('script');
mapboxgljs.setAttribute('src', 'node_modules/mapbox-gl/dist/mapbox-gl.js');
document.head.appendChild(mapboxgljs);
// load external mapbox-gl.css 
const mapboxcss = document.createElement('link');
mapboxcss.setAttribute('href', 'node_modules/mapbox-gl/dist/mapbox-gl.css');
mapboxcss.setAttribute('rel', 'stylesheet');
document.head.appendChild(mapboxcss);

Это тоже не работает. Если я попытаюсь использовать mapbox следующим образом:

const map = new mapboxgl.Map(options)

Я получаю:

Uncaught ReferenceError: mapboxgl is not defined

Изменить:

Комментаторы @Salketer и @barbsan показали правильный синтаксис импорта для такой библиотеки:

import 'node_modules/mapbox-gl/dist/mapbox-gl.js';

or

import * as mapboxgl from 'node_modules/mapbox-gl/dist/mapbox-gl.js';

Оба теперь приводят к следующему сообщению об ошибке:

Uncaught TypeError: Cannot set property 'mapboxgl' of undefined

Это означает, что библиотека mapbox-gl теперь загружается и интерпретируется. Однако код mapbox-gl содержит строку:

window.mapboxgl = something;

Область модуля ES6 не имеет доступа к объекту «окно» браузера, поэтому код не работает. См. также Есть ли область модуля es6, эквивалентная `window` ?.

Сейчас я добавляю теги HTML5 ‹script›‹/script› и ‹link /› (см. выше) в index.html моего проекта. Это работает, но идея компонентов и модулей заключается в том, чтобы загружать зависимости изнутри этих компонентов и модулей?


person anneb    schedule 03.08.2018    source источник
comment
импортировать './node_modules/mapbox-gl/dist/mapbox-gl.js'; должно работать, это сделает глобальную переменную жесткой...   -  person Salketer    schedule 03.08.2018
comment
может import * as mapboxgl from ...?   -  person barbsan    schedule 03.08.2018
comment
И import 'module.js', и import * as mapboxgl from 'module.js', кажется, делают что-то большее. Однако теперь импорт выдает Uncaught TypeError Cannot set property 'mapboxgl' of undefined. Кажется, это происходит внутри библиотеки с выражением window.mapboxgl = ... . Глобальный объект window недоступен в области модуля E6, поэтому мне, вероятно, следует сдаться и подождать, пока библиотека mapbox-gl будет поддерживать модули ES6? См. также stackoverflow.com/questions/32961255/   -  person anneb    schedule 03.08.2018


Ответы (3)


Вы находитесь рядом.

С вашим исходным кодом для загрузки скрипта:

// load external mapbox-gl.js script
const mapboxgljs = document.createElement('script');
mapboxgljs.setAttribute('src', 'node_modules/mapbox-gl/dist/mapbox-gl.js');
document.head.appendChild(mapboxgljs);

На данный момент, если вы используете экземпляр, предоставленный скриптом: const map = new mapboxgl.Map(options)

Вы получите сообщение об ошибке: Uncaught ReferenceError: mapboxgl is not defined

Причина: скрипт еще не загружен, поэтому экземпляр window.mapboxgl не определен.

Решение: вам нужно дождаться завершения загрузки скрипта, используя прослушиватель событий. Добавьте этот код в код скрипта загрузки:

mapboxgljs.addEventListener('load', function() {
  // mapboxgl is available here, do whatever you want
  const map = new mapboxgl.Map(options)
})
person Akivamu    schedule 21.09.2018

Для меня решением было определить импорт без усов {}:

import mapboxgl from 'mapboxgl'
person Java    schedule 28.09.2019

Просто делать:

import("node_modules/mapbox-gl/dist/mapbox-gl");

// do my stuff with global dependency

или если импорт выполняется медленнее, чем выполняемый код

import("node_modules/mapbox-gl/dist/mapbox-gl").then(() => {
    // do my stuff with global dependency
})
person User Rebo    schedule 07.04.2021