如何将非模块(!)JavaScript导入Polymer 3.0

时间:2018-08-03 10:49:01

标签: javascript polymer mapbox-gl polymer-3.x

聚合物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>

我试图使用'import'加载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'

因此,然后我尝试从模块 javascript(<script type="module">..</script>)内部将脚本和CSS添加到document.head:

// 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';

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-模块范围无法访问浏览器“窗口”对象,因此代码失败。另请参见Is there an es6 module-scope equivalent to `window`?

现在,我将HTML5 标记(见上文)添加到项目的index.html中。这行得通,但是组件和模块的想法是从那些组件和模块内部加载依赖项?

3 个答案:

答案 0 :(得分:0)

你很近。

使用原始代码加载脚本:

// 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)
})

答案 1 :(得分:0)

对我来说,解决方案是在不使用mustasch {}的情况下定义导入:

import mapboxgl from 'mapboxgl'

答案 2 :(得分:0)

就去做:

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
})