gpt4 book ai didi

javascript - 在 Node.js 中运行时解决窗口依赖性的建议

转载 作者:太空宇宙 更新时间:2023-11-04 01:08:57 25 4
gpt4 key购买 nike

我正在尝试将浏览器端库的运行时环境扩展到node.js。我实现了通用模块定义(UMD)模式来做到这一点。它适用于 AMD 实现和 <script>但在 node.js 中不起作用,因为没有 window .

有问题的依赖项是 WebSocket , EventSource , XMLHttpRequest , document 。详细信息如下:https://github.com/flowersinthesand/portal/issues/115那么解决 Node.js 中窗口依赖的最佳方法是什么?我有以下方法来做到这一点。由于我是node.js的新手,这些都有些陌生,我不知道哪种方式是自然的。虽然我正在尝试支持node.js,但我不想改变太多东西。

以下代码片段来自https://github.com/flowersinthesand/portal/blob/master/portal.js

使用jsdom

(function(root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(function() {
// Passes the window
return factory(root);
});
} else if (typeof exports === 'object') {
// Node
module.exports = factory(require('jsdom').something);
} else {
// Browser globals, Window
root.portal = factory(root);
}
}(this, function(window) {

如果 jsdom 很好地支持上述依赖项,这看起来最好。但是,如果它有效,我想知道为什么 sockjs、socket.io 和 engine.io 的客户端不使用 jsdom。也许,它们是针对 Node 而不是浏览器?性能?

将窗口作为依赖的普通对象

(function(root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(function() {
// Passes the window
return factory(root);
});
} else if (typeof exports === 'object') {
// Node
module.exports = factory({
WebSocket: require('package name for WebSocket').something,
EventSource: require('package name for EventSource').something,
document: require('jsdom').hmm,
// ...
});
} else {
// Browser globals, Window
root.portal = factory(root);
}
}(this, function(window) {

创建一组依赖项、窗口看起来很挑剔,而且有些不舒服,但是,如果可能的话,我想保留当前代码。另外,当 XMLHttpRequest 由于跨域或卸载事件而无法工作时,可能还需要 jsdom 来解析用于通过脚本标记执行 HTTP 请求的文档,这种情况包括 IE 6。可以使用文档分离逻辑,以使用浏览器中 Node 和脚本标记支持的内容检查当前运行时,但这对我来说是一个很大的变化。

最佳答案

(function(root, factory) {
if (typeof define === "function" && define.amd) {
// AMD
define(function() {
return factory(root);
});
} else if (typeof exports === "object") {
// Node
module.exports = factory(function() {
// Prepare the window powered by jsdom
var window = require("jsdom").jsdom().createWindow();
window.WebSocket = require("ws");
window.EventSource = require("eventsource");
return window;
}());
// node-XMLHttpRequest 1.x conforms XMLHttpRequest Level 1 but can perform a cross-domain request
module.exports.support.corsable = true;
} else {
// Browser globals, Window
root.portal = factory(root);
}
}(this, function(window) {

关于javascript - 在 Node.js 中运行时解决窗口依赖性的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19946705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com