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
相关产品推荐
相关产品推荐

