微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ES 模块导入 - 总是可以完成吗?尝试导入 socket.io-client

如何解决ES 模块导入 - 总是可以完成吗?尝试导入 socket.io-client

我正在尝试使用“无构建”过程,因此我在 html 文件中使用了普通模块 script(遵循 Preact 文档):

<script type="module">
  import {
    html,render,} from 'https://unpkg.com/htm/preact/index.mjs?module';
 
  function App(props) {
    return html`<h1>Hello ${props.name}!</h1>`;
  }

  render(html`<${App} name="world" />`,document.getElementById('root'));
</script>

如果我绕过模块系统并依赖于 window 全局(注意:我正在从已传递的 http 服务器提供 html 文件到 socket.io 的服务器并自动安装 /socket.io/socket.io.js):

<script src="/socket.io/socket.io.js"></script>

<!-- in prevIoUs module script: -->
  const socket = window.io();

  socket.on('connect',() => {
    console.log('socket id>>',socket.id);
  });

我想从 ES 模块导入 socket.io 客户端。我知道我可以将 window 使用封装在我自己的 JS 文件中,然后将其导入到我的 html 中的模块脚本中,但我正在尝试这样做,但它不起作用:

  import io from '/socket.io.js'; // after copying socket.io.js to my public dir
  import { io } from 'https://cdnjs.cloudflare.com/ajax/libs/engine.io-client/3.5.0/engine.io.js'; // I have tried several variations of urls and what is imported

判断:

未捕获的语法错误:请求的模块“/socket.io.js”没有 提供一个名为“default”的导出

并且通过“polyfill”ed(如果这是正确的术语)commonjs 全局变量module 在可能的 webpack 包中,它是 socket.io.js - 很可能只是不支持 ES此库的模块。

我可能会一遍又一遍地面临这个问题,所以我决定回到构建步骤。

我的问题是 - 有没有办法解决这个“不支持开箱即用的 ES 模块导入的第三方库”?也许通过我的一些工作,我可以解决这个问题,并尝试在没有构建步骤的开发中完成一个小项目。

解决方法

有没有办法解决这个“第三方库不支持开箱即用的 ES 模块导入”的问题?

不幸的是,没有,至少并非总是如此。浏览器不可能原生地 import 不是 ES 模块的东西。但是,如果您可以访问原始源代码,并且源代码本身是作为 ES 模块编写的(然后被转译/捆绑),那么您有时可以自己构建 ES 模块。

就 socket.io 而言,their repo 在 TypeScript 中托管源代码,它使用 import/export。不幸的是,他们的代码还使用了 require() 和其他 npm 包,这最终意味着它不能简单地转换为 ES 模块。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。