我想使用require.js加載FB SDK。使用require.js和FB SDK
我的測試情況是這樣的:
test.js:
require([
'libs/facebook/fb'
], function(FB){
FB.api("/me", function(){});
));
我想有test.js FB SDK只加載後運行,並有FB準備它。
有關如何實現這一點的任何想法?我的包裝(libs/facebook/fb.js)有什麼?
我想使用require.js加載FB SDK。使用require.js和FB SDK
我的測試情況是這樣的:
test.js:
require([
'libs/facebook/fb'
], function(FB){
FB.api("/me", function(){});
));
我想有test.js FB SDK只加載後運行,並有FB準備它。
有關如何實現這一點的任何想法?我的包裝(libs/facebook/fb.js)有什麼?
它似乎並不像FB API是一個AMD模塊,所以它沒有以RequireJS習慣的方式定義自己。您將需要使用require.config填充FB API。我假設test.js是您作爲RequireJS的數據主要值提供的腳本。
require.config({
shim: {
'facebook' : {
exports: 'FB'
}
},
paths: {
'facebook' : 'libs/facebook/fb'
}
});
require(['facebook'], function(FB){
FB.api('/me', function(){});
});
您能否也許在此答案中添加更多詳細信息? libs/facebook/fb應包含哪些內容? 'FB.init()'代碼?對「https:// connect.facebook.net/en_US/all/debug.js」的引用? – 2013-04-08 16:00:33
libs/facebook/fb是fb模塊的路徑,或者在這種情況下是fb。js文件。 RequireJS假定一切都是模塊,並且不需要包含文件路徑的.js部分。它會自行檢測。 – 2013-04-09 06:41:19
對不起,還是有點困惑。你的意思是它的這個文件的文字副本:https://connect.facebook.net/en_US/all.js?如果是這樣,init代碼在哪裏?只需加載庫不足以調用'FB.api()' – 2013-04-09 13:25:18
或包裹在一個模塊中的初始化代碼(該示例使用道場):
define('facebook',
[ 'dojo/dom-construct',
'dojo/_base/window',
'https://connect.facebook.net/en_US/all/debug.js' ], // remove "/debug" in live env
function(domConstruct, win)
{
// add Facebook div
domConstruct.create('div', { id:'fb-root' }, win.body(), 'first');
// init the Facebook JS SDK
FB.init({
appId: '1234567890', // App ID from the App Dashboard
channelUrl: '//' + window.location.hostname + '/facebook-channel.html', // Channel File for x-domain communication
status: true, // check the login status upon init?
cookie: true, // set sessions cookies to allow your server to access the session?
xfbml: true // parse XFBML tags on this page?
});
// Additional initialization code such as adding Event Listeners goes here
console.log('Facebook ready');
return FB;
}
);
看起來像這裏添加'fb-root'元素的代碼運行得太晚了,因爲Facebook SDK在加載後查找該div,並在它不存在時自動創建它。 – 2013-02-06 16:57:50
你能解釋一下這段代碼嗎?這是否阻止'FB'被添加到'window'? @ DrakeHampton的評論是否正確?任何其他影響? – 2013-04-08 15:59:26
我正在做一些與此非常類似的事情(sans Dojo),但是當我調用'FB.init()'時,FB不可用。 – 2013-04-08 18:03:11
大廈voidstate's和Dzulqarnain Nasir's答案,這裏是我最終使用在我的項目中的代碼。
絆倒我最多的部分是FB.init()
顯然是異步的。在試圖啓動callback()
(沒有FB.getLoginStatus
)時,FB
尚未初始化,並且出現「An active access token must be used to query information about the current user.
」錯誤。
RequireJS沉配置
require.config({
// paths: { 'facebookSDK': '//connect.facebook.net/en_US/all/debug' }, // development
paths: { 'facebookSDK': '//connect.facebook.net/en_US/all' }, // production
shim: { 'facebookSDK': { exports: 'FB' } }
});
AMD模塊初始化Facebook的JS SDK
define(['facebookSDK'], function (FB) {
'use strict';
return function (settings, callback) {
var args = {
appId: settings.appId,
channelUrl: settings.channelUrl,
status: true,
cookie: true,
xfbml: true
};
console.log('Calling FB.init:', args);
FB.init(args);
if (callback && typeof (callback) === "function") {
// callback() // does not work, FB.init() is not yet finished
FB.getLoginStatus(callback);
}
};
});
這仍然沒有解決相當原來的問題的期望使用。
OP的代碼也許可以被改寫爲:
require(['libs/facebook/fb'], // where fb.js holds my above Module
function(FBinit){
FBinit({
appId: appId,
channelUrl: channelUrl
}, function(){
FB.api("/me", function(){});
});
}
);
這是不是很cleanas OP的原始概念,但它的我能想出的最好。如果有人有任何問題,我很樂意提供一些關於如何改進我的方法的反饋或建議。 RequireJS我還是很新的。
下面是來自Facebook的一個文件: https://developers.facebook.com/docs/javascript/howto/requirejs/
require.config({
shim: {
'facebook' : {
export: 'FB'
}
},
paths: {
'facebook': '//connect.facebook.net/en_US/all'
}
})
require(['fb']);
然後添加模塊是這樣的:
define(['facebook'], function(){
FB.init({
appId : 'YOUR_APP_ID',
channelUrl : '//yourdomain.com/channel.html'
});
FB.getLoginStatus(function(response) {
console.log(response);
});
});
編輯被拒絕評論說,在Facebook的手冊中有一個錯字聲明'require([ 'fb']);'應該'require(['facebook']);'。這可能是對的,所以值得評論。 – Popnoodles 2014-05-31 14:19:19
@Popnoodles:「require(['fb']);」是正確的。 fb是您創建的模塊文件的名稱。 – nfplee 2016-12-22 13:48:45
看起來像Facebook終於解決了這個,他們的解決方案看起來相當類似的一些這個問題的答案。 https://developers.facebook.com/docs/howto/javascript/requirejs/ – the0ther 2013-05-28 16:59:39