自包含Javascript/HTML模块实现方案及相关问题咨询
问题1:是否存在更优的实现方式?
根据你的技术栈和场景,有几类可选的实现方案,都比原始SSI方案灵活性更高:
- 服务端侧:如果你的项目跑在支持模板引擎的服务端上,可以直接用对应模板的引入语法(比如PHP
include、EJS<%- include() %>、Nginx SSI等),本质和你现在用的SSI逻辑一致,但适配性更强。 - 客户端侧:你补充的jQuery load方案、原生Web Components自定义元素、如果是现代化前端项目,也可以直接用Vue/React等框架的单文件组件实现完全的自包含模块。
- 构建工具侧:如果是用Vite/Webpack等构建工具打包的纯静态站点,可以用构建工具的HTML片段引入能力,打包时自动把模块内容拼接进主页面,不需要服务端支持也不需要客户端动态加载。
问题2:mydiv.html中是否需要保留html标签?
完全不需要保留。嵌套的<html>标签不符合W3C规范,虽然大部分浏览器会做容错处理,但会导致DOM结构异常,后续的JS元素选择、CSS样式匹配都可能出现不可预知的问题,必须删除。
问题3:如何编写mydiv.html获得VS Code的完整语法高亮和格式化支持?
VS Code的内置HTML语言支持本身就兼容HTML片段,不需要额外加外层标签:
- 只要文件后缀保持
.html,即使没有<html>、<body>等根标签,也可以正常触发HTML和内嵌JS的语法高亮、自动格式化。 - 如果出现格式化异常或者语法报错,只需要打开VS Code设置,开启
HTML > Validate: Fragments选项,即可让编辑器正常识别独立HTML片段。
补充问题解答
该jQuery方案是否能满足body onload阶段执行的需求?
可以完全满足需求。你使用的$(function(){})是jQuery的DOM就绪回调,触发时机和原生DOMContentLoaded事件一致,早于body.onload触发。load方法拉取到mydiv.html内容后会自动执行其中的<script>代码,这个执行时机一定在body.onload触发之前,服务端部署后只要静态资源路径配置正确,就能正常运行。
和Kooilnc方案的优劣对比
这里默认Kooilnc的方案为回答区常见的服务端包含方案/原生自定义元素方案,对比逻辑如下:
你的jQuery load方案优势:
- 上手成本极低,不需要额外学习新API,适配传统jQuery技术栈的开发习惯
- 完全满足单文件自包含的需求,不需要拆分JS、HTML代码
- 不需要对现有逻辑做大量改造,直接复用已有的div和关联JS即可
- 纯静态部署即可运行,不需要服务端支持include能力
你的jQuery load方案劣势:
- 依赖jQuery库,如果你的项目本身没有引入jQuery,为了该功能额外引入整个库会增加冗余体积
- 属于客户端动态加载内容,对SEO不友好,搜索引擎爬虫无法抓取到
mydiv.html里的内容 - 没有作用域隔离,
mydiv.html里的JS函数、样式都是全局的,容易和主页面代码产生命名冲突 - 多页面复用的场景下会重复发起请求拉取同一份模块内容,浪费带宽
如果Kooilnc的方案为服务端包含类方案,额外补充差异:
- 服务端包含方案的内容是在服务端拼接完成后返回给浏览器,SEO友好,不需要依赖前端库,内容加载没有延迟
- 服务端包含方案的劣势是必须要求部署环境支持对应的include能力,纯静态托管场景无法使用,本地开发也需要配置对应服务端环境才能预览,开发便捷度不如jQuery load方案。
内容的提问来源于stack exchange,提问作者Rewind
相关产品推荐
相关产品推荐

