如何在Chrome扩展程序中使用Require.JS时触发chrome.runtime.onInstalled

时间:2015-01-01 00:10:30

标签: javascript google-chrome events google-chrome-extension requirejs

我在安装扩展程序时遇到设置代码时遇到问题。我正在使用chrome.runtime.onInstalled,这是Chrome开发人员提供的建议'页面,但它没有开火。似乎这个问题与Require.JS的使用有关。这是我的代码:

requirejs.config({...});// i'll not reproduce the whole config here for brevity

// Define the Global Object that will hold the extension functionality
var EXT = EXT || {};

// Start the main app logic.

requirejs(['chrome.storage', 'chrome.settings', 'chrome.tabs'],
function (chromeStorage, chromeSettings, chromeTabs) {
    'use strict';

    var getLocalRepos;

    /**
     * Executes the callback with an array of repositories as the parameter.
     * @param {function} callback
     */
    getLocalRepos = function (callback) {
        'use strict';

        chromeStorage.get('localRepos', callback);
    };

    // Take care of the extension lifecycle.
    chrome.runtime.onInstalled.addListener(function (details) {
        "use strict";

        // Create dummy data to populate the local storage for testing purposes.
        var dummyData = [
            {
                name: 'repo1',
                description: 'description1',
                username: 'reydel',
                age: 'theAge'
            },
            {
                name: 'repo2',
                description: 'description2',
                username: 'reydel',
                age: 'theAge'
            }
        ];

        switch (details.reason) {
            case 'install':
                chromeStorage.set({ localRepos: dummyData }, function () {
                    // Do nothing
                });
                break;
        }
    });

    // Bind all functions to an object in the Global Space to make them accessible from the outside scripts
    // referencing the BackgroundPage object
    window.EXT.getLocalRepos = getLocalRepos;
});

我在控制台中使用了侦听器回调中的代码并且它有效,只是事件没有被触发。

关于如何解决这个问题的任何想法?有人以前做过吗?

1 个答案:

答案 0 :(得分:5)

加载代码后会直接触发chrome.runtime.onInstalled事件。当您异步添加事件侦听器时,添加事件侦听器时已分派onInstalled事件。

要解决此问题,您必须使应用的初始化同步。不幸的是,require.js被设计为异步脚本加载器。修改此库以使其同步是可能的,但是浪费了努力而没有任何好处。

要在Chrome扩展程序中使用require-style模块(AMD),我强烈建议您使用组合脚本的中间构建步骤(例如r.jsgrunt-contrib-requirejs)和{{3作为脚本加载器。与require.js相反,almond.js 支持支持同步加载。

这是一个配置示例,可用于构建名为all.js的单个文件,其中包含almond.js(作为脚本加载器),并使用mymain.js作为入口点(主要剧本):

({
    name: 'mymain',
    out: 'all.js',
    include: [
        'almond'
    ],

    skipModuleInsertion: true,
    wrap: {
        start: '(function(){',
        // true = load synchronously. This is a feature of almond.js
        end: 'require(["mymain"], null, null, true);})();'
    }
})

为了避免名称空间污染,我将代码包装在一个n立即调用的函数表达式中。如果您希望模块在全局命名空间中可用(例如,用于调试),只需删除(function(){})();

有关这些配置选项的文档(以及更多信息),请参阅almond.js


试试上一个例子:

  1. 安装r.jsnpm install -g requirejs
  2. 将以前的配置保存为myfancyname.build.js
  3. 创建一个名为mymain.js的脚本:define(function() { ... }); (这是一个没有依赖关系的简单https://github.com/jrburke/r.js/blob/master/build/example.build.js。如果想要了解有关其他类型模块的更多信息,请阅读require.js文档,例如module definition)。
  4. 运行r.js编译文件:r.js -o myfancyname.build.js
  5. 现在您有一个名为all.js的文件可以加载,例如在Chrome扩展程序的清单文件中使用"background": { "scripts": ["all.js"] }