Javascript ES模块导入-始终可以这样做吗?尝试导入socket.io-client失败的示例
我正在尝试使用“无构建”过程,因此我在html文件中使用了一个普通模块Javascript ES模块导入-始终可以这样做吗?尝试导入socket.io-client失败的示例,javascript,socket.io,es6-modules,preact,Javascript,Socket.io,Es6 Modules,Preact,我正在尝试使用“无构建”过程,因此我在html文件中使用了一个普通模块脚本(在Preact文档之后): 我想从ES模块导入socket.io客户端。我知道我可以将窗口封装在我自己的JS文件中,然后将其导入html中的模块脚本中,但我正在尝试这样做,但它不起作用: import io from '/socket.io.js'; // after copying socket.io.js to my public dir import { io } from 'https://cdnjs.c
脚本(在Preact文档之后):
我想从ES模块导入socket.io客户端。我知道我可以将窗口
封装在我自己的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全局函数,如模块
,在可能的webpack包包中,即socket.io.js
——很可能该库不支持ES模块
我可能会一次又一次地面对这个问题,所以我决定重新开始构建步骤
我的问题是-有没有办法解决“第三方库不支持开箱即用的ES模块导入”?也许在我这方面做一点工作,我就可以绕过这个问题,尝试在开发过程中不需要构建步骤就可以完成一个小项目
有没有办法解决“不支持ES模块开箱即用导入的第三方库”
不幸的是,不,至少不总是这样。浏览器不可能以本机方式导入非ES模块的内容。但是,如果您可以访问原始源代码,并且源代码本身是作为ES模块编写的(然后传输/捆绑),那么您有时可以自己构建ES模块
对于socket.io,在TypeScript中承载源代码,它使用import
/export
。不幸的是,他们的代码还使用了require()
和其他npm包,这最终意味着它不能简单地转换为ES模块。很公平——我认为可能是这样。迫不及待地等待deno获得更多牵引力。谢谢
<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);
});
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