小编dwh*_*ieb的帖子

检测 ES 模块是否在 Node 中从命令行运行

在 Node 中使用 CommonJS 模块时,您可以使用require.main === module.

在 Node 中使用 ES 模块(带有--experimental-modules标志)时,检测脚本是否正在从命令行运行的等效方法是什么?

javascript node.js node-modules es6-modules

10
推荐指数
3
解决办法
1110
查看次数

在不同的子域上使用Socket.IO服务器和客户端

我有两个子域名:

  • socket.mydomain.com - Socket.IO服务器
  • app.mydomain.com - 我想要连接到我的网络套接字的网络应用程序.

在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.所以看来我的问题实际上是,"这个问题有办法解决吗?"

javascript sockets node.js socket.io

5
推荐指数
1
解决办法
3080
查看次数

创建代理的结构化克隆

我有一个从构造函数返回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)

谁能建议解决此问题的方法?我看到了两个潜在的解决方案,但是我不知道如何实现它们:

  1. 不要从构造函数返回Proxy,而是以某种方式在类声明中维护Proxy功能。

  2. 更改代理实例,使其与结构化克隆算法一起使用。

编辑:以下更简单的代码也演示了结构化克隆错误:

const p = new Proxy({}, {});
window.postMessage(p, '*');
Run Code Online (Sandbox Code Playgroud)

javascript es6-proxy

5
推荐指数
1
解决办法
440
查看次数

通过命令行或 ES6 导入运行 Node.js 脚本

如何编写可以从命令行或通过 ES6 导入语句运行的 Node 脚本?

我正在使用--experimental-modules标志和.mjs扩展来将脚本作为 ES6 模块运行。

例子

假设我有以下脚本sayHello.mjs

export default function sayHello() {
  console.log(`Hello!`);
}
Run Code Online (Sandbox Code Playgroud)

我希望能够通过以下两种方式使用此脚本:

  1. 通过命令行:

    node --experimental-modules sayHello.mjs
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过另一个脚本中的 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)

javascript node.js node-modules es6-modules

5
推荐指数
1
解决办法
3220
查看次数

破坏ev.preventDefault()

当我尝试对进行对象分解时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)

知道为什么会这样吗?或者如何将对象分解与事件对象一起使用?

javascript

4
推荐指数
1
解决办法
318
查看次数

仅对每个 flexbox 行中的第一项设置样式

我有一个水平的、环绕的 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 来解决这个问题,那对我来说也是一个很好的解决方案。

css flexbox

4
推荐指数
1
解决办法
2210
查看次数