Me gustaría tener una etiqueta:
<script src="https://mysource.com/script?foo=bar"></script>
https://mysource.com/script es un punto final de función en la nube que devuelve un script que debe ejecutarse en el navegador utilizando bar como valor para foo . El script no puede evaluar una función y simplemente devolver el resultado porque su comportamiento esperado es causar efectos secundarios como agregar cosas al objeto de la ventana.
Pude hacerlo haciendo cosas como:
//prevents code injection like eval("evilcode") function sanitize(){} const foo = sanitize(req.query.foo); const myFunc = ()=>{... <uses foo somewhere> ... <causes side effects> ...}; let strFunction = myFunc.toString(); strFunction = strFunction.replace("foo", foo); const script = "("+strFunction+")();"; res.status(200).send(script);Pero no puedo dejar de preguntarme si hay una mejor manera de hacerlo. Google hace lo que estoy tratando de hacer en sus scripts gtag. Si va a https://www.googletagmanager.com/gtag/js?id=AW-950577603 y ctrl+f AW-950577603, verá que la identificación consultada (AW-950577603) aparece dentro del código javascript. Pero no tengo idea si lo que están haciendo es exactamente lo que estoy haciendo o si lo han hecho de una mejor manera. ¿Sugerencias?
Tu codigo:
const myFunc = ()=>{... <uses foo somewhere> ... <causes side effects> ...}; let strFunction = myFunc.toString(); strFunction = strFunction.replace("foo", foo); const script = "("+strFunction+")();"; En lugar de reemplazar foo por texto, podría convertir a foo en un parámetro:
const myFunc = (foo)=>{... <uses foo somewhere> ... <causes side effects> ...}; let strFunction = myFunc.toString(); const script = "("+strFunction+")("+foo+");";Tu codigo:
//prevents code injection like eval("evilcode") function sanitize(){} const foo = sanitize(req.query.foo); Si desea que req.query.foo aparezca como una cadena literal de JavaScript, entonces JSON.stringify a menudo funciona:
const foo = JSON.stringify(req.query.foo);Normalmente, almacenaría mi código JavaScript del lado del cliente en un archivo separado. Separar JavaScript del lado del cliente y del lado del servidor me ayuda a mantener mi código. En su caso, el archivo puede exponer una función llamada initializeMyApp , y puede crear dinámicamente una llamada para initializeMyApp con el método de parámetro-argumento explicado en otra respuesta. Por ejemplo:
let strFunction = fs.readFileSync("initializeMyApp.js", "utf-8"); const script = "("+strFunction+")("+foo+");"; Aún mejor: almacene su código JavaScript del lado del cliente en un archivo separado y sírvalo como contenido estático (posiblemente con un CDN). Luego haga que el código del cliente llame a initializeMyApp en un <script> separado:
<script src="https://mysource.com/script"></script> <script>initializeMyApp("bar");</script>