Editar esto sigue siendo cierto para plain vanilla requieren .js, pero encontró una solución al bifurcar RequireJS
Github: https://github.com/jeroendelau/requirejs
Bower: glorieta instalar RequireJS-para-navegador-extensions
ORIGNAL POSTAL
inyectarlo en el guión de contenido es, con mucho, el más difícil. Y las respuestas anteriores son incompletas o incorrectas.
Antecedentes y emergente:
Ir con la respuesta anterior por @nafis, que van a trabajar
Contenido del guión
Esto es muy difícil, y esta parte de la api description es clave:
Execution environment
Content scripts execute in a special environment called an isolated world. They have access to the DOM of the page they are injected into, but not to any JavaScript variables or functions created by the page. It looks to each content script as if there is no other JavaScript executing on the page it is running on. The same is true in reverse: JavaScript running on the page cannot call any functions or access any variables defined by content scripts.
Intuitivamente esto debe ser correcto
manifest.json
{
"name": "My extension",
...
"content_scripts": [
{
"matches": ["http://www.google.com/*"],
"css": ["mystyles.css"],
"js": ["requirejs.js", "myscript.js"]
}
],
...
"web_accessible_resources": [
"js/*"
],
...
}
MyScript.js
require(["myFancyModule"], function (FM) {
...
});
esto no funcionará
El problema es que RequireJS se procederá a cargar todas sus dependencias mediante la inyección de <script>
etiquetas en la cabecera. Estas etiquetas de script se ejecutan en el entorno PAGE, no en el entorno especial EXTENSION. Y esto importa.
- dependencias no se pueden cargar desde RequireJS no está cargado en el entorno de la página
- Si el propietario del sitio web ha añadido RequireJS alreay, que chocan migh
- Usted puede decidir para inyectar require.js en la página, como sugiere @Adam, pero en ese caso ninguna de las funciones de extensión funcionará.almacenamiento, mensajería, solicitud entre sitios son todos no disponible
Así que para que los al trabajo, los módulos cargados por RequireJS necesitan ser inyectado en el medio ambiente extensiones. Es posible usar un complemento requirejs para cambiar el comportamiento de la carga.
Debido a la forma en que esto funciona, la solución es muy poco elegante Y le impide ver las secuencias de comandos en el depurador en las secuencias de comandos. Pero si estás desesperado, funcionará.
MyScript.js
/**
* Inject the plugin straight into requirejs
*/
define("Injector", {
load: function (name, req, onload, config) {
//Load the script using XHR, from background
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", function() {
//Find depenencies in the script, and prepend the
//Injector! plugin, forcing the load to go through this
//plugin.
var modified = getDeps(oReq.response)
//have requirejs load the module from text
//it will evaluate the define, and process dependencies
onload.fromText(modified);
});
oReq.open("GET", req.toUrl(name) + ".js");
oReq.send();
//Find dependencies and prepend Injector!
function getDeps(script)
{
//extract the define call, reduced to a single line
var defineCall = script.match(/define([\s\S])*?{/m)[0].split("\n").join("");
//extract dependenceis from the call
var depsMatch = defineCall.match(/\[([\s\S]*?)\]/);
//if there are dependencies, inject the injectors
if (depsMatch)
{
var deps = depsMatch[0];
var replaced = deps.replace(/(\'|\")([\s\S]*?)\1/g, '$1Injector!$2$1');
return script.replace(/define([\s\S]*?)\[[\s\S]*?\]/m, 'define$1' + replaced);
}
//no dependencies, return script
return script;
}
}
});
/**
* Call all your dependencies using the plugin
*/
require(["Injector!myFancyModule"], function (FM) {
chrome.storage.local.get({something});
});
Podría aclarar esto un poco más? La forma en que normalmente incluiría módulos con require.js sería a través de javascript, no una etiqueta de script: require (["some/module", "a.js", "b.js"]); – Julian
Sé cómo incluir módulos, pero ¿cómo incluyo requireJS * en sí mismo * después de cargar la página, y solo uso JavaScript? – Randomblue
Esta no es una respuesta real a su pregunta, pero puede usar simplemente crear un script de greasemonkey y ejecutar todo su código de JavaScript [http://greasemonkey.mozdev.org/authoring.html](http://greasemonkey.mozdev .org/authoring.html) – tyranitar