- 从当前脚本中提取
name
和version
- 获取该脚本的远程地址(即
<script src="remote.js">
的地址) - 从远程地址获取远程版本号(假设远程 JS 文件开头也有注释定义)
- 比较本地版本和远程版本
- 如果远程版本更新,就提示用户是否需要更新
✅ 总结:
- 不需要下载新版本,只做提示。
- 当前使用的脚本是本地引入的(例如:
<script src="/local/your-script.js">
),但这个 js 文件也有线上地址。 - 你希望读取远程 JS 文件内容并解析它的版本信息。
- 通过比较两个版本号,判断是否需要提醒更新。
🧩 技术难点
由于浏览器安全策略限制(同源策略),不能直接用 fetch 去请求外域的 JS 文件。所以以下两种情况处理方式不同:
类型 | 是否允许 fetch 远程 JS 内容 |
---|---|
同源(协议+域名+端口一致) | ✅ 允许 |
跨域 | ❌ 默认不允许,除非服务器允许 CORS |
✅ 解决方案(假设你是同源或可以跨域)
下面是一个完整示例,包括:
- 在当前脚本中提取自己的元数据(name, version)
- 获取远程 JS 文件内容
- 提取远程 JS 注释中的版本号
- 对比版本并输出提示信息
💡 示例 HTML 页面:
<!-- 本地引用 -->
<script src="/local/your-script.js"></script>
📄 your-script.js 内容(本地版 / 远程版都要有如下格式):
// name: MyAwesomeScript
// version: 1.0.0
// description: A great script that checks for updates.
(function() {
// 初始化脚本逻辑...
})();
🔧 版本检查器脚本(你可以把它放在 your-script.js 最后面):
(function checkForUpdate() {
const script = document.currentScript;
// Step 1: 解析当前脚本内的元数据
const textContent = script.textContent || '';
const meta = {};
const lines = textContent.split('\n');
for (const line of lines) {
const match = line.match(/^\/\/\s*(\w+):\s*(.+)$/i);
if (match) {
const key = match[1].toLowerCase();
const value = match[2];
meta[key] = value;
}
}
const currentName = meta.name;
const currentVersion = meta.version;
const remoteUrl = script.src; // 当前脚本的 src 地址,就是远程地址
if (!currentName || !currentVersion || !remoteUrl) {
console.warn("缺少必要的元数据(name, version)或未设置 src");
return;
}
// Step 2: 请求远程 JS 文件
fetch(remoteUrl)
.then(response => response.text())
.then(text => {
// 解析远程文件里的版本号
let remoteVersion = null;
const remoteLines = text.split('\n');
for (const line of remoteLines) {
const match = line.match(/^\/\/\s*version:\s*(.+)$/i);
if (match) {
remoteVersion = match[1];
break;
}
}
if (!remoteVersion) {
console.warn("无法从远程文件中解析版本号");
return;
}
// Step 3: 比较版本号
function isNewerVersion(current, remote) {
const curr = current.split('.').map(Number);
const rem = remote.split('.').map(Number);
for (let i = 0; i < Math.max(curr.length, rem.length); i++) {
if ((rem[i] || 0) > (curr[i] || 0)) return true;
if ((rem[i] || 0) < (curr[i] || 0)) return false;
}
return false;
}
if (isNewerVersion(currentVersion, remoteVersion)) {
console.log(`⚠️ 检测到新版本!`);
console.log(`项目名称: ${currentName}`);
console.log(`当前版本: ${currentVersion}`);
console.log(`远程版本: ${remoteVersion}`);
console.log(`更新地址: ${remoteUrl}`);
} else {
console.log(`✅ 当前已是最新版本:${currentVersion}`);
}
})
.catch(err => {
console.error("❌ 无法加载远程脚本:", err);
});
})();
🚫 注意事项
-
跨域问题
-
如果远程 JS 是第三方地址且不支持 CORS,那么
fetch
会失败。 -
你可以让后端设置响应头来允许跨域:
Access-Control-Allow-Origin: *
-
-
性能优化
- 可以加个防抖机制,比如每天只检测一次更新,避免频繁请求影响性能。
-
安全性
- 该功能主要用于开发环境或调试用途。生产环境下建议禁用自动检查更新。
✅ 输出效果示例(发现新版本):
⚠️ 检测到新版本!
项目名称: MyAwesomeScript
当前版本: 1.0.0
远程版本: 1.1.0
更新地址: https://example.com/your-script.js
