You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Node.js及相关技术实现类似GeekTool的后台动态壁纸浏览器?

实现后台活跃浏览器作为Mac动态壁纸的方案

嘿,刚好我之前研究过类似的需求,结合你提到的Node.js+Web技术的方向,给你整理几个可行的方案,都能实现后台运行的活跃浏览器作为动态壁纸的效果,还能完全访问Node.js API:

1. 使用Electron框架(最推荐)

Electron本身就是基于Chromium和Node.js的桌面应用框架,完美契合你的需求——它允许你在桌面窗口里运行Web内容,同时完全访问Node.js的所有API,而且很容易把窗口设置成壁纸层级、后台运行。

实现步骤:

  • 初始化Electron项目:
    npm init -y
    npm install electron --save-dev
    
  • 创建主进程文件main.js,核心是创建一个全屏、透明、置于桌面底层的窗口:
    const { app, BrowserWindow } = require('electron');
    const path = require('path');
    
    let wallpaperWindow;
    
    function createWallpaperWindow() {
      // 获取屏幕尺寸
      const { width, height } = require('electron').screen.getPrimaryDisplay().workAreaSize;
    
      wallpaperWindow = new BrowserWindow({
        width: width,
        height: height,
        frame: false, // 去掉窗口边框
        transparent: true, // 支持透明背景
        alwaysOnTop: false, // 不要置顶,让其他窗口在上面
        skipTaskbar: true, // 不在任务栏显示
        type: 'desktop', // Mac下设置为桌面层级,自动在壁纸层、图标层之间
        webPreferences: {
          nodeIntegration: true, // 允许渲染进程访问Node.js API
          contextIsolation: false, // 配合nodeIntegration使用,关闭上下文隔离
          enableRemoteModule: true
        }
      });
    
      // 加载你的HTML文件(或者本地Web项目)
      wallpaperWindow.loadFile(path.join(__dirname, 'wallpaper.html'));
    
      // 窗口关闭时清理
      wallpaperWindow.on('closed', () => {
        wallpaperWindow = null;
      });
    }
    
    app.whenReady().then(createWallpaperWindow);
    
    app.on('window-all-closed', () => {
      if (process.platform !== 'darwin') {
        app.quit();
      }
    });
    
    app.on('activate', () => {
      if (BrowserWindow.getAllWindows().length === 0) {
        createWallpaperWindow();
      }
    });
    
  • 创建wallpaper.html,这里可以写你的动态内容,还能直接调用Node.js API:
    <!DOCTYPE html>
    <html>
    <body style="margin:0; background:transparent;">
      <div id="dynamic-content" style="width:100%; height:100%; display:flex; align-items:center; justify-content:center; color:white; font-size:32px;">
        动态壁纸内容,还能发起HTTP请求哦!
      </div>
      <script>
        // 直接使用Node.js的http模块发起请求
        const http = require('http');
        http.get('http://api.example.com/data', (res) => {
          let data = '';
          res.on('data', (chunk) => { data += chunk; });
          res.on('end', () => {
            document.getElementById('dynamic-content').textContent = `获取到数据:${data}`;
          });
        });
      </script>
    </body>
    </html>
    
  • 在package.json里添加启动脚本:
    "scripts": {
      "start": "electron ."
    }
    
  • 运行npm start,就能看到你的动态壁纸在后台运行了,完全支持Web的所有特性,还能调用Node.js API。

2. 使用NW.js(另一个Chromium+Node.js框架)

NW.js和Electron类似,也是把Web技术和Node.js结合的桌面框架,实现方式大同小异,核心也是创建一个桌面层级的窗口。

核心配置(package.json):

{
  "name": "wallpaper-app",
  "version": "1.0.0",
  "main": "wallpaper.html",
  "window": {
    "width": 1920,
    "height": 1080,
    "frame": false,
    "transparent": true,
    "show_in_taskbar": false,
    "position": "center",
    "type": "desktop"
  },
  "nodejs": true
}

然后在wallpaper.html里同样可以直接使用Node.js API,逻辑和Electron的渲染进程一致。

3. 进阶:优化体验的小技巧

如果想更贴近GeekTool的体验,比如随系统启动、自动适应屏幕分辨率,可以在Electron里添加这些功能:

  • 随系统启动:在main.js里添加:
    app.setLoginItemSettings({
      openAtLogin: true
    });
    
  • 监听屏幕分辨率变化,自动调整窗口大小:
    const { screen } = require('electron');
    screen.on('display-metrics-changed', () => {
      const { width, height } = screen.getPrimaryDisplay().workAreaSize;
      wallpaperWindow.setSize(width, height);
    });
    

内容的提问来源于stack exchange,提问作者iHack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:24:40