Estoy intentando crear un componente de tema para la vista previa de STL. Existe una excelente biblioteca de JavaScript para esto, pero no estoy seguro de cómo hacer que funcione en un componente de tema.
Es JavaScript regular, no ES6, lo que creo que significa que no puedo simplemente colocarlo en el directorio “javascripts” e importarlo, ¿verdad? Además, parece que la biblioteca depende de ser importada desde una etiqueta <script>.
Así que puedo crear una etiqueta <script> y añadirla al encabezado del documento, pero ¿cómo encuentro el nombre del archivo JS de la biblioteca? También, la biblioteca está compuesta por varios archivos JS y asume que esos archivos estarán disponibles en el mismo directorio. Luego crea etiquetas <script> adicionales para cargar el resto de la biblioteca.
Entonces, ¿deberían ir estos archivos en el directorio “javascripts”? ¿O deberían tratarse como activos? Lo más cercano que encuentro para hacer algo similar es el plugin discourse-math, pero si es posible, preferiría mantener esto como un componente de tema.
No lo sé, ¡pero tú tampoco tienes buenas respuestas!
Lo siguiente que debemos revisar es lo… cosa… sobre incluir otros archivos en el componente del tema.
Creo que hay que mirar algunos de los componentes de tema más grandes. Básicamente, creo que la estructura de archivos del componente del tema es la misma y Ember simplemente cargará esos archivos del tema igual que lo haría con un plugin.
No lo creo, cada componente tiene su propio directorio virtual, creo. Algo como discourse/theme-10/… Así que para cargar cosas desde allí, al menos tengo que saber de alguna manera cuál es el directorio.
Los nombres de los activos parecen ser accesibles solo como variables, y los nombres reales son números largos y complicados, así que eso tampoco funcionará.
Parece que por ahora no hay forma de hacer esto como un componente, así que voy a cargar los archivos JS de forma lateral a través de nginx y acceder a ellos de esa manera por ahora. Probablemente signifique que, lamentablemente, este componente solo funcionará para mí.
Si navego a otro tema y luego regreso al tema que contiene el STL, ya no funciona. No estoy seguro de por qué, ya que no hay ningún error en la consola de JavaScript. Vi un hilo en algún lugar anteriormente que hablaba de rarezas con onload, y dado que estos scripts utilizan onload, ¿quizás tenga algo que ver?
Es cierto, pero el código de viewstl no está pensado para ser incrustado.
Con la carga lateral, coloqué una etiqueta script como esta en common/head_tag.html:
Discourse es una SPA. No puedes simplemente añadir un script en onLoad, ya que no funcionará. Deberás conectarte a nuestros puntos finales de la API. Consulta la Guía para desarrolladores de temas de Discourse.
He leído esta página varias veces, pero aún no logro que funcione.
Estoy intentando cargar three.js con instrucciones de importación, pero parece que, sin importar lo que haga, se queja de que no puede encontrar la importación. Lo extraño es que puedo importar otros archivos sin problemas, y el mensaje de error es totalmente inútil.
En cualquier caso, esto es lo que obtengo; quizás alguien pueda ayudar:
Aquí está la importación que no funciona:
Y aquí está el error que obtengo:
_application-547e0be66174ffd22a4d74fd8b568f6a3892a266cff18cb078c08d6357227acb.js:74333 Se produjo un error en el tema/componente "Vistas previas STL": Error: No se pudo encontrar el módulo `discourse/theme-17/three/build/three.module` importado desde `discourse/theme-17/stlviewer/StlViewer`
at h (_ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:74612)
at _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:74581
at _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:74665
at _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:74490
at require (_ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:74663)
at h (_ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:74616)
at _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:74581
at _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:74665
at _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:74490
at require (_ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:74663)
(anonymous) @ _application-547e0be66174ffd22a4d74fd8b568f6a3892a266cff18cb078c08d6357227acb.js:74333
u @ _application-547e0be66174ffd22a4d74fd8b568f6a3892a266cff18cb078c08d6357227acb.js:74325
initialize @ _application-547e0be66174ffd22a4d74fd8b568f6a3892a266cff18cb078c08d6357227acb.js:74304
i.initialize @ _application-547e0be66174ffd22a4d74fd8b568f6a3892a266cff18cb078c08d6357227acb.js:7723
(anonymous) @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:49335
e.each @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:67724
e.walk @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:67638
e.each @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:67568
e.topsort @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:67576
_runInitializer @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:49361
runInitializers @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:49333
_bootSync @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:47768
domReady @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:47668
n._run @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:67275
n._join @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:67251
n.join @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:66968
f @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:53760
(anonymous) @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:53864
l @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:3776
c @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:3844
setTimeout (async)
(anonymous) @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:3882
u @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:3510
fireWith @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:3640
fire @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:3648
u @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:3510
fireWith @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:3640
ready @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:4120
z @ _ember_jquery-36a23101c869ab0dc53fc908de69adb785731593573d32bdeef416acc1076ef4.js:4130
¿Es ‘.’ un separador de módulos mágico o algo así?
Supongo que ‘.’ es mágico, porque cuando cambio el nombre de three.module.js a three_module.js, obtengo un problema completamente diferente: ya no puedo cargar el tema (error 500).
Si solo necesitas la carga Just In Time de un activo de JavaScript, como en mi caso donde requiero la biblioteca D3, puedes usar este patrón con Loadscript:
y un poco más arriba:
Loadscript devuelve una Promise, por lo que debes ejecutar un .then sobre el resultado. (No estoy seguro, pero asumo que el resultado se almacena en caché de forma implícita, por lo que la segunda vez se ejecutará más rápido, etc.)
Como puedes ver, puedes encadenarlos para cargar varios scripts uno tras otro.
Ten en cuenta que se ejecuta dentro de un Componente de Ember y se activa desde el hook didInsertElement. Aprende más sobre los Componentes de Ember aquí: Templates are HTML - Components - Ember Guides
También ten en cuenta que los propios scripts están alojados en el directorio javascripts/assets.
Basé esto en el código de @j.jaffeux utilizado en algún lugar para cargar un script completamente diferente (¡gracias, Joffrey! )
Aquí tienes un ejemplo de Discourse:
Consejo: siempre revisa los TCs Oficiales y de Pabellón, así como los plugins que hacen algo similar, para ver cómo logran estas cosas :).
Decidí probar un enfoque más sencillo.
Simplemente creo un iframe que carga una página HTML, la cual puede ejecutar todas las tareas complejas de script necesarias para que la vista previa funcione. Por ahora no está en un formato reutilizable, pero sería relativamente sencillo crear un plugin para ello.