在 Chrome 中作为 ES6 导入的 fabric js 不起作用

Tom*_*Tom 5 javascript fabricjs

在我的网站上,我不想捆绑而是直接使用 ES6 模块(适用于观众)

我尝试导入fabric.js

import {fabric} from "../node_modules/fabric/dist/fabric.js"; 就像我捆绑时所做的一样(对于捆绑来说,它工作正常)。

但是当我启动网站时

“未捕获的语法错误:请求的模块 '../node_modules/fabric/dist/fabric.js' 不提供名为 'fabric' 的导出”

如果我将上述更改为 import * as FAB from "../node_modules/fabric/dist/fabric.js"; 我得到

未捕获的类型错误:无法读取 fabric.js:3224 处未定义的属性“fabric”

关于如何将结构直接用作 ES6 模块而不捆绑的任何想法?不用说,我在使用 Chrome 76.0.3809.132 时导入的其他模块没有这个问题

升级到fabric 3.4 无济于事。让我在这里粘贴我的整个代码: html

<!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8">
      <script type="module" src="./start.js"></script>
   </head>

   <body>

   </body>
</html>
Run Code Online (Sandbox Code Playgroud)

以及我从中删除所有其他内容的 JS

import fabric from '../node_modules/fabric/dist/fabric.min.js';

还是一样的错误

未捕获的语法错误:请求的模块“../node_modules/fabric/dist/fabric.min.js”不提供名为“default”的导出

shk*_*per 3

Fabric.js 的编写方式无法与 ES6 模块导入一起使用。这是因为 Fabric 依赖this于浏览器环境中的引用window,例如,当它使用 IIFE 向对象添加属性时,fabric如下所示:

(function(global) {

  var fabric  = global.fabric || (global.fabric = { }),

  // ...
  fabric.something = somethingElse
})(typeof exports !== 'undefined' ? exports : this);
Run Code Online (Sandbox Code Playgroud)

通常,this将作为对 的引用传递window,但当脚本作为模块加载时则不会传递(MDN 在此处以及其他地方提到了它)。

这就是为什么即使你通过正确导入它

import fabric from '../node_modules/fabric/dist/fabric.js'
Run Code Online (Sandbox Code Playgroud)

你会得到类似的错误

Uncaught TypeError: Cannot read property 'fabric' of undefined
Run Code Online (Sandbox Code Playgroud)

除非您想亲自动手修补库源代码,否则最好将结构加载到单独的非模块脚本标记中。