在Chome扩展服务工作者清单中加载jQuery V3

发布于 2025-02-13 00:31:56 字数 7567 浏览 1 评论 0原文

我有一个扩展名,可以在其中通知添加到RSS feed阅读器中的新项目 所有这些都在V2中工作,但是V3我无法将jQuery加载到服务工作者中,因为Chrome不允许。

作为一个解决方法,我已将其添加为模块,

  "background": {
    "service_worker": "js/background.js","type": "module" 
  },

但仍然是一个问题,并表示参考:$未定义 在object.parsefeed

或有什么方法可以调整我的代码以读取XML而不jQuery?

import $ as module from 'js/jquery-2.1.4.min.js';

var Storage = (function() {
    return {
        getFeeds: function(callback, returnArray, sortArray) {
            returnArray = typeof returnArray !== 'undefined' ? returnArray : true;
            sortArray = typeof sortArray !== 'undefined' ? sortArray : true;

            chrome.storage.sync.get(function(dataObject) {
                var result = dataObject;

                if (returnArray) {
                    var feedArray = this.parseDataObjectIntoArray(dataObject);

                    result = sortArray ? this.sortArrayOfObjects(feedArray, 'position') : feedArray;
                } else {
                    delete result['RssR:Settings'];
                }

                callback(result)

            }.bind(this));
        },
        getFeedByUrl: function(feedUrl, callback) {
            chrome.storage.sync.get(feedUrl, function(feedData) {
                callback(feedData[feedUrl]);
            });
        },
        removeFeedByUrl: function(feedUrl) {
            chrome.storage.sync.remove(feedUrl);
        },
        saveFeedData: function(feedData) {
            var saveFeed = {};
            saveFeed[feedData.url] = feedData;

            this.setDataObject(saveFeed);
        },
        parseDataObjectIntoArray: function(object) {
            var array = [];

            Object.keys(object).forEach(function(objectKey) {
                if (objectKey.indexOf('RssR:Settings') !== 0) {
                    array.push(object[objectKey]);
                }
            });

            return array;
        },
        sortArrayOfObjects: function(array, sortKey) {
            array.sort(function(a, b) {
                if (typeof a[sortKey] === 'undefined') {
                    return true;
                } else if (typeof b[sortKey] === 'undefined') {
                    return false;
                }
                return a[sortKey] - b[sortKey];
            });

            return array;
        },
        clearAllData: function() {
            chrome.storage.sync.clear();
        },
        setDataObject: function(dataObject) {
            chrome.storage.sync.set(dataObject);
        }
    }
}());


Array.prototype.max = function() {
    return Math.max.apply(null, this);
};

function msToTime(ms) {
    let seconds = (ms / 1000).toFixed(1);
    let minutes = (ms / (1000 * 60)).toFixed(1);
    let hours = (ms / (1000 * 60 * 60)).toFixed(1);
    let days = (ms / (1000 * 60 * 60 * 24)).toFixed(1);
    if (seconds < 60) return seconds + " Sec";
    else if (minutes < 60) return minutes + " Min";
    else if (hours < 24) return hours + " Hrs";
    else return days + " Days"
}

var FeedService = (function() {
    return {
        downloadFeed: function(feed) {
            if (!feed.url) {
                return;
            }

            console.log(feed.url)




            fetch(feed.url)
                .then(response => response.text())
                .then(xmlString => {
                        console.log(xmlString)

                        this.parseFeed(xmlString, feed);
                    }

                )
                .then(data => console.log(data))




        },
        parseFeed: function(rawData, existingFeedData) {
            var newFeedData = {};
            var $feedEntries = $(rawData).find("entry").length > 0 ? $(rawData).find("entry") : $(rawData).find('item');
            var lastUpdate = Date.now()
            console.log("Now = " + lastUpdate)

            lastUpdate = (existingFeedData && existingFeedData.lastUpdate) || Date.now()

            console.log("Last Update = " + lastUpdate)
            console.log("existingFeedData = " + JSON.stringify(existingFeedData))
            pubDates = [];

            $feedEntries.each(function(index, elm) {
                pubDates.push(new Date($(elm).find("pubDate").text()).getTime())
                if (lastUpdate < new Date($(elm).find("pubDate").text()).getTime()) {
                    console.log($(elm).find("title").text().substring(0, 20));
                    chrome.notifications.create(
                        $(elm).find("link").text(), {
                            type: "basic",
                            iconUrl: "../icons/254.png",
                            title: $(elm).find("title").text(),
                            message: "(" + msToTime((Date.now() - new Date($(elm).find("pubDate").text()).getTime())) + ") ",
                            requireInteraction: true
                        },
                        function() {}
                    );

                }
            }.bind(this));
            console.log("Max date = " + Math.max.apply(null, pubDates))
            existingFeedData.lastUpdate = Math.max.apply(null, pubDates);
            Storage.saveFeedData(existingFeedData);
        },

        getUrlForFeed: function($feed, feedSettings) {
            if (feedSettings.linkType && $feed.find(feedSettings.linkType).length > 0) {
                return $feed.find(feedSettings.linkType).text();
            } else if ($feed.find('link').length == 1) {
                return $feed.find('link').text();
            } else {
                if ($feed.find('link[rel="shorturl"]').length > 0) {
                    return $feed.find('link[rel="shorturl"]').attr('href');
                } else if ($feed.find('link[rel="alternate"]').length > 0) {
                    return $feed.find('link[rel="alternate"]').attr('href');
                } else if ($feed.find('link[rel="related"]').length > 0) {
                    return $feed.find('link[rel="related"]').attr('href');
                } else {
                    return $feed.find('link').first();
                }
            }
        },
        saveFeed: function(existingFeedData, newFeedData) {
            ;
        },
        updateReadStatusOfNewItems: function(oldItems, newItems) {
            if (typeof oldItems === 'undefined' || Object.keys(oldItems).length == 0 || Object.keys(newItems).length == 0) {
                return newItems;
            }
            Object.keys(newItems).forEach(function(url) {
                if (oldItems[url]) {
                    newItems[url].unread = oldItems[url].unread;
                }
            });
            return newItems;
        },
        setNewBadge: function() {
            chrome.browserAction.setBadgeText({
                text: 'NEW'
            });
        }
    };
}());


chrome.alarms.onAlarm.addListener(function(alarm) {
    if (alarm.name == 'updateRssFeeds') {
        console.log("Called!")
        updateRssFeeds();
    }
});

chrome.notifications.onClicked.addListener(function(notificationId) {
    chrome.tabs.create({
        url: notificationId
    });
});

chrome.runtime.onInstalled.addListener(onInstall);

function onInstall() {
    chrome.runtime.openOptionsPage();
    chrome.alarms.create('updateRssFeeds', {
        when: 0,
        periodInMinutes: 1
    });
}

function updateRssFeeds() {
    Storage.getFeeds(function(feeds) {
        feeds.forEach(function(feed) {
            FeedService.downloadFeed(feed);
        });
    }, true, false)
}

I am having a extension where it can notify about new items added to RSS feed reader
All works in v2, but v3 I am unable to load jquery into service worker, since chrome doesnt allow.

As a workaround I have added as module

  "background": {
    "service_worker": "js/background.js","type": "module" 
  },

But still its a issue and says ReferenceError: $ is not defined
at Object.parseFeed

Or is there a way I can tweak my code to read xml without jquery?

import $ as module from 'js/jquery-2.1.4.min.js';

var Storage = (function() {
    return {
        getFeeds: function(callback, returnArray, sortArray) {
            returnArray = typeof returnArray !== 'undefined' ? returnArray : true;
            sortArray = typeof sortArray !== 'undefined' ? sortArray : true;

            chrome.storage.sync.get(function(dataObject) {
                var result = dataObject;

                if (returnArray) {
                    var feedArray = this.parseDataObjectIntoArray(dataObject);

                    result = sortArray ? this.sortArrayOfObjects(feedArray, 'position') : feedArray;
                } else {
                    delete result['RssR:Settings'];
                }

                callback(result)

            }.bind(this));
        },
        getFeedByUrl: function(feedUrl, callback) {
            chrome.storage.sync.get(feedUrl, function(feedData) {
                callback(feedData[feedUrl]);
            });
        },
        removeFeedByUrl: function(feedUrl) {
            chrome.storage.sync.remove(feedUrl);
        },
        saveFeedData: function(feedData) {
            var saveFeed = {};
            saveFeed[feedData.url] = feedData;

            this.setDataObject(saveFeed);
        },
        parseDataObjectIntoArray: function(object) {
            var array = [];

            Object.keys(object).forEach(function(objectKey) {
                if (objectKey.indexOf('RssR:Settings') !== 0) {
                    array.push(object[objectKey]);
                }
            });

            return array;
        },
        sortArrayOfObjects: function(array, sortKey) {
            array.sort(function(a, b) {
                if (typeof a[sortKey] === 'undefined') {
                    return true;
                } else if (typeof b[sortKey] === 'undefined') {
                    return false;
                }
                return a[sortKey] - b[sortKey];
            });

            return array;
        },
        clearAllData: function() {
            chrome.storage.sync.clear();
        },
        setDataObject: function(dataObject) {
            chrome.storage.sync.set(dataObject);
        }
    }
}());


Array.prototype.max = function() {
    return Math.max.apply(null, this);
};

function msToTime(ms) {
    let seconds = (ms / 1000).toFixed(1);
    let minutes = (ms / (1000 * 60)).toFixed(1);
    let hours = (ms / (1000 * 60 * 60)).toFixed(1);
    let days = (ms / (1000 * 60 * 60 * 24)).toFixed(1);
    if (seconds < 60) return seconds + " Sec";
    else if (minutes < 60) return minutes + " Min";
    else if (hours < 24) return hours + " Hrs";
    else return days + " Days"
}

var FeedService = (function() {
    return {
        downloadFeed: function(feed) {
            if (!feed.url) {
                return;
            }

            console.log(feed.url)




            fetch(feed.url)
                .then(response => response.text())
                .then(xmlString => {
                        console.log(xmlString)

                        this.parseFeed(xmlString, feed);
                    }

                )
                .then(data => console.log(data))




        },
        parseFeed: function(rawData, existingFeedData) {
            var newFeedData = {};
            var $feedEntries = $(rawData).find("entry").length > 0 ? $(rawData).find("entry") : $(rawData).find('item');
            var lastUpdate = Date.now()
            console.log("Now = " + lastUpdate)

            lastUpdate = (existingFeedData && existingFeedData.lastUpdate) || Date.now()

            console.log("Last Update = " + lastUpdate)
            console.log("existingFeedData = " + JSON.stringify(existingFeedData))
            pubDates = [];

            $feedEntries.each(function(index, elm) {
                pubDates.push(new Date($(elm).find("pubDate").text()).getTime())
                if (lastUpdate < new Date($(elm).find("pubDate").text()).getTime()) {
                    console.log($(elm).find("title").text().substring(0, 20));
                    chrome.notifications.create(
                        $(elm).find("link").text(), {
                            type: "basic",
                            iconUrl: "../icons/254.png",
                            title: $(elm).find("title").text(),
                            message: "(" + msToTime((Date.now() - new Date($(elm).find("pubDate").text()).getTime())) + ") ",
                            requireInteraction: true
                        },
                        function() {}
                    );

                }
            }.bind(this));
            console.log("Max date = " + Math.max.apply(null, pubDates))
            existingFeedData.lastUpdate = Math.max.apply(null, pubDates);
            Storage.saveFeedData(existingFeedData);
        },

        getUrlForFeed: function($feed, feedSettings) {
            if (feedSettings.linkType && $feed.find(feedSettings.linkType).length > 0) {
                return $feed.find(feedSettings.linkType).text();
            } else if ($feed.find('link').length == 1) {
                return $feed.find('link').text();
            } else {
                if ($feed.find('link[rel="shorturl"]').length > 0) {
                    return $feed.find('link[rel="shorturl"]').attr('href');
                } else if ($feed.find('link[rel="alternate"]').length > 0) {
                    return $feed.find('link[rel="alternate"]').attr('href');
                } else if ($feed.find('link[rel="related"]').length > 0) {
                    return $feed.find('link[rel="related"]').attr('href');
                } else {
                    return $feed.find('link').first();
                }
            }
        },
        saveFeed: function(existingFeedData, newFeedData) {
            ;
        },
        updateReadStatusOfNewItems: function(oldItems, newItems) {
            if (typeof oldItems === 'undefined' || Object.keys(oldItems).length == 0 || Object.keys(newItems).length == 0) {
                return newItems;
            }
            Object.keys(newItems).forEach(function(url) {
                if (oldItems[url]) {
                    newItems[url].unread = oldItems[url].unread;
                }
            });
            return newItems;
        },
        setNewBadge: function() {
            chrome.browserAction.setBadgeText({
                text: 'NEW'
            });
        }
    };
}());


chrome.alarms.onAlarm.addListener(function(alarm) {
    if (alarm.name == 'updateRssFeeds') {
        console.log("Called!")
        updateRssFeeds();
    }
});

chrome.notifications.onClicked.addListener(function(notificationId) {
    chrome.tabs.create({
        url: notificationId
    });
});

chrome.runtime.onInstalled.addListener(onInstall);

function onInstall() {
    chrome.runtime.openOptionsPage();
    chrome.alarms.create('updateRssFeeds', {
        when: 0,
        periodInMinutes: 1
    });
}

function updateRssFeeds() {
    Storage.getFeeds(function(feeds) {
        feeds.forEach(function(feed) {
            FeedService.downloadFeed(feed);
        });
    }, true, false)
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文