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

ann*_*neb 7 javascript polymer mapbox-gl polymer-3.x

Polymer 3使用import来加载外部Javascript.例如

import {GoogleCharts} from 'google-charts';
Run Code Online (Sandbox Code Playgroud)

但是,似乎这个工作,外部库应该使用导出.

我正在尝试使用mapbox-gl.js库.这个库安装有:

npm install mapbox-gl
Run Code Online (Sandbox Code Playgroud)

似乎没有出口任何东西.

在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>
Run Code Online (Sandbox Code Playgroud)

我尝试使用'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';
Run Code Online (Sandbox Code Playgroud)

这不起作用:

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'
Run Code Online (Sandbox Code Playgroud)

所以,然后我尝试从模块 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);
Run Code Online (Sandbox Code Playgroud)

这似乎也不起作用.如果我尝试使用mapbox如下:

const map = new mapboxgl.Map(options)
Run Code Online (Sandbox Code Playgroud)

我正进入(状态:

Uncaught ReferenceError: mapboxgl is not defined
Run Code Online (Sandbox Code Playgroud)

编辑:

评论者@Salketer和@barbsan显示了这种库的正确导入语法:

import 'node_modules/mapbox-gl/dist/mapbox-gl.js';
Run Code Online (Sandbox Code Playgroud)

要么

import * as mapboxgl from 'node_modules/mapbox-gl/dist/mapbox-gl.js';
Run Code Online (Sandbox Code Playgroud)

现在两者都会导致以下错误消息:

Uncaught TypeError: Cannot set property 'mapboxgl' of undefined
Run Code Online (Sandbox Code Playgroud)

这意味着mapbox-gl库现在可以加载和解释.但是,mapbox-gl代码包含以下行:

window.mapboxgl = something;
Run Code Online (Sandbox Code Playgroud)

ES6模块作用域无法访问浏览器的"窗口"对象,因此代码失败.另请参阅es6模块范围是否等同于`window`?.

现在,我将HTML5 <script> </ script>和<link />标签(见上文)添加到我项目的index.html中.这是有效的,但组件和模块的想法是从这些组件和模块内部加载依赖项?

Aki*_*amu 1

你很接近。

使用您的原始代码来加载脚本:

// 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);
Run Code Online (Sandbox Code Playgroud)

此时如果使用脚本提供的实例: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)
})
Run Code Online (Sandbox Code Playgroud)