缓存 dom 节点变量可加速从已加载配置中读取值,但不提升文件 io 性能;适用于配置已内联或挂载至 dom 的场景,如 script[type="application/json"] 或 data-* 属性,通过一次查询+持久引用避免重复遍历 dom。
直接缓存 dom 节点变量本身并不能加速“读取配置文件”的 io 性能——因为配置文件读取(如 fetch、xmlhttprequest、fs.readfile)属于网络或磁盘 i/o,发生在 javascript 执行前或异步回调中,与 dom 树无关。但如果你的真实场景是:配置数据已加载进页面(例如内联 json、data-* 属性、script[type="application/json"] 或初始化后挂载到 dom 的配置节点),后续又在 js 中高频读取这些配置值,那么对 dom 节点的引用缓存确实能显著减少重复查询开销,避免成为性能瓶颈。
明确适用前提:配置已落 DOM,非实时读磁盘/网络
DOM 缓存只优化“从已有 DOM 中取值”这一步,不解决文件加载慢的问题。常见合法场景包括:
- HTML 中用
<script type="application/json" id="app-config">{...}</script>内联配置 - 通过
<div id="config" data-api-url="..." data-timeout="5000"></div>存储参数 - SPA 初始化时将远程获取的配置解析后挂载为隐藏 DOM 节点(如
<template id="runtime-config">...</template>)
缓存节点引用:一次查询,长期复用
避免每次读配置都调用 document.getElementById 或 querySelector——这些方法需遍历整个 DOM 树,高频调用会明显拖慢执行速度。
✅ 正确做法:在模块初始化或首次访问时查询并赋值给模块级/闭包变量
// ✅ 推荐:缓存一次,后续直接用
const configNode = document.getElementById('app-config');
const getConfig = () => {
if (!configNode) return null;
try {
return JSON.parse(configNode.textContent);
} catch {
return {};
}
};
<p>// ❌ 避免:每次调用都重新查 DOM
const badGetConfig = () => {
const node = document.getElementById('app-config'); // 每次都遍历!
return node ? JSON.parse(node.textContent) : {};
};</p>
进一步提速:连内容也缓存(惰性 + 只读)
如果配置内容不变(如启动时确定),可把解析结果也缓存,彻底跳过 DOM 访问和 JSON 解析:
示例:let _cachedConfig = null;
const getCachedConfig = () => {
if (_cachedConfig !== null) return _cachedConfig;
<p>const node = document.getElementById('app-config');
_cachedConfig = node
? JSON.parse(node.textContent || '{}')
: {};
return _cachedConfig;
};</p>
这样后续所有调用都是纯内存读取,耗时趋近于 0 微秒。
配合现代 API 提升健壮性
使用 querySelector 替代 getElementById 时注意返回静态 NodeList;若用 getElementsByClassName 等实时集合,务必转成数组再缓存,否则每次访问仍触发重查:
- ✅
const nodes = [...document.querySelectorAll('[data-config]')]; - ✅
const el = document.querySelector('#config'); // 返回单个元素,可直接缓存 - ❌
const els = document.getElementsByClassName('config'); // 实时集合,每次 .length 都重查











