Discourse-webpack: Una plantilla para desarrollar componentes de Discourse con mucho JS

Edición por @david: El sistema de temas de Discourse ahora tiene soporte integrado para múltiples archivos JS. Este método de webpack ya no es necesario.


¡Hola! Mientras estaba desarrollando mi componente handsfree-discourse, me encontré con algunos problemas relacionados con la gestión de archivos. Mi principal problema era que necesitaba una forma de dividir mi código en varios archivos. El otro problema era que necesitaba incluir bibliotecas de terceros sin tener que pedir a los administradores que habiliten CORS o desencadenen solicitudes HTTP adicionales.

Para resolver estos problemas, creé discourse-webpack, una plantilla para crear rápidamente componentes con muchos archivos JS. Las características incluyen:

  • Servidor de desarrollo local con recarga en vivo
  • Incluye un script de commit para mantener tu código fuente y el código compilado en ramas separadas.

El resto de este tema explica cómo usarlo y por qué funciona. Literalmente acabo de terminar de probar esto para otros componentes en los que estoy trabajando, así que avísame si tienes algún problema o alguna solicitud específica.


Discourse Webpack

Crea rápidamente componentes con muchos archivos JavaScript para tu comunidad de Discourse, completo con un script de commit para mantener tu código fuente y el código de compilación en ramas separadas para ayudarte a seguir lanzando rápido.


Instalación

Primero, asegúrate de tener NodeJS >= 8 y git instalados localmente en tu máquina. Luego, escribe cada una de las líneas a continuación:

# Descarga este repositorio
git clone https://github.com/browsehandsfree/discourse-webpack

# Entra en el directorio
cd discourse-webpack

# Instala las dependencias
npm install

Luego necesitarás editar lo siguiente en package.json, reemplazando todos nuestros enlaces con los tuyos. Específicamente:

{
  name: 'tu-proyecto',
  repository: {
    url: 'git+https://github.com/usuario/repo'
  },
  author: '',
  bugs: {
    url: 'https://github.com/usuario/repo/issues'
  },
  homepage: 'https://ejemplo.com'
}

Lo más importante de todo, asegúrate de que repository.url sea correcto y que esté precedido por git+. Cuando ejecutes npm run discourse, se hará commit y se enviará a ese repositorio.

También, no olvides configurar tu about.json de Discourse, que se encuentra en /src/discourse/about.json.


Desarrollo

Después de npm install, obtendrás la siguiente estructura de directorios:

discourse-webpack
|- node_modules/        # Dependencias
|- src/                 # Los archivos fuente principales
|--|- discourse/        # Archivos de tema de Discourse
|--|--|- common/
|--|--|- desktop/
|--|--|- mobile/
|--|- main.css          # La hoja de estilos principal
|--|- main.js           # El punto de entrada principal de JavaScript
|--|- sandbox.html      # Espacio de pruebas para desarrollo local
|- .gitignore
|- discourse-push.js    # Script especial de commit
|- README.md
|- webpack.config.js    # Configuración de Webpack
|- yarn.lock

Scripts de línea de comandos

Además, tienes acceso a los siguientes comandos desde la raíz del proyecto:

# Inicia un servidor de desarrollo en localhost:8080
# - Soporta recarga en vivo
# - Utiliza `/src/sandbox.html` para ayudarte a depurar localmente
npm run dev

# Compila tu componente en `/dist`
npm run build

# Compila tu componente en `/dist`
# - Luego hace commit de `/dist` en la rama `discourse`
npm run discourse

Cómo funciona

Una vez que hayas descargado el repositorio e instalado las dependencias, ¡es hora de empezar a desarrollar! Usa npm run dev para iniciar un servidor de recarga en vivo en localhost:8080.

Visitar esa URL cargará el archivo HTML ubicado en /src/sandbox.html. Este archivo no se utiliza realmente dentro de Discourse y solo está aquí para ayudarte a desarrollar tus scripts localmente (fuera del contexto de Discourse).

El punto de entrada principal de webpack es /src/main.js. Desde allí, puedes importar otros scripts y webpack agrupará todo e inyectará los archivos en los siguientes:

  • /src/sandbox.html
  • /src/discourse/common/body_tag.html

main.js se compila e inyecta automáticamente en sandbox.html, pero se inyecta manualmente en línea con body_tag.html debido al siguiente código:

<script>
  <%= compilation.assets['main.js'].source() %>
</script>

Si quisieras inyectar tu script en otra plantilla, como after_header.html, solo tendrías que copiar esa etiqueta script en esa plantilla. Esto te permite mantener el HTML y el JavaScript de esa plantilla separados durante el desarrollo… ¡pero concatenados cuando se implementa!


Compilación

Cuando compiles con npm run build, lo que sucede es:

  • Primero, /src/main.js y las dependencias se agrupan
  • Luego, todos los archivos en /src/discourse/ se copian a /dist/
  • Al mismo tiempo, main.js se inyecta en línea en cualquier archivo de plantilla que contenga:
<script>
  <%= compilation.assets['main.js'].source() %>
</script>

Implementación

Cuando ejecutes npm run discourse, se llamará al script /discourse-push.js y hará lo siguiente:

  • Primero compilará, como si fuera con npm run build
  • Luego, inicializará un nuevo repositorio git dentro de /dist
  • Luego hará commit de /dist en la rama discourse de tu proyecto (creará la rama si no existe)

Usando la rama discourse

Cada una de las siguientes /url/relativas/ son relativas a la URL base de tu foro, por ejemplo, https://ejemplo.com/url/relativas/

Instalar el componente

Instala tu componente visitando /admin/customize/themes y selecciona “Importar desde la web” desde el repositorio de tu proyecto, por ejemplo: https://github.com/mi-increible/componente-discourse.

Luego, establece la rama en discourse. No funcionará si la dejas en master, ya que Discourse intentará cargar los archivos no compilados (si es que funciona en absoluto).


Depuración de archivos específicos del tema en tu propio host

Si eres nuevo en Discourse y te gustaría bifurcar este proyecto, las siguientes lecturas podrían ser útiles.

16 Me gusta

Discourse now has native support for “JS heavy” theme components

@labofoz I would be interested to know whether you think this is enough to avoid the need for discourse-webpack?

6 Me gusta