html本身不支持按需打包,必须依赖构建工具(如webpack/vite)与运行时加载策略协同实现;单纯使用或不会自动触发代码拆分,动态import()才是按需加载js组件的唯一可靠方式,且必须在函数或事件回调中调用并显式catch错误。

HTML 本身不支持按需打包,必须靠构建工具(如 Webpack/Vite)+ 运行时加载策略协同实现;单纯写 <my-card></my-card> 或用 <template></template> 不会自动触发打包拆分。
html-webpack-plugin 的 template 配置必须指向源 HTML,不能直接复制到 dist
Webpack 默认只把 index.html 当作静态文件复制,不会解析其中的 <script type="module"></script> 或自定义标签。若手动把 HTML 拖进 dist 目录,常见问题包括:
-
GET /card.js 404:因为构建后 JS 文件名带 hash(如card.a1b2c3.js),但 HTML 里仍写死src="card.js" - 开发时白屏:webpack-dev-server 从内存读取 HTML,磁盘上的文件根本没被加载
- CSS 没注入:
mini-css-extract-plugin提取的 CSS 不会自动加<link>标签
正确做法是用 html-webpack-plugin 的 template 参数指定源路径(如 './src/index.html'),它会在构建时生成新 HTML,并自动注入带 hash 的资源引用。
动态 import() 是按需加载 JS 组件的唯一可靠方式
静态 import 会被构建工具提前分析并打进主包,失去“按需”意义。真正生效的写法必须满足两个条件:
- 调用必须在函数或事件回调中,例如
button.addEventListener('click', () => import('./card.js')) - 必须显式
catch()错误,否则加载失败时静默白屏:import('./card.js').catch(() => el.innerHTML = '<div class="error">加载失败</div>') - 避免在
connectedCallback中无条件调用——Custom Element 可能被反复创建,导致重复请求
注意:import() 返回 Promise,加载的是模块对象,不是 DOM 节点。组件注册通常发生在模块顶层(如 customElements.define('my-card', Card)),所以只要模块执行过一次,后续实例可直接使用。
纯结构型组件优先用 fetch() + insertAdjacentHTML()
如果组件只有 HTML 结构和样式(如 <header></header>、<footer></footer>),不含逻辑,用 JS 动态加载 HTML 字符串比加载 JS 模块更轻量,也绕过 CSP 对 eval 的限制:
- 永远用
insertAdjacentHTML('beforeend', html)替代innerHTML,防止意外执行内联<script></script> - 路径以入口 HTML 所在目录为基准,不是当前 JS 文件位置;可用
new URL('./footer.html', import.meta.url)构造绝对路径 - 开发时加
cache: 'force-cache'或时间戳参数,避免拿到 stale response
这种方式不依赖浏览器模块能力,兼容性比 type="module" 更广,但无法传参——带变量的组件(如 <card title="xxx"></card>)必须升级为 Custom Element 或模板引擎。
组件 JS/CSS 必须外链,禁用内联资源
组件化 ≠ 把所有代码塞进一个 HTML。体积优化的关键是从“全内联”转向“按需外链”:
- 组件 JS 放
/components/card.js,用<script type="module">import './card.js'</script>加载 - 组件 CSS 不再用
<style></style>内联,改用adoptedStyleSheets或fetch()注入,避免阻塞 HTML 解析 - 构建时不要开
html-webpack-plugin的removeEmptyAttributes,否则<button disabled></button>这类空属性可能被误删
真正容易被忽略的是资源生命周期:Custom Element 实例被移除时,若没在 disconnectedCallback 里清理 IntersectionObserver、定时器或事件监听器,内存泄漏会比 jQuery 时代更难排查。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











