有没有办法根据模块是否为 404s 通过 RequireJS 有条件地加载模块?
Is there a way to conditional load a module via RequireJS based on whether or not the module 404s?
问题:
我们目前有以下 require.config:
require.config({
paths: {
lodash: '/embed/lodash',
utils: '/embed/utils',
analytics: '/external/analytics'
}
});
以embed
开头的文件路径保证存在。
以 external
开头的文件路径可能可用也可能不可用,具体取决于环境。
如果我用以下内容开始 main.js:
require(['lodash', 'utils', 'analytics'], function (_, utils, analytics) {
并且无法找到分析,整个事情崩溃了(正如预期的那样)。
尝试对以下内容进行变体证明是徒劳的:
require(['lodash', 'utils'], function (_, utils) {
...code and stuff
$.ajax({ url: '/path/to/actual/file' })
.done(function () {
require(['analytics'], function (analytics) {
// throws Mismatched anonymous define() module Error
});
})
.fail(function () {
// continue with stub of analytics
// or not run analytics dependent code
});
根据这个问题的标题:
有没有一种方法可以根据文件是否可访问有条件地将模块包含在 RequireJS 中?
如果你想在你的外部文件不可用时下载回退,你可以在requireJS中使用path fallback配置。
设置您的路径配置如下。
require.config({
paths: {
lodash: '/embed/lodash',
utils: '/embed/utils',
analytics: ['/external/analytics',
'/embed/analytics'
]
}
});
然后在嵌入目录中创建一个文件 analytics.js,它为您提供通常由外部分析返回的对象。如果 external/analytics 在全局命名空间中添加一个对象,也这样做。
embed/analytics.js
define(function(){
var analytics = window.analytics = {
send : function(){
//Nothing to do here.
}
//,... //Add more methods used by your code like send
}
return analytics;
});
来自我的同事,他为我的问题提供了正确的解决方案,并亲切地告诉我 RTFM:http://requirejs.org/docs/api.html#errbacks
保持"normal"声明require.config,只是添加一个错误回调来处理找不到模块的情况。
require(['lodash', 'utils'], function (_, utils) {
...code and stuff
require(['analytics'], function (analytics) {
// normal execution
}, function (error) {
// continue with stub of analytics
// or not run analytics dependent code at all
});
问题: 我们目前有以下 require.config:
require.config({
paths: {
lodash: '/embed/lodash',
utils: '/embed/utils',
analytics: '/external/analytics'
}
});
以embed
开头的文件路径保证存在。
以 external
开头的文件路径可能可用也可能不可用,具体取决于环境。
如果我用以下内容开始 main.js:
require(['lodash', 'utils', 'analytics'], function (_, utils, analytics) {
并且无法找到分析,整个事情崩溃了(正如预期的那样)。 尝试对以下内容进行变体证明是徒劳的:
require(['lodash', 'utils'], function (_, utils) {
...code and stuff
$.ajax({ url: '/path/to/actual/file' })
.done(function () {
require(['analytics'], function (analytics) {
// throws Mismatched anonymous define() module Error
});
})
.fail(function () {
// continue with stub of analytics
// or not run analytics dependent code
});
根据这个问题的标题: 有没有一种方法可以根据文件是否可访问有条件地将模块包含在 RequireJS 中?
如果你想在你的外部文件不可用时下载回退,你可以在requireJS中使用path fallback配置。
设置您的路径配置如下。
require.config({
paths: {
lodash: '/embed/lodash',
utils: '/embed/utils',
analytics: ['/external/analytics',
'/embed/analytics'
]
}
});
然后在嵌入目录中创建一个文件 analytics.js,它为您提供通常由外部分析返回的对象。如果 external/analytics 在全局命名空间中添加一个对象,也这样做。
embed/analytics.js
define(function(){
var analytics = window.analytics = {
send : function(){
//Nothing to do here.
}
//,... //Add more methods used by your code like send
}
return analytics;
});
来自我的同事,他为我的问题提供了正确的解决方案,并亲切地告诉我 RTFM:http://requirejs.org/docs/api.html#errbacks
保持"normal"声明require.config,只是添加一个错误回调来处理找不到模块的情况。
require(['lodash', 'utils'], function (_, utils) {
...code and stuff
require(['analytics'], function (analytics) {
// normal execution
}, function (error) {
// continue with stub of analytics
// or not run analytics dependent code at all
});