动态导入d3.js作为模块?

时间:2019-02-16 17:40:58

标签: javascript d3.js ecmascript-6 import

根据es6语法功能(https://developers.google.com/web/updates/2017/11/dynamic-import#dynamic),尝试从现有模块中动态导入(“延迟加载”)d3作为模块以使其自立。 https://d3js.org/d3.v5.min.js的源不包含“ export”语句,仅包含文字函数调用(

!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n(t.d3=t.d3||{})}(...)

),但确实会检索到它,只是它没有收到正常的<script src="https://d3js.org/d3.v5.min.js"/>标签导入所期望的参数。我应该如何手动提供它们,或者我应该怎么做呢?谢谢!

import('https://d3js.org/d3.v5.min.js').then(function(d3){d3.json()})


d3.v5.min.js:2 Uncaught (in promise) TypeError: Cannot read property 'd3' of undefined
at d3.v5.min.js:2

1 个答案:

答案 0 :(得分:3)

我的第一个猜测是错误的...
发生此错误的原因是,此$版本试图读取d3(接收到this.d3的函数参数称为this或缩小版本中的global ),但是t在模块上下文中是未定义的(脚本在this运行时在脚本上下文中运行)。

在使用任何生成此import的构建工具中,这仅仅是一个错误。它应该使用d3(或者也许使用self)。

例如,

this || self曾有此错误,但不久前已修复。


无论如何,即使固定了rollup之后,您在d3中也将一无所获,它将.then()设置为全局值。 (除非他们发布了ES模块版本。)