js 检查自身更新

  • 从当前脚本中提取 name​ 和 version
  • 获取该脚本的远程地址(即 <script src="remote.js">​ 的地址)
  • 从远程地址获取远程版本号(假设远程 JS 文件开头也有注释定义)
  • 比较本地版本和远程版本
  • 如果远程版本更新,就提示用户是否需要更新

✅ 总结:

  1. 不需要下载新版本,只做提示。
  2. 当前使用的脚本是本地引入的(例如:<script src="/local/your-script.js">​),但这个 js 文件也有线上地址。
  3. 你希望读取远程 JS 文件内容并解析它的版本信息。
  4. 通过比较两个版本号,判断是否需要提醒更新。

🧩 技术难点

由于浏览器安全策略限制(同源策略),不能直接用 fetch 去请求外域的 JS 文件。所以以下两种情况处理方式不同:

类型 是否允许 fetch 远程 JS 内容
同源(协议+域名+端口一致) ✅ 允许
跨域 ❌ 默认不允许,除非服务器允许 CORS

✅ 解决方案(假设你是同源或可以跨域)

下面是一个完整示例,包括:

  1. 在当前脚本中提取自己的元数据(name, version)
  2. 获取远程 JS 文件内容
  3. 提取远程 JS 注释中的版本号
  4. 对比版本并输出提示信息

💡 示例 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);
    });
})();

🚫 注意事项

  1. 跨域问题

    • 如果远程 JS 是第三方地址且不支持 CORS,那么 fetch​ 会失败。

    • 你可以让后端设置响应头来允许跨域:

      Access-Control-Allow-Origin: *
      
  2. 性能优化

    • 可以加个防抖机制,比如每天只检测一次更新,避免频繁请求影响性能。
  3. 安全性

    • 该功能主要用于开发环境或调试用途。生产环境下建议禁用自动检查更新。

✅ 输出效果示例(发现新版本):

⚠️ 检测到新版本!
项目名称: MyAwesomeScript
当前版本: 1.0.0
远程版本: 1.1.0
更新地址: https://example.com/your-script.js

image.png

留下你的脚步
推荐阅读