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

OpenWrt Luci导入外部JavaScript文件报错求助

Luci模块变量提取复用的正确实现方式

问题背景

需要将Luci插件中的graph_objects变量提取到独立文件实现复用,当前使用L.resource导入时报错:

TypeError
"statistics.rrdtool.definitions.graph_objects" factory yields invalid constructor

同时尝试过ES6的import/export和Node.js的module.exports/require语法,均无法正常工作。

错误原因

Luci的模块加载系统要求被L.resource加载的模块必须返回可实例化的构造函数(通常继承自baseclass),直接返回普通对象会被当作构造函数处理,从而触发"无效构造函数"的错误。此外,Luci环境不支持原生ES6模块或Node.js的CommonJS规范,所以其他导入导出语法无法被识别。

正确实现方案

方案1:基于类的属性导出(推荐,符合Luci规范)

修改graph_objects.js,将复用数据挂载到继承自baseclass的类的静态属性上:

'use strict';
'require baseclass';
'require uci';

const graph_objects = { 
    // 你的数据内容
};

// 返回继承自baseclass的类,将数据作为静态属性暴露
return class GraphObjects extends baseclass {
    static get data() {
        return graph_objects;
    }
};

在gauges.js中导入并使用:

var GraphObjects = L.resource('statistics/rrdtool/definitions/graph_objects.js');
// 通过类静态属性获取复用数据
var graph_objects = GraphObjects.data;

方案2:工厂函数返回数据(适合纯数据场景)

如果不需要继承baseclass,可以返回一个工厂函数直接返回数据:

'use strict';
'require baseclass';
'require uci';

const graph_objects = { 
    // 你的数据内容
};

// 返回工厂函数,调用后返回数据对象
return function() {
    return graph_objects;
};

在gauges.js中导入并使用:

var getGraphObjects = L.resource('statistics/rrdtool/definitions/graph_objects.js');
var graph_objects = getGraphObjects();

其他尝试的问题说明

  • ES6 import/export:Luci前端环境未实现原生ES6模块加载,语法不被支持。
  • Node.js module.exports/require:Luci模块系统与CommonJS规范不兼容,无法识别此类写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:58:21