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

Node.js运行ubo-core报错snfe.useLists is not a function

问题描述

安装ubo-core依赖包(执行安装命令npm install @gorhill/ubo-core)并导入项目后,无法正常使用StaticNetFilteringEngine实例。
代码文件为ublock.mjs,内容如下:

async function read(path) {
    return readFileSync(resolve(__dirname, path), 'utf8');
}

(async () => {
  try {
    const { StaticNetFilteringEngine } = await import('@gorhill/ubo-core');
    const snfe = StaticNetFilteringEngine.create();
    await snfe.useLists([
      read('./lists/badware.txt')
                    .then(raw => ({ name: 'badware', raw })),
    ]);

    // Not blocked
    if (snfe.matchRequest({
      originURL: 'https://www.bloomberg.com/',
      url: 'https://www.bloomberg.com/tophat/assets/v2.6.1/that.css',
      type: 'stylesheet'
    }) !== 0) {
      console.log(snfe.toLogData());
    }
  } catch (error) {
      console.log(error)
    }
})();

执行node ublock.mjs运行代码后,得到如下报错信息:

"snfe.useLists" is not a function

当前运行环境为NPM 8.12.1、Node.js 14.16.0,代码参照ubo-core官方npm文档中的示例编写。

报错原因
  • 核心问题:StaticNetFilteringEngine.create()是异步方法,调用时未加await,变量snfe实际是一个Pending状态的Promise对象,不是初始化完成的引擎实例,自然不存在useLists方法。
  • 运行环境不兼容:当前使用的Node.js 14.16.0版本过低,@gorhill/ubo-core稳定版要求Node.js 18及以上运行环境,低版本对ES2022+标准特性支持不全,即使修正await问题也会触发其他兼容报错。
  • 代码存在隐式依赖缺失:.mjs属于ES Module环境,默认没有CommonJS规范下的__dirname变量,也未导入readFileSync、resolve方法,执行到文件读取逻辑时会抛出引用错误。
修复方案
  • 先将Node.js升级到18.x或更高的LTS版本,低版本无兼容适配方案
  • 调用StaticNetFilteringEngine.create()时添加await,等待实例初始化完成后再执行后续操作
  • 补全ES Module环境下缺失的模块导入,手动实现__dirname兼容

修复后的完整可运行代码:

import { readFileSync } from 'node:fs';
import { resolve, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';

const __dirname = dirname(fileURLToPath(import.meta.url));

async function read(path) {
    return readFileSync(resolve(__dirname, path), 'utf8');
}

(async () => {
  try {
    const { StaticNetFilteringEngine } = await import('@gorhill/ubo-core');
    // 等待引擎实例初始化完成
    const snfe = await StaticNetFilteringEngine.create();
    await snfe.useLists([
      read('./lists/badware.txt')
                    .then(raw => ({ name: 'badware', raw })),
    ]);

    if (snfe.matchRequest({
      originURL: 'https://www.bloomberg.com/',
      url: 'https://www.bloomberg.com/tophat/assets/v2.6.1/that.css',
      type: 'stylesheet'
    }) !== 0) {
      console.log(snfe.toLogData());
    }

    // 释放引擎占用资源
    snfe.dispose();
  } catch (error) {
      console.log(error)
    }
})();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:30:48