【问题标题】:How to import non-module(!) JavaScript into Polymer 3.0如何将非模块(!)JavaScript 导入 Polymer 3.0
【发布时间】:2019-01-11 06:00:42
【问题描述】:

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'

所以,然后我尝试从 module javascript (&lt;script type="module"&gt;..&lt;/script&gt;) 内部将脚本和 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-module 范围无权访问浏览器的“窗口”对象,因此代码失败。另见Is there an es6 module-scope equivalent to `window`?

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

【问题讨论】:

  • 导入'./node_modules/mapbox-gl/dist/mapbox-gl.js';应该可以工作,它会使变量全局变硬...
  • 也许是import * as mapboxgl from ...?
  • 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/…

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


【解决方案1】:

只要做:

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

【讨论】:

    【解决方案2】:

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

    import mapboxgl from 'mapboxgl'
    

    【讨论】:

      【解决方案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)
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-01
        • 1970-01-01
        • 2020-06-30
        • 1970-01-01
        • 1970-01-01
        • 2018-11-08
        • 2021-08-21
        • 2018-10-29
        相关资源
        最近更新 更多