You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Node.js和Electron从URL读取文件(含JSON)

解决方案:高效从远程URL读取JSON并渲染表格

问题背景

需要通过Node.js从服务器URL读取JSON文件,此前使用FTP下载效率极低,当前本地读取并渲染的方案运行速度慢,需优化下载与渲染流程。现有本地读取JSON并渲染表格的代码如下:

let project_db;
fs.readFile('public/db/db.json', 'utf8', function (err, data) {
    if (err) throw err;
    project_db = JSON.parse(data);
    console.log(project_db.projects.length);
    for(let i = 0; i < project_db.projects.length; i++) {
        $('#projectTable tbody').append(`
            <tr class="rowT">
                <th scope="row" class="scope border-bottom-0">${project_db.projects[i].name}</th>
                <td class="border-bottom-0">${project_db.projects[i].date}</td>
                <td class="border-bottom-0">${(project_db.projects[i].project_constructii == true) ? "DA" : "NU"}</td>
                <td class="border-bottom-0">${(project_db.projects[i].project_hvac == true) ? "DA" : "NU"}</td>
                <td class="border-bottom-0">${(project_db.projects[i].project_instalatii_sanitare == true) ? "DA" : "NU"}</td>
                <td class="border-bottom-0">${(project_db.projects[i].project_instalatii_electrice == true) ? "DA" : "NU"}</td>
                <td class="border-bottom-0">${(project_db.projects[i].project_instalatii_incendiu == true) ? "DA" : "NU"}</td>
                <td class="border-bottom-0"><a href="#" class="btn btn-success">Vezi oferte</a></td>
            </tr>
        `);
    }
});

优化方案

1. 替换FTP,用HTTP/HTTPS直接获取远程JSON

FTP传输效率远低于HTTP/HTTPS,尤其在支持gzip压缩的场景下差距更明显。推荐使用Node.js内置的https模块或axios库发起请求,同时开启请求压缩以减少传输体积。

示例(使用axios):

const axios = require('axios'); // 需先安装:npm install axios

axios.get('https://你的服务器地址/db.json', {
    headers: { 'Accept-Encoding': 'gzip, deflate' },
    responseType: 'json'
})
.then(response => {
    const project_db = response.data;
    renderTable(project_db.projects);
})
.catch(err => {
    console.error('获取数据失败:', err);
});

2. 优化表格渲染性能

原代码循环中每次调用append会触发多次DOM重排,导致渲染缓慢。改为先拼接完整的HTML字符串,再一次性插入DOM,大幅减少重排次数。

封装渲染函数:

function renderTable(projects) {
    let html = '';
    projects.forEach(project => {
        html += `
            <tr class="rowT">
                <th scope="row" class="scope border-bottom-0">${project.name}</th>
                <td class="border-bottom-0">${project.date}</td>
                <td class="border-bottom-0">${project.project_constructii ? "DA" : "NU"}</td>
                <td class="border-bottom-0">${project.project_hvac ? "DA" : "NU"}</td>
                <td class="border-bottom-0">${project.project_instalatii_sanitare ? "DA" : "NU"}</td>
                <td class="border-bottom-0">${project.project_instalatii_electrice ? "DA" : "NU"}</td>
                <td class="border-bottom-0">${project.project_instalatii_incendiu ? "DA" : "NU"}</td>
                <td class="border-bottom-0"><a href="#" class="btn btn-success">Vezi oferte</a></td>
            </tr>
        `;
    });
    // 一次性插入DOM
    $('#projectTable tbody').html(html);
}

3. 额外优化建议

  • 缓存机制:如果JSON数据更新不频繁,可将获取到的数据缓存到本地文件或内存中,避免重复发起请求。
  • 分页加载:若数据量极大,可实现分页加载,每次只渲染部分数据,提升首屏加载速度。
  • 增强错误处理:添加请求超时、重试逻辑,避免单次请求失败导致功能完全不可用。

完整整合代码

const axios = require('axios');

// 渲染表格函数
function renderTable(projects) {
    let html = '';
    projects.forEach(project => {
        html += `
            <tr class="rowT">
                <th scope="row" class="scope border-bottom-0">${project.name}</th>
                <td class="border-bottom-0">${project.date}</td>
                <td class="border-bottom-0">${project.project_constructii ? "DA" : "NU"}</td>
                <td class="border-bottom-0">${project.project_hvac ? "DA" : "NU"}</td>
                <td class="border-bottom-0">${project.project_instalatii_sanitare ? "DA" : "NU"}</td>
                <td class="border-bottom-0">${project.project_instalatii_electrice ? "DA" : "NU"}</td>
                <td class="border-bottom-0">${project.project_instalatii_incendiu ? "DA" : "NU"}</td>
                <td class="border-bottom-0"><a href="#" class="btn btn-success">Vezi oferte</a></td>
            </tr>
        `;
    });
    $('#projectTable tbody').html(html);
}

// 远程获取JSON并渲染
axios.get('https://你的服务器地址/db.json', {
    headers: { 'Accept-Encoding': 'gzip, deflate' },
    timeout: 5000 // 设置5秒超时
})
.then(response => {
    renderTable(response.data.projects);
})
.catch(err => {
    console.error('加载数据出错:', err.message);
    // 可选:加载本地缓存作为降级方案
    // fs.readFile('public/db/db.json', 'utf8', (err, data) => {
    //     if (!err) renderTable(JSON.parse(data).projects);
    // });
});

内容的提问来源于stack exchange,提问作者Alexie01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:32:33