我正在尝试使用一个"构建更少";所以我在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
),我就能让客户端socket.io正常工作:
<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"没有提供名为"默认"的导出
和";polyfill";ed(如果这是正确的术语)可能是socket.io.js
的webpack捆绑包中的像module
这样的commonjs全局-很可能这个库不支持ES模块。
我可能会一次又一次地面对这个问题,所以我决定重新开始构建步骤。
我的问题是,有没有办法解决这个";不支持开箱即用ES模块导入的第三方库";?也许只要我做一点工作,我就可以绕过这一点,尝试在没有开发构建步骤的情况下完成一个小项目。
有办法解决这个问题吗"不支持开箱即用ES模块导入的第三方库";?
不幸的是没有,至少不总是这样。浏览器不可能原生地import
非ES模块的内容。然而,如果您可以访问原始源代码,并且源代码本身是作为ES模块编写的(然后进行转换/捆绑),那么有时您可以自己构建ES模块。
在socket.io的情况下,他们的repo在TypeScript中托管源代码,后者使用import
/export
。不幸的是,他们的代码还使用了require()
和其他npm包,这最终意味着它不能简单地转换为ES模块。