在 Node 中使用 CommonJS 模块时,您可以使用require.main === module.
在 Node 中使用 ES 模块(带有--experimental-modules标志)时,检测脚本是否正在从命令行运行的等效方法是什么?
我有两个子域名:
在app.mydomain.com的登录页面中,我已经在Socket.IO客户端脚本中链接,并成功创建了一个IO对象,如下所示:
<script src=https://socket.mydomain.com/socket.io/socket.io.js></script>
<script type=text/javascript>
const socket = io();
socket.on('message', data => console.log(data));
</script>
Run Code Online (Sandbox Code Playgroud)
但是,socket.mydomain.com客户端尝试连接到而不是尝试连接app.mydomain.com.因为没有套接字app.mydomain.com,它会失败并继续重试.
有没有办法将我的应用程序连接app.mydomain.com到我的套接字socket.mydomain.com?或者这不可能吗?
更新
与此问题相关的大多数现有答案现在都使用过时的代码,因为Socket.IO最近已升级到1.0(事实上为1.4).但是,即使考虑到这些代码更改,似乎 Socket.IO也不允许我正在尝试做的事情.
当Socket.IO与服务器建立初始连接时,它会发送一个withCredentials设置为true 的XHR .但您不能withCredentials设置为true 并允许服务器上的CORS.所以看来我的问题实际上是,"这个问题有办法解决吗?"
我有一个从构造函数返回Proxy的类。当我尝试将此类的实例存储在IndexedDB中或使用发送对象时window.postMessage(),收到一条错误消息,指出无法克隆该对象。看来结构化克隆算法无法处理代理对象。
以下代码演示了该错误:
class MyClass {
constructor() {
return new Proxy(this, {
set(target, prop, val, receiver) {
console.log(`"${prop}" was set to "${val}"`);
return Reflect.set(target, prop, val, receiver);
}
});
}
}
const obj = new MyClass;
try {
window.postMessage(obj,'*');
} catch(err) {
console.error(err);
}Run Code Online (Sandbox Code Playgroud)
谁能建议解决此问题的方法?我看到了两个潜在的解决方案,但是我不知道如何实现它们:
不要从构造函数返回Proxy,而是以某种方式在类声明中维护Proxy功能。
更改代理实例,使其与结构化克隆算法一起使用。
编辑:以下更简单的代码也演示了结构化克隆错误:
const p = new Proxy({}, {});
window.postMessage(p, '*');Run Code Online (Sandbox Code Playgroud)
如何编写可以从命令行或通过 ES6 导入语句运行的 Node 脚本?
我正在使用--experimental-modules标志和.mjs扩展来将脚本作为 ES6 模块运行。
假设我有以下脚本sayHello.mjs:
export default function sayHello() {
console.log(`Hello!`);
}
Run Code Online (Sandbox Code Playgroud)
我希望能够通过以下两种方式使用此脚本:
通过命令行:
node --experimental-modules sayHello.mjs
Run Code Online (Sandbox Code Playgroud)通过另一个脚本中的 ES6 导入语句:
node --experimental-modules sayHello.mjs
Run Code Online (Sandbox Code Playgroud)我正在寻找类似于module.main用于 CommonJS 模块的解决方案(这不适用于 ES6 导入):
import sayHello from './sayHello.mjs';
sayHello();
Run Code Online (Sandbox Code Playgroud) 当我尝试对进行对象分解时ev.preventDefault(),我在Chrome中收到以下错误:
Uncaught TypeError: Illegal invocation
但是,当我使用时ev.preventDefault()不破坏结构,效果很好。重现此问题的代码如下所示。
const button = document.getElementById(`test-button`);
button.onclick = ({ preventDefault }) => {
preventDefault();
};Run Code Online (Sandbox Code Playgroud)
<button id=test-button type=button>Click me to see the error</button>Run Code Online (Sandbox Code Playgroud)
知道为什么会这样吗?或者如何将对象分解与事件对象一起使用?
我有一个水平的、环绕的 flexbox,如下所示:
.container {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
Run Code Online (Sandbox Code Playgroud)
每行的项目数会因屏幕宽度而异,每个项目的宽度也会有所不同。
我只想为每个 flexbox 行的第一项添加样式。下面是我正在寻找的内容的说明。
Example 1
|--------|--------|--------|
|style me| | |
|--------|--------|--------|
|style me| | |
|--------|--------|--------|
|style me| |
|--------|--------|
Example 2
|--------|---|-----|------------|
|style me| | | |
|--------|---|-----|------------|
| style me | | |
|---------------|------|--------|
| style me | |
|----------|------|
Run Code Online (Sandbox Code Playgroud)
我如何使用 Flexbox 做到这一点?
我仍然需要在调整屏幕大小时将行换行,所以我认为我不能使用 Grid。但是,如果可以使用 Grid 来解决这个问题,那对我来说也是一个很好的解决方案。
javascript ×5
node.js ×3
es6-modules ×2
node-modules ×2
css ×1
es6-proxy ×1
flexbox ×1
socket.io ×1
sockets ×1