使用 HTML DOM 加载 SDK 到 nodejs
Load SDK with HTML DOM into nodejs
我正在尝试使用包含 HTML DOM
在 NodeJS
中使用的 SDK(我需要 SDK 的功能而不实际使用客户端)
由于 SDK 需要 HTML DOM
,所以我无法使用简单的 require 加载它。
所以我尝试了以下方法:
const {JSDOM} = require("jsdom");
const dom = new JSDOM(`<body>
<script src="./libs/jquery/jquery-2.1.3.min.js" type="text/javascript"></script>
<script>
var testVar= 'test';
var a= jQuery;
</script>
</body>`, {runScripts: "dangerously", resources: "usable"});
module.exports = dom.window.a;
(在示例中我输入了 JQUERY
,但我使用了另一个我无法放入问题中的 SDK - 我知道 jquery 有一个 npm 包,但我的 SDK 有不是)。
我的想法是导出一个包含 Nodejs
SDK 的模块,所以我使用 jsdom
.
创建了一个模拟 dom
当我调试时,我在这一行中看到:module.exports = dom.window.a;
一个变量是 undefined
。
但如果我更改行:module.exports = dom.window.testVar;
我会得到 'test'.
为了测试,我创建了一个 HTML 页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="./libs/jquery/jquery-2.1.3.min.js" type="text/javascript"></script>
<script>
var a= jQuery;
</script>
</body>
</html>
当我 运行 它时,我确实正确地得到了 a
变量。
所以我无法弄清楚 JSDOM 的问题所在。
我希望得到帮助,或者任何其他关于如何将包含 HTML DOM
的 SDK 加载到 NodeJS
的建议
最后我在基地错过的是 DOMContentLoaded
事件。
此外,所有文件都在同一文件夹下非常重要。
我还创建了包含脚本的 HTML 并使用 JSDOM 上传了它
固定代码如下:
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="jquery-2.1.3.min.js" type="text/javascript"></script></body>
</html>
index.js :
const {JSDOM} = require("jsdom");
const options = {
runScripts: "dangerously",
resources: "usable"
};
const file = './src/test/index.html';
module.exports = {
initialize: function (callback) {
JSDOM.fromFile(file, options).then((dom) => {
dom.window.document.addEventListener('DOMContentLoaded', () => {
setImmediate(() => {
callback({
jQuery: dom.window.jQuery
});
});
});
}).catch(err => {
console.log(err);
});
}
};
用法:
require('../test/').initialize(function (test) {
if (test.jQuery)
console.log("Yee");
else
console.log("Nope");
});
它打印了 Yee!!
我正在尝试使用包含 HTML DOM
在 NodeJS
中使用的 SDK(我需要 SDK 的功能而不实际使用客户端)
由于 SDK 需要 HTML DOM
,所以我无法使用简单的 require 加载它。
所以我尝试了以下方法:
const {JSDOM} = require("jsdom");
const dom = new JSDOM(`<body>
<script src="./libs/jquery/jquery-2.1.3.min.js" type="text/javascript"></script>
<script>
var testVar= 'test';
var a= jQuery;
</script>
</body>`, {runScripts: "dangerously", resources: "usable"});
module.exports = dom.window.a;
(在示例中我输入了 JQUERY
,但我使用了另一个我无法放入问题中的 SDK - 我知道 jquery 有一个 npm 包,但我的 SDK 有不是)。
我的想法是导出一个包含 Nodejs
SDK 的模块,所以我使用 jsdom
.
当我调试时,我在这一行中看到:module.exports = dom.window.a;
一个变量是 undefined
。
但如果我更改行:module.exports = dom.window.testVar;
我会得到 'test'.
为了测试,我创建了一个 HTML 页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="./libs/jquery/jquery-2.1.3.min.js" type="text/javascript"></script>
<script>
var a= jQuery;
</script>
</body>
</html>
当我 运行 它时,我确实正确地得到了 a
变量。
所以我无法弄清楚 JSDOM 的问题所在。
我希望得到帮助,或者任何其他关于如何将包含 HTML DOM
的 SDK 加载到 NodeJS
最后我在基地错过的是 DOMContentLoaded
事件。
此外,所有文件都在同一文件夹下非常重要。
我还创建了包含脚本的 HTML 并使用 JSDOM 上传了它
固定代码如下:
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="jquery-2.1.3.min.js" type="text/javascript"></script></body>
</html>
index.js :
const {JSDOM} = require("jsdom");
const options = {
runScripts: "dangerously",
resources: "usable"
};
const file = './src/test/index.html';
module.exports = {
initialize: function (callback) {
JSDOM.fromFile(file, options).then((dom) => {
dom.window.document.addEventListener('DOMContentLoaded', () => {
setImmediate(() => {
callback({
jQuery: dom.window.jQuery
});
});
});
}).catch(err => {
console.log(err);
});
}
};
用法:
require('../test/').initialize(function (test) {
if (test.jQuery)
console.log("Yee");
else
console.log("Nope");
});
它打印了 Yee!!