接口库:express VS2 jsdom
相当于建立一个后端的web服务.
基本的例子:
const express = require('express')
const app = express()
const port = 3000
处于一个监听状态:
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
req,请求的内容. res: result
app.get app.psot 一个接收get请求,一个接收post请求
app.get('/', (req, res) => {
console.log(req.query.a)
res.send((Number(req.query.a) + 600).toString());
API
})
变量污染:清除,快 稳
1.对污染的全局变量进行一键缓存清理,window除了内置的全部清除
不可迭代状态不能用这种方法清理.
function hauncun_clear() {
_env = ['global', 'clearInterval', 'clearTimeout', 'setInterval', 'setTimeout', 'queueMicrotask', 'performance', 'clearImmediate', 'setImmediate',]
for (i in global) {
if (_env.indexOf(i) === -1) {
delete global[i]
}
}
}
并发混论,不期待现象,无法预测结果.,
加锁,会降低性能.
2.沙箱
每一次执行js都有一个独立的环境.环境纯净,性能快.
const {VM} = require('vm2');
function name(x){
const vm = new VM();
result = vm.run(
`
if (!global.key) {
global.key = 5000
}
global.key += Number(参数) + 50
global.key
`.replace('name', x))
return result
}
app.get('/', (req, res) => {
res.send(name(req.query.a).toString());
})
沙箱的调试
const {VMScript} = require('vm2');
const script = new VMScript('debugger;');
new VM().run(script);
})
jsdom:
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`html代码`);
console.log(dom.window.document.querySelector("p").textContent); // "Hello world"
//设置参数:
const dom = new JSDOM(``, {
url: "",
referrer: "",
contentType: "",
includeNodeLocations: true,
storageQuota: xxxxx
});
jsdom 缺点:
- 内存占用极高
- 被检测概率非常大
- 对某些特殊的API接口支持不好
jsdom 优点 - 一键补环境,
- 降低被检测风险
- 可以配合canvas库实现 canvas的大部分功能。