Jak*_*ake 22 import module synchronous requirejs
我想定义一个计算新依赖项的模块,获取它然后返回结果.像这样:
define(['defaults', 'get_config_name'], function(defaults, get_config_name) {
var name = get_config_name();
var config;
require.synchronous([configs / '+name'], function(a) {
config = defaults.extend(a);
});
return config;
});
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点或更好的方法来解决这个问题?
Max*_*kov 18
您可以尝试使用同步RequireJS调用 require('configs/'+get_config_name())
,但只有在已经加载时才会同步加载模块,否则会引发异常.同步加载模块/ JavaScript文件在技术上是不可能的.
UPD: 这是可能的(参见Henrique的回答)但非常不推荐.它会阻止导致冻结整个页面的JavaScript执行.因此,RequireJS不支持它.
从您的用例看来,您似乎不需要同步RequireJS,您需要异步返回结果. AMD模式允许定义依赖关系并异步加载它们,但模块的工厂函数必须同步返回结果.解决方案可能是使用loader插件(此处和此处的详细信息):
// config_loader.js
define(['defaults', 'get_config_name'], function(defaults, get_config_name) {
return {
load: function (resourceId, require, load) {
var config_name = 'configs/' + get_config_name();
require([config_name], function(config) {
load(defaults.extend(config));
})
}
}
});
// application.js
define(['config_loader!'], function(config) {
// code using config
});
Run Code Online (Sandbox Code Playgroud)如果get_config_name()
包含简单的逻辑并且不依赖于其他模块,则更好和更简单的是计算飞行路径配置选项,或者如果您的配置依赖于上下文 - 映射配置选项.
function get_config_name() {
// do something
}
require.config({
paths: {
'config': 'configs/' + get_config_name()
}
});
require(['application', 'defaults', 'config'], function(application, defaults, config) {
config = defaults.extend(config);
application.start(config);
});
Run Code Online (Sandbox Code Playgroud)Hen*_*que 15
同步加载JavaScript在技术上是不可能的.
function loadJS(file){
var js = $.ajax({ type: "GET", url: file, async: false }).responseText; //No need to append
}
console.log('Test is loading...');
loadJS('test.js');
console.log('Test was loaded:', window.loadedModule); //loadedModule come from test.js
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
30520 次 |
最近记录: |