Несколько файлов JS в расширении Chrome-как их загрузить?

Я написал расширение Chrome. Мое прошлое.файл js довольно большой, поэтому я хочу разделить его на меньшие части и загрузить указанные методы, когда это необходимо (какая-то ленивая загрузка).

Я сделал это с Firefox:

// ( call for load specified lib )
var libPath = redExt.basePath + 'content/redExt/lib/' + redExt.browser + '/' + libName + '.js';
var service = Components.classes["@mozilla.org/moz/jssubscript-loader;1"].getService(Components.interfaces.mozIJSSubScriptLoader);
service.loadSubScript("chrome://" + libPath);
// ( executing loaded file )

есть ли возможность сделать это подобным образом в браузерах на основе Webkit? Я нашел решения для того, как вводить несколько файлов JS в соответствующие страницы (используя manifest.json), но не могу найти способ включить JS файл только для расширения.

4 ответов


вы также можете сделать это чрезвычайно простым способом, который описан здесь: https://developer.chrome.com/extensions/background_pages#manifest

{
  "name": "My extension",
  ...
  "background": {
    "scripts": [
      "lib/fileone.js",
      "lib/filetwo.js",
      "background.js"
    ]
  },
  ...
}

вы не будете делать ленивую загрузку, но это позволит вам разбить код на несколько файлов и указать порядок, в котором они загружаются на фоновую страницу.


если вы хотите загрузить файл javascript в контексте фоновой страницы и хотите избежать использования eval, вы можете просто добавить script тег к DOM вашей фоновой страницы. Например, это работает, если ваши файлы присутствуют в расширения:

function loadScript(scriptName, callback) {
    var scriptEl = document.createElement('script');
    scriptEl.src = chrome.extension.getURL('lib/' + scriptName + '.js');
    scriptEl.addEventListener('load', callback, false);
    document.head.appendChild(scriptEl);
}

вы могли бы попытаться использовать веб-работников, наверное. В твоем прошлом.js, включить:

var worker = new Worker('new-script.js');

веб-рабочие могут порождать новых рабочих и даже иметь importScript ("new-script.js") метод.

веб-работники могут иметь тенденцию быть очень ограниченными, однако. Проверка здесь для большой статьи о веб-рабочих.

Я не знаю, будут ли они работать, однако. Другой вариант - использовать XMLHTTPRequest (AJAX) для динамического извлечения скрипта и его оценки. Свыше однако соединение без HTTPS, вероятно, заблокировано из-за атак "человек в середине". Кроме того, вы можете заставить Chrome использовать скрипт eval из незашифрованного соединения (но не делайте этого), добавив это в manifest.json:

"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
"permissions": ["http://badpractic.es/insecure.js"]

посмотреть загрузить удаленную веб-страницу в фоновом режиме: расширение Chrome для более глубокого обсуждения метода AJAX.

таким образом, ваши варианты, похоже, ограничены.

Это, конечно, загружает их всех на после:

{
  "name": "My extension",
  ...
  "background": {
    "scripts": ["background.js","background2.js","background3.js"] //and so on
  },
  ...
}

нашли возможное решение. Theres простая реализация метода RequireJS main требует, который использует трассировку обратного вызова JavaScript для поиска события для загрузки основного файла расширения и привязки выполняет его с контекстом расширения. https://github.com/salsita/browser-require/blob/master/require.js

похоже, что это работает, но у этого решения есть несколько минусов:

  • сообщения об ошибках сообщаются в "строке 1, столбец 1", поскольку это решение вводит код непосредственно в func.call - отладка очень сложно
  • загруженные JS-файлы не отображаются в консоли / chromebug
  • если текущая вкладка использует HTTPS Chrome будет запретить скрипты evaling, особенно от местных условий (file:///), поэтому иногда это просто не работает, как ожидалось