Underscore.js _.template вызывает ошибку от расширения Chrome
-
26-10-2019 - |
Вопрос
Если я использую подчеркиваетсяS. _.шаблон() Внутри расширения Google Chrome я получаю следующую ошибку в консоли:
Ошибка UNCAUNT: Генерация кода из строк запрещено для этого контекста
Есть ли способ преодолеть эту ошибку?
Решение
К сожалению, я не думаю, что вы можете использовать underscore.js's _.template () из расширения Chrome ... по крайней мере с новым Manifest.json версии 2. То же самое относится и к попытке использовать Плагин шаблона jQuery.
Из расширения Google Chrome Политика безопасности контента страница:
Не существует механизма для ослабления ограничения против выполнения встроенного JavaScript. В частности, установление политики сценария, которая включает в себя небезопасную линию, не будет иметь никакого эффекта. Это намеренно.
Я собираюсь посмотреть на другие шаблонные двигатели, которые, надеюсь, не будут использовать новая функция объект.
Другие советы
Большое спасибо участнику списка хрома, который указал, что для создания Function
объект в том, как подчеркивается, требуется manifest.json
вариант для content_security_policy
Включить «небезопасно».
В качестве примера, ваш manifest.json
может быть
{
"manifest_version": 2,
...
"content_security_policy": "script-src 'self' 'unsafe-eval'",
...
}
И тогда подчеркивая поведение будет работать, потому что эта политика позволяет это. Для получения дополнительной информации о формате см. Хромированную документацию по этой опции здесь.
я использую Underscore.js
потому что я хочу Backbone.js
Для расширения Chrome я только что изменил шаблонный двигатель на Mustache
~ Если у вас есть та же причина, вы также можете использовать underscore.js для основы, просто не используйте _.template()
функция
Google только что выпустил новый документ, обсуждающий решение этой проблемы?
http://code.google.com/chrome/extensions/trunk/sandboxingeval.html
Ограничения Manifest v2, как указано выше, запрещают использовать Eval, New Function и встроенные сценарии - даже при игре с политикой безопасности контента: Нет возможности ослабить эту политику безопасности в расширениях V2.
Большинство библиотек шаблонов используют в тот или иной момент, эвал. Одним из решений является переписывание ваших расширений, чтобы вся логика находилась в JavaScript, и ничего в шаблоне; решение, такое как Google Jstemplate в этом случае будет использоваться.
Есть, однако, возможность выполнять Eval и новую функцию внутри Песочница Iframe, например, со следующими строками в манифесте:
"sandbox": {
"pages": [
"page1.html",
"directory/page2.html"
]
},
Страница с песочницей не будет иметь доступа к расширению или приложениям API или прямому доступу к страницам, не связанным с сандбоками (она может общаться с ними через Postmessage ()). Вы можете дополнительно ограничить права на песочницу с помощью конкретного CSP
Теперь есть полный пример от команды Google Chrome на github eval в iframe о том, как обойти проблему, общаясь с мельчарной iframe, а также Короткий учебник по аналитике
Надеемся, что некоторая библиотека появится с использованием этого механизма, чтобы обеспечить полную совместимость со стандартными шаблонами, хотя я бы посоветовал удалить как можно больше логики из шаблонов по соображениям производительности ...
Благодаря Google, в линейке много переписываний расширения :(
Вы можете написать свой собственный мини-двигатель с помощью jQuery's $('<element .../>')
строительство.
Чистый путь:
function myElement(text) {
var d = $('<div class="abc"/>');
d.text(text);
return d;
}
myElement('my text').appendTo(domParent);
Грязный путь:
var yourTemplate = '<div>${somevar}</div>';
function instTemplate(tmpl, text) {
return $(tmpl.replace(/\$\{somevar\}/g, text));
}
instTemplate(yourTemplate, 'your text').appendTo(domParent);
Например, довольно быстро переписать простые шаблоны jquery.tmpl, используя грязный метод, если вы знаете, что данные о замене не вредны и т. Д.