/** * 地址数据分片工具 * 将完整的地址JSON文件分片为: * 1. 省份列表(轻量级,< 1MB) * 2. 每个省份的详情文件(按需加载) * * 使用方法: * 1. 将完整的 address.json 文件放到 data 目录 * 2. 运行: node scripts/splitAddressData.js * 3. 将生成的 split 目录中的文件上传到服务器 */ const fs = require('fs'); const path = require('path'); // 配置 const INPUT_FILE = path.join(__dirname, '../data/address.json'); const OUTPUT_DIR = path.join(__dirname, '../data/split'); // 检查输入文件是否存在 if (!fs.existsSync(INPUT_FILE)) { console.error('❌ 错误:找不到输入文件'); console.error(` 请将完整的 address.json 文件放到: ${INPUT_FILE}`); process.exit(1); } // 创建输出目录 if (!fs.existsSync(OUTPUT_DIR)) { fs.mkdirSync(OUTPUT_DIR, { recursive: true }); console.log(`✅ 创建输出目录: ${OUTPUT_DIR}`); } console.log('📥 开始读取完整地址数据...'); const startTime = Date.now(); // 读取完整数据 let fullData; try { const fileContent = fs.readFileSync(INPUT_FILE, 'utf8'); fullData = JSON.parse(fileContent); const loadTime = ((Date.now() - startTime) / 1000).toFixed(2); console.log(`✅ 数据读取完成,耗时 ${loadTime} 秒`); } catch (error) { console.error('❌ 读取或解析JSON失败:', error.message); process.exit(1); } if (!Array.isArray(fullData)) { console.error('❌ 错误:数据格式不正确,期望数组格式'); process.exit(1); } console.log(`📊 共 ${fullData.length} 个省份`); // 1. 生成省份列表(轻量级) console.log('\n📝 生成省份列表...'); const provinceList = fullData.map(province => ({ code: province.code, name: province.name, _hasChildren: !!province.children && province.children.length > 0 })); const provinceListPath = path.join(OUTPUT_DIR, 'address_provinces.json'); fs.writeFileSync( provinceListPath, JSON.stringify(provinceList, null, 2), 'utf8' ); const provinceListSize = (fs.statSync(provinceListPath).size / 1024).toFixed(2); console.log(`✅ 省份列表已生成: ${provinceListPath}`); console.log(` 大小: ${provinceListSize} KB`); // 2. 为每个省份生成详情文件 console.log('\n📝 生成省份详情文件...'); let totalSize = 0; let successCount = 0; let failCount = 0; fullData.forEach((province, index) => { try { const fileName = `address_province_${province.code}.json`; const filePath = path.join(OUTPUT_DIR, fileName); fs.writeFileSync( filePath, JSON.stringify(province, null, 2), 'utf8' ); const fileSize = fs.statSync(filePath).size; totalSize += fileSize; successCount++; const progress = ((index + 1) / fullData.length * 100).toFixed(1); console.log(` [${progress}%] ${province.name} (${province.code}) - ${(fileSize / 1024 / 1024).toFixed(2)} MB`); } catch (error) { failCount++; console.error(` ❌ ${province.name} 生成失败:`, error.message); } }); // 统计信息 console.log('\n📊 分片完成统计:'); console.log(` ✅ 成功: ${successCount} 个省份`); if (failCount > 0) { console.log(` ❌ 失败: ${failCount} 个省份`); } console.log(` 📦 总大小: ${(totalSize / 1024 / 1024).toFixed(2)} MB`); console.log(` 📁 输出目录: ${OUTPUT_DIR}`); // 生成文件列表(方便上传) const fileList = [ 'address_provinces.json', ...fullData.map(p => `address_province_${p.code}.json`) ]; const fileListPath = path.join(OUTPUT_DIR, 'file_list.txt'); fs.writeFileSync( fileListPath, fileList.join('\n'), 'utf8' ); console.log(`\n📋 文件列表已生成: ${fileListPath}`); console.log('\n✅ 数据分片完成!'); console.log('\n📤 下一步:'); console.log(' 1. 将 split 目录中的所有文件上传到服务器'); console.log(' 2. 确保文件可以通过以下URL访问:'); console.log(` - ${path.basename(OUTPUT_DIR)}/address_provinces.json`); console.log(` - ${path.basename(OUTPUT_DIR)}/address_province_{code}.json`); console.log(' 3. 在 addressDataLoaderLazy.js 中配置正确的 baseUrl');