15

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

Я сделал это с 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) 

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

ответ

1

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

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

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

Вы правы, это действительно хорошее расширение. Более или менее хорошая реализация метода AJAX. Конечно, вы можете разрешить небезопасное удаление скриптов, но вы знаете, что это будет своего рода недоверием для всех пользователей, загружающих ваше расширение. Удачи. – mdenton8

+0

Просто интересно, с первой проблемой, не можете ли вы просто нажать F11 в инструментах разработчика Chrome, чтобы перейти к следующему вызову функции? – mdenton8

2

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

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

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

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

Я не знаю, будут ли они работать. Другой вариант использует XMLHTTPRequest (AJAX) для динамического извлечения сценария и оценки его. Однако через соединение, отличное от HTTPS, это, вероятно, заблокировано из-за нападений «человек в середине». В качестве альтернативы, вы можете заставить Chrome для Eval сценария из незашифрованного соединения (НО НЕ DO IT), добавив в manifest.json:

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

См Load remote webpage in background page: Chrome Extension для более глубокого обсуждения методы AJAX ,

Так что ваши варианты, кажется, ограничены.

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

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

О, извините, я не понимал, что вам нужна ленивая загрузка. Я посмотрю, извините – mdenton8

+0

Хорошо, но я хочу предотвратить загрузку сразу всех файлов. Мое расширение иногда не использует все методы, поэтому я хочу загрузить только то, что в настоящее время необходимо. В FireFox у меня есть метод 'use' (например,' storage = myExtension.use ('storage') 'который загружает'/lib/storage.js') и хочет создать аналогичное решение в Chrome/Safari :) –

+0

I дал вам еще несколько предложений. Проверьте мой ответ еще раз? -Matt – mdenton8

13

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

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); 
} 
+0

Итак, вы указываете фоновый рисунок вместо сценария, а затем добавляете скрипты на эту страницу? – mdenton8

+0

@ mdenton8 Вы включаете эту функцию в свой фоновый скрипт. Затем вы можете вызвать его для запуска скриптов на этой странице. – rsanchez

+0

@rsanchez это ответ устаревший? Не могли бы вы рекомендовать сделать это так, как предложил Омн в своем ответе с 2015 года? Или есть плюсы и минусы для обоих методов? – user5508297

20

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

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

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

+0

Я вижу, что вы пытаетесь сказать своим ответом, но это трудно понять (на что именно вы ссылаетесь на этой странице?). Крошечный фрагмент кода улучшит ваш ответ. Как есть, этот ответ «только для ссылок» и может быть удален. – Xan

+0

@Omn Каковы плюсы и минусы вашего метода в сравнении с тем, что предлагает rsanchez выше? – user5508297

Смежные вопросы