![](/img/trans.png)
[英]How to subscribe to topics with web browser using Firebase Cloud Messaging
[英]How to include firebase cloud messaging into ReactJS project using webpack
我已經嘗試在我的ReactJS Webpack項目中實施FCM一周了。 我能夠生成一個服務工作者文件,如果我是正確的話,該文件包含正確的功能,可以從雲中接收Firebase通知,但是什么也沒發生。 我已經以多種方式進行了嘗試,但是現在我陷入了一種困惑:不知道我的webpack配置是否錯誤,或者服務工作者文件缺少某些內容。 我已經閱讀了SO等所有教程和問題,但對我沒有任何幫助。
這是我的webpack.config.js文件:
var path = require('path');
var util = require('util');
var autoprefixer = require('autoprefixer-core');
var pkg = require('../package.json');
var merge = require('webpack-merge');
var loaders = require('./loaders');
var plugins = require('./plugins');
var DEBUG = process.env.NODE_ENV === 'development';
var TEST = process.env.NODE_ENV === 'test';
var jsBundle = path.join('js', util.format('[name].%s.js', pkg.version));
var entry = {
app: ['whatwg-fetch', './app.jsx'],
sw: ['../app/sw.js']
};
if (DEBUG) {
entry.app.push(
util.format(
'webpack-dev-server/client?http://%s:%d',
pkg.config.devHost,
pkg.config.devPort
)
);
entry.app.push('webpack/hot/dev-server');
}
var common = {
entry: entry,
output: {
path: path.resolve(pkg.config.buildDir),
publicPath: '/',
filename: jsBundle,
pathinfo: false
}
};
var config;
switch (process.env.NODE_ENV) {
case 'production':
config = merge(
common, {
externals: {
'bootstrap': 'bootstrap',
'font-awesome': 'font-awesome',
'material-design-icons': 'material-design-icons'
},
context: path.join(__dirname, '../app'),
target: 'web',
devtool: false,
entry: entry,
output: {
path: path.resolve(pkg.config.buildDir),
publicPath: '/',
filename: path.join('js', util.format('[name].[hash].%s.js', pkg.version)),
pathinfo: false
},
module: {
loaders: loaders
},
postcss: [
autoprefixer
],
plugins: plugins,
resolve: {
extensions: ['', '.js', '.json', '.jsx']
}
}
);
break;
case 'development':
console.log(entry);
console.log(jsBundle);
config = merge(
common, {
context: path.join(__dirname, '../app'),
cache: DEBUG,
debug: DEBUG,
target: 'web',
devtool: DEBUG || TEST ? 'inline-source-map' : false,
entry: entry,
output: {
path: path.resolve(pkg.config.buildDir),
publicPath: 'http://localhost:8000/',
filename: jsBundle,
pathinfo: false
},
module: {
loaders: loaders
},
postcss: [
autoprefixer
],
plugins: plugins,
resolve: {
extensions: ['', '.js', '.json', '.jsx']
},
devServer: {
contentBase: path.resolve(pkg.config.buildDir),
hot: true,
noInfo: false,
inline: true,
stats: { colors: true },
disableHostCheck: true,
watchOptions: {
aggregateTimeout: 300,
poll: 1000 // is this the same as specifying --watch-poll?
},
historyApiFallback: true,
proxy: [{}] I have some proxies here
}
}
);
break;
}
module.exports = config;
我在運行網頁時擁有的用於Firebase消息傳遞的文件(具有焦點):
import * as firebase from 'firebase';
const messaging = {};
if ('serviceWorker' in navigator) {
console.log('Service worker supported!');
if(firebase.apps.length < 1) {
var config = {
apiKey: '***********************',
authDomain: '*****.firebaseapp.com',
databaseURL: 'https://*****.firebaseio.com',
projectId: '*****',
storageBucket: '*****.appspot.com',
messagingSenderId: '*****'
};
firebase.initializeApp(config);
}
messaging = firebase.messaging();
navigator.serviceWorker.register('js/sw.js').then(function(registration) {
messaging.useServiceWorker(registration);
}).catch(function(err) {
console.log(err);
});
messaging.onMessage(function(payload) {
console.log('Message received. ', payload);
});
} else {
console.log('Service worker not supported!');
}
export default messaging;
然后我的sw.js文件
import * as firebase from 'firebase';
const messaging = {};
if ('serviceWorker' in navigator) {
console.log('Service worker supported!');
if(firebase.apps.length < 1) {
var config = {
apiKey: '***********************',
authDomain: '*****.firebaseapp.com',
databaseURL: 'https://*****.firebaseio.com',
projectId: '*****',
storageBucket: '*****.appspot.com',
messagingSenderId: '*****'
};
firebase.initializeApp(config);
}
messaging = firebase.messaging();
navigator.serviceWorker.register('js/sw.js').then(function(registration) {
messaging.useServiceWorker(registration);
}).catch(function(err) {
console.log(err);
});
messaging.setBackgroundMessageHandler(function(payload) {
console.log('[sw.js] Received background message ', payload);
});
} else {
console.log('Service worker not supported!');
}
最后是我的構建目錄js文件夾(捆綁的源代碼和serivceworker文件)中的內容的屏幕截圖:
編輯。 我遇到各種不同的錯誤,一種是serviceworker文件具有不受支持的mime類型,還有一種是Firebase錯誤。 它們在chrome控制台中看起來像這樣(我拿走了一些東西,這給出了這些基本思想):
"sw.fdf7b8aa233366ebfb8e.1.1.1.js:5 Uncaught e"
"FirebaseError: Messaging: This method is available in a service worker context. (messaging/only-available-in-sw)
app.fdf7b8aa233366ebfb8e.1.1.1.js:28
The script has an unsupported MIME type ('text/html').
/js/sw.js Failed to load resource: net::ERR_INSECURE_RESPONSE
我已經嘗試了幾周相同的事情,發現從sw-precache-webpack-plugin'或worbox生成的webpack服務工作程序在導入腳本時遇到了問題,而GitHub問題卻沒有明確的解決方案,Google愚蠢的是,任何人的文檔都沒有,無論是初學者還是業余愛好者,他們都缺乏理解人類學習曲線的能力。 我正在嘗試制作自己的服務人員並生成它們,所以請遠離firebase,這對於firebase無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.