Meteor项目中字符串形式导出函数的跨文件导入问题求助
解决Meteor项目中动态生成函数的导出问题
你想通过eval()执行包含ES模块导出语法的字符串,再在另一个文件导入这个动态函数对吧?直接用eval(code)确实行不通——Meteor的模块加载器是静态分析的,没法识别eval动态生成的export语句;而且export作为模块级语法,在普通eval的作用域里也不会被挂载到模块的导出对象上。
给你两种可行的解决方案:
方案一:提取动态函数并手动导出
这种方法先执行字符串代码拿到函数引用,再手动导出,完美兼容ES模块语法:
在文件A中:
const code = "export function hello() { //content of the function }"; // 创建执行上下文,执行代码后返回hello函数 const getHelloFunction = new Function('', `${code}\nreturn hello;`); const hello = getHelloFunction(); // 正常导出这个动态生成的函数 export { hello };
然后在文件B中,和导入普通模块完全一样:
import { hello } from './path/to/fileA'; // 调用测试 hello();
方案二:改用CommonJS导出语法
如果你的项目兼容CommonJS(Meteor默认支持混合模块),可以修改code字符串的语法,直接通过eval挂载到module.exports上:
在文件A中:
// 把原ES模块导出改成CommonJS形式 const code = "module.exports.hello = function hello() { //content of the function }"; eval(code);
在文件B中依旧可以用ES模块导入:
import { hello } from './path/to/fileA'; hello();
重要提醒
务必保证code字符串的来源完全可信!eval()和new Function()都存在代码注入风险,如果字符串包含用户输入或不可信内容,很容易引发安全问题。
内容的提问来源于stack exchange,提问作者Jithin Ks
相关产品推荐
相关产品推荐

