En un componente Svelte, estoy tratando de acceder a un objeto que configuré en mi archivo de configuración acumulativo. Mi archivo rollup.config.js se ve así:
import replace from '@rollup/plugin-replace'; ... export default { ... replace({ foo: JSON.stringify({ bar: 'Hello' }), }), ... En mi componente Svelte, funciona un simple console.log(foo) :
Pero cuando trato de entrar en ese objeto foo como console.log(foo.bar) , obtengo que foo no está definido :
¡Buena pregunta! El objeto foo permanece sin definir, por lo que arroja el error correcto y no puede encontrar foo para reemplazarlo con lo que sea que vaya a reemplazarlo.
La solución es hacer que el complemento de reemplazo haga su trabajo. Puede acceder a su variable de esta manera en su js o sus archivos .svelte
const { bar } = foo; console.log(bar);Nota: se realizó un cambio en este complemento, verifique aquí para obtener más detalles. si planea usar variables de entorno usando dotenv considere
import { config } from "dotenv"; ... replace({ values: { foo: JSON.stringify({ bar: "Hello", ...config().parsed }), }, }), ...y en tu expediente esbelto
const { bar, ...rest } = foo; console.log("bar=>", bar); console.log("env=>", rest);Esta sección del documento explica su problema exacto.
https://github.com/rollup/plugins/tree/master/packages/replace#delimiters
La opción de delimiters controla cómo se emparejarán las cadenas. Con los delimiters predeterminados ['\b', '\b(?!\.)'] , solo reemplazaría a foo si sigue un límite de palabra y es seguido por un límite de palabra que no es un punto. Por lo tanto, con su rollup.config.js el comportamiento sería
console.log(foo) // becomes console.log({"bar":"Hello"}) console.log(foo.bar) // is not replaced by the plugin as `foo` IS followed by a dot console.log(foo['bar']) console.log(foo .bar) // space after `foo` // both satisfy the delimiter check again and print: Hello // (horrible coding style in the latter but to illustrate how it works) const { bar } = foo // also satisfy the delimiter check hence console.log(bar) // prints: HelloComo puede ver, el complemento de reemplazo realmente no analiza su código, sino que solo realiza un reemplazo de texto simple, no muy diferente de la función de búsqueda y reemplazo de su IDE/editor. Gauss, ¿qué diría abajo?
console.log('foo') // Guess what? // ... // ... // printed: {"bar":"Hello"} // as if it were console.log('{"bar":"Hello"}')Para concluir, su solución podría ser
foo['bar'] ,const { bar } = foo ,__FOO_BAR__ , __FOO_BAZ__ , ...delimiters: ['\\b', '\\b'] para permitir que los puntos sigan a la clave. (Sin embargo, al momento de escribir, el último no parece funcionar todavía debido a una corrección de errores que espera ser fusionada).
https://github.com/rollup/plugins/pull/1088
Si usa delimiters: ['', ''] la advertencia anterior requiere un nivel de precaución mucho mayor. Incluso una cadena literal 'food' o una etiqueta de plantilla HTML <footer> podría cambiarse a un galimatías como '{"bar":"Hello"}d' o <{"bar":"Hello"}ter> . Así que nombre sus claves sabiamente o use algunos delimitadores inusuales dependiendo de su uso, como lo demostró una vez la versión anterior del complemento: delimiters: ['<@', '@>'] .
https://github.com/rollup/rollup-plugin-reemplazo
Sin embargo, dado que este tipo de preprocesamiento es bastante rudimentario, siempre es necesario tener cuidado al agregar claves reemplazadas y al usarlas.