问题描述
我已经使用d3.js在使用node和jsdom的服务器上生成svg / html。我还测试了Web请求中服务器上d3的使用,以生成动态的svg / html,然后在模板/视图(ejs)中使用。这样做的问题是,任何重要的d3.js代码都会阻塞服务器,并迫使其他Web请求等待,直到生成svg / html。有没有一种方法可以在nodejs / express中使用d3在Web请求中生成动态svg / html,而不会阻塞服务器?
我想知道是否存在异步方式来编写d3,或者是否有一种使用其他工作程序以避免阻塞的方式使用d3(和jsdom)生成svg / html的方法。
以下是一些可能要在服务器而不是客户端上执行此操作的原因:预先渲染svg / html并将其在快速模板中使用将为用户提供统一的页面加载,而无需svg的“刷新” / html在页面加载后被绘制,就像在客户端中使用d3一样。您还可以避免向浏览器发送大量数据,并使d3代码专有。
这是一个基本示例,说明我在快速路由中使用d3可能会阻止服务器处理其他传入的Web请求的情况。
app.get("/",async function(req,res) {
// get dynamic data from database based on req.query
let data = await dbConnection.query(dynamic_sql)
// create simulated DOM using jsdom. This step will block server.
const { document } = (new JSDOM(``)).window;
// use d3 to draw svg. This step will block server.
let selection = d3.select(document).select("body")
selection.selectAll("circle")
.data(data).enter()
.append("circle").attr("r",5).attr("cx",10).attr("cy",10)
// extract svg string
let svgString = selection.node().innerHTML
// pass svgString to template to render page for client
res.render("/",{svgString: svgString})
}
如果您有任何想法,请告诉我!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)