在我的应用程序中有动态部分从数据库加载为字符串,如下所示:
"define(['dependency1','dependency2'],function(){"+
" // function body" +
"})"
这只是一个简单的requireJS模块,作为一个字符串.我想使用async require调用延迟加载上面的脚本.所以,我的主要requireJS脚本如下所示:
require(["jquery"],function($){
$(document).ready(function(){
// logic to load specific script from database
var scriptString = functionToLoadTheStringAbove();
// ideally i would like to call it like this
require([scriptString],function(){
// scriptString,dependency1,dependency2 are loaded
}
});
});
如何在requireJS中加载这些字符串?我知道文本插件,但它只允许从文件加载.我尝试了eval,但它没有正确解决依赖关系.
最佳答案
这已经很晚了,但我只是在这里发布我的解决方案,万一有人需要.
所以我最后在requireJS论坛上询问并检查了text! plugin和json! plugin的源代码.在RequireJS中从String加载模块的最简单方法是使用自己的插件加载String,然后使用onLoad.fromText()来评估你的String并解决所有问题.依赖.
define([],function(){
var db = new Database(); // string is loaded from LocalStorage
return {
load: function(name,req,onLoad,reqConfig){
db.get(name,function(err,scriptString){
if (err) onLoad(err);
else onLoad.fromText(scriptString);
});
}
}
});
然后你可以使用插件,如:
require(["jquery","db!myScript"],function($,myScript){
// jQuery,myScript and its dependencies are loaded from database
});
注意:
>没有eval,没有办法从String得到require().这就是onLoad.fromText()在内部的作用.因为eval是邪恶的,所以如果你知道你将要使用什么字符串eval(),你应该只使用它.如果您在浏览器扩展中使用它,则可能需要放宽CSP策略.
>要命名您的String模块,可以使用explicit naming syntax.这样,您的模块将始终具有相同的绝对名称.