Algunas reflexiones sobre esto.
Desarrollo de cursos de pago sobre Discourse
La idea de cursos relacionados con el desarrollo de Discourse en una plataforma como Udemy o Coursera es interesante. Sospecho que los principales problemas son que no hay muchas personas fuera del equipo de Discourse que estén calificadas para crear un curso sobre desarrollo de Discourse y que el número potencial de estudiantes para un curso es bastante pequeño. Dicho esto, estoy seguro de que un buen curso relacionado con el desarrollo de temas o plugins de Discourse podría conseguir suficientes estudiantes con el tiempo como para que valga la pena el esfuerzo de crear un curso.
También existe la posibilidad de que cobrar por los cursos de Discourse vaya en contra del espíritu de este foro. Sin embargo, solo estoy especulando sobre eso.
Tutoriales de desarrollo de Discourse
Creo que la observación de que la implementación real de muchos plugins, temas y componentes de temas de Discourse es bastante simple es correcta. Al igual que con el desarrollo para otras plataformas, el problema es superar la barrera inicial de no entender cómo encajan las partes. El equipo de Discourse (o algunos otros desarrolladores cualificados) podría ayudar con esto escribiendo algunos tutoriales que te guíen a través de todo el proceso de creación de temas, componentes de temas y plugins funcionales. Por ejemplo, una guía paso a paso para crear algo como el componente de tema Discourse Placeholder.
Me doy cuenta de que esto requeriría una gran inversión de tiempo, por lo que necesitaría alinearse con los objetivos comerciales de Discourse.
Recursos disponibles actualmente
Con un poco de búsqueda, hay mucha buena información sobre el desarrollo de Discourse en este foro. Mirar ejemplos de código del repositorio de GitHub de Discourse también es una excelente manera de aprender.
Una herramienta reciente que no debe pasarse por alto es GitHub Copilot. Si estructuras tu entorno de desarrollo de la manera correcta, puede ser útil para tener una idea de cómo desarrollar temas y plugins de Discourse. Para desarrollar temas de Discourse, el mejor enfoque que he encontrado es desarrollar el tema (usando la CLI de temas de Discourse) en el directorio raíz de mi instalación local de Discourse. Estructurar las cosas de esta manera da a Copilot fácil acceso a la base de código de Discourse. (Tenga en cuenta que para el desarrollo de plugins, la carpeta plugins ya está en el directorio raíz /discourse.) (Tenga en cuenta también que podría estar equivocado sobre que Copilot acceda realmente a la base de código de Discourse que he cargado en mi IDE. En cualquier caso, es útil tener el código principal de Discourse disponible para mi propia referencia).
Para evitar distracciones y también para centrarme en usar Copilot como herramienta de aprendizaje, desactivo las completaciones de Copilot en mi IDE (VS Code) y solo interactúo con Copilot a través del chat. Aquí tienes un ejemplo del tipo de ayuda que puede proporcionar. (shopify.js es el archivo que creó la CLI de temas en el directorio /javascripts/discourse/api-initializers/ de mi tema).
Conversación con Copilot
_scossar: ¿Puedes explicar qué hace la exportación predeterminada en shopify.js? Es esencialmente el código de plantilla que proporciona Discourse cuando se crea un tema con la gema discourse_theme. He alterado el código de plantilla para que registre cada cambio de página. Entiendo la llamada a api.onPageChange, pero no tengo una comprensión clara de cómo se inyecta el objeto api en mi código.
GitHub Copilot: El objeto api se inyecta en tu código a través de la función withPluginApi que se llama en el método initialize del objeto devuelto por apiInitializer.
Aquí tienes una versión simplificada de lo que está sucediendo:
-
Cuando Discourse se inicia, ejecuta todos los inicializadores.
-
La función apiInitializer crea un inicializador que se ejecuta después del inicializador "inject-objects".
-
Cuando se ejecuta este inicializador, llama a la función withPluginApi, pasando los parámetros version, cb y opts.
-
La función withPluginApi comprueba si la versión actual de Discourse es compatible con la versión especificada. Si lo es, llama a la función de devolución de llamada (cb) y pasa la instancia de PluginApi como argumento. Este objeto PluginApi es el objeto api que ves en tu código.
Por lo tanto, api es una instancia de PluginApi, y la función withPluginApi te la pasa a tu código. Este objeto proporciona una serie de métodos que te permiten interactuar con Discourse, como onPageChange, que ya estás utilizando.
_scossar: Entonces, ¿la función que es el segundo argumento de la exportación predeterminada en shopify.js es la función de devolución de llamada que acepta apiInitializer?
GitHub Copilot: Sí, eso es correcto. El segundo argumento de apiInitializer es una función de devolución de llamada. Esta función se llama con la instancia de PluginApi como argumento cuando se ejecuta el inicializador (suponiendo que la versión actual de Discourse sea compatible con la versión especificada). Así es como el objeto api se pone a disposición en tu archivo shopify.js.
Una vez que resolví eso…
_scossar: …Otro pensamiento, ¿podría usarse api.decorateCooked para inyectar un iframe de calificación alojado en una aplicación externa (por ejemplo, alojado por la aplicación Shopify que estoy desarrollando)?
GitHub Copilot: Sí, puedes usar api.decorateCooked para inyectar un iframe en una publicación. Aquí tienes un ejemplo aproximado de cómo podrías hacerlo:
api.decorateCooked($elem => {
const postId = $elem.data('post-id');
const iframe = document.createElement('iframe');
iframe.src = `https://your-app.com/ratings?post_id=${postId}`;
iframe.width = '100%';
iframe.height = '200'; // ajusta según sea necesario
$elem.append(iframe);
}, { id: 'rating-iframe' });
En este ejemplo, api.decorateCooked se utiliza para añadir un iframe a cada publicación. La fuente del iframe se establece en una URL de tu aplicación externa, con el ID de la publicación incluido como parámetro de consulta. Deberías reemplazar 'https://your-app.com/ratings' con la URL real de tu página de calificaciones.
Ten en cuenta que este es un ejemplo simplificado. Es posible que necesites ajustarlo para que se adapte a tus necesidades, y definitivamente deberías añadir manejo de errores y otras precauciones necesarias para garantizar que funcione de manera correcta y segura.
No es razonable en este punto esperar que Copilot escriba todo tu código, pero es una gran herramienta para aprender a escribir código de Discourse.