Запустите javascript в "изолированном мире" (хром)

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

Причина этого связана с двумя вещами:

  • Расширения Chrome не могут регистрировать пользовательские элементы из сценариев контента
  • Расширение расширения chrome не поддерживает импорт HTML, работающий в изолированной среде, только javascript

Из-за этих ограничений мне пришлось прибегать к загрузке моих компонентов на главную страницу <head> как описанную здесь.

Очевидная проблема, с которой я столкнулся, заключается в том, что мой javascript вступает в конфликт с javascript на главной странице сайта [на некоторых сайтах], поскольку метод, который я использую для ввода моих зависимостей, не запускается в "изолированном мире".

До сих пор я разрешил большинство этих проблем, поставив задачу gulp переименовать Polymer и мои компоненты во избежание конфликтов, но, к сожалению, он не идеален и необходим более надежный подход.

Наконец, на мой вопрос: возможно ли создать "изолированный мир" для моего javascript? Возможно, другой объект документа? Если нет, есть ли какие-либо стратегии, которые я могу использовать для обеспечения того, чтобы мой код выполнялся изолированно?

Update:

Несколько из вас предложили использовать IIFE, что я использовал до сих пор. Я ищу ответ в соответствии с изолированным миром, похожим на то, как google chrome запускает расширения. Это связано главным образом с тем, что Полимер должен быть присоединен к глобальному объекту окна.

Ответ 1

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

Итак, если вы введете следующий код с помощью IIFE - сразу вызывается выражение функции -

var someVar = 'this one "conflicts" with page js';
(function(){
    var someVar = 'this one does not "conflict" with page js'; //shadows someVar above
    console.log(someVar);
})();
console.log(someVar);

вы увидите, что доступ к someVar возвращает разные значения.

Как часть вашего введенного кода вы можете теневой "конфликтующие" переменные таким образом, как Polymer.

Импортируйте желаемую версию внутри IIFE с чем-то вроде CommonJS require() и продолжайте доступ к чему-либо еще из родительской области.

Ответ 2

Для определения:

Изолированные области

Широко известны как IIFE, который является шаблоном проектирования для "закрытия" javascript.

Изолированный мир

Или, например, "изолированные миры", как описано диполем, автором вопроса, приложениями javascript, которые работают в одной среде, но не знают друг о друге.

Возможный ответ

На этот вопрос уже ответил здесь.

Мое предложение

Хотя "Изолированный мир" не является "вещью" в javascript, или, по крайней мере, до недавнего времени, и в духе предоставления возможного решения взгляните на Динамический Script Загрузка.

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

Ответ 3

Для чего это стоит, iframe довольно изолированы:)

Вместо того, чтобы добавлять Polymer непосредственно на главную страницу <head>, попробуйте создать <iframe> на главной странице и добавьте Полимер и другие веб-компоненты во внутренний документ <iframe>.

Вы можете либо создать контент <iframe> динамически, либо попытаться ссылаться (src="") на HTML файл в своем расширении (не уверен, что SOP может быть в пути).

(Вы можете сделать iframe прозрачным и наложить его туда, где хотите).

Надеюсь, что это работает/помогает.

Ответ 4

просто предложение: вы можете попробовать обслужить рабочих. Запустите свой javascript в отдельном потоке и используйте там свои собственные библиотеки.