Discourse-webpack: Um boilerplate para desenvolver componentes Discourse ricos em JS

Edição por @david: O sistema de temas do Discourse agora possui suporte nativo para múltiplos arquivos JS. Este método do webpack não é mais necessário.


Olá! Enquanto eu estava desenvolvendo meu componente handsfree-discourse, encontrei alguns problemas relacionados ao gerenciamento de arquivos. Meu principal problema era a necessidade de dividir meu código em vários arquivos. Outro problema era a necessidade de incluir bibliotecas de terceiros sem precisar pedir aos administradores para habilitar CORS ou disparar solicitações HTTP adicionais.

Para resolver esses problemas, criei o discourse-webpack, um modelo para configurar rapidamente componentes ricos em JS! As funcionalidades incluem:

  • Servidor de desenvolvimento local com recarregamento ao vivo (live reloading)
  • Inclui um script de commit para manter seu código-fonte e código compilado em ramos separados!

O restante deste tópico explica como usá-lo e por que funciona. Acabei de terminar de testar isso em alguns outros componentes com os quais estou trabalhando, então me avise se você encontrar algum problema ou tiver solicitações específicas!


Discourse Webpack

Configure rapidamente componentes ricos em JavaScript para sua Comunidade Discourse, completo com um script de commit para manter seu código-fonte e código de build em ramos separados para ajudá-lo a continuar entregando \u003ci\u003erápido\u003c/i\u003e!


Instalação

Primeiro, certifique-se de ter o NodeJS >= 8 e o git instalados localmente na sua máquina. Em seguida, digite cada uma das linhas abaixo:

# Baixe este repositório
git clone https://github.com/browsehandsfree/discourse-webpack

# Entre no diretório
cd discourse-webpack

# Instale as dependências
npm install

Depois, você precisará editar o seguinte em package.json, substituindo todos os nossos links pelos seus. Especificamente:

{
  name: 'seu-projeto',
  repository: {
    url: 'git+https://github.com/usuario/repo'
  },
  author: '',
  bugs: {
    url: 'https://github.com/usuario/repo/issues'
  },
  homepage: 'https://exemplo.com'
}

Mais importante de tudo, certifique-se de que repository.url esteja correto e seja precedido por git+. Quando você executar npm run discourse, ele fará commit e push para aquele repositório.

Também, não se esqueça de configurar o about.json do seu Discourse, que está localizado em /src/discourse/about.json.


Desenvolvimento

Após o npm install, você terá a seguinte estrutura de diretórios:

discourse-webpack
|- node_modules/        # Dependências
|- src/                 # Arquivos fonte principais
|--|- discourse/        # Arquivos de tema do Discourse
|--|--|- common/
|--|--|- desktop/
|--|--|- mobile/
|--|- main.css          # A folha de estilos principal
|--|- main.js           # O ponto de entrada principal do JavaScript
|--|- sandbox.html      # Sandbox para desenvolvimento local
|- .gitignore
|- discourse-push.js    # Script especial de commit
|- README.md
|- webpack.config.js    # Configuração do Webpack
|- yarn.lock

Scripts de Linha de Comando

Além disso, você tem acesso aos seguintes comandos a partir da raiz do projeto:

# Inicia um servidor de desenvolvimento em localhost:8080
# - Suporta recarregamento ao vivo (livereload)
# - Usa `/src/sandbox.html` para ajudá-lo a depurar localmente
npm run dev

# Compila seu componente para `/dist`
npm run build

# Compila seu componente para `/dist`
# - Em seguida, faz commit de `/dist` no ramo `discourse`
npm run discourse

Como funciona

Depois de baixar o repositório e instalar as dependências, é hora de começar a desenvolver! Use npm run dev para iniciar um servidor de recarregamento ao vivo em localhost:8080.

Acessar essa URL carregará o arquivo HTML localizado em /src/sandbox.html. Este arquivo não é realmente usado dentro do Discourse; está aqui apenas para ajudá-lo a desenvolver seus scripts localmente (fora do contexto do Discourse).

O ponto de entrada principal do webpack é /src/main.js. A partir daí, você pode importar outros scripts e o webpack agrupará tudo e injetará nos seguintes arquivos:

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

O main.js é compilado e injetado no sandbox.html automaticamente, mas é injetado manualmente inline no body_tag.html por causa do seguinte código:

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

Se você quisesse injetar seu script em outro modelo, como after_header.html, bastaria copiar essa tag script para aquele modelo. Isso permite que você mantenha o HTML e o JavaScript separados durante o desenvolvimento… mas concatenados quando implantados!


Compilação

Quando você compila com npm run build, o que está acontecendo é:

  • Primeiro, /src/main.js e as dependências são agrupados
  • Em seguida, todos os arquivos em /src/discourse/ são copiados para /dist/
  • Ao mesmo tempo, main.js é injetado inline em qualquer arquivo de modelo que contenha:
<script>
  <%= compilation.assets['main.js'].source() %>
</script>

Implantação

Quando você executa npm run discourse, o script /discourse-push.js é chamado e faz o seguinte:

  • Primeiro, ele compila, como se fosse com npm run build
  • Em seguida, inicializa um novo repositório git dentro de /dist
  • Em seguida, faz commit de /dist no ramo discourse do seu projeto (ele criará o ramo se ele não existir)

Usando o ramo discourse

Cada uma das seguintes /urls/relativas/ é relativa à URL base do seu fórum, por exemplo, https://exemplo.com/urls/relativas/

Instalar o componente

Instale seu componente acessando /admin/customize/themes e selecionando “Importar da web” a partir do repositório do seu projeto, por exemplo: https://github.com/meu-incrivel/componente-discourse.

Em seguida, defina o ramo como discourse. Não funcionará se você deixá-lo como master, pois o Discourse tentará carregar os arquivos não compilados (se funcionar de alguma forma).


Depurando arquivos específicos de tema no seu próprio host

Se você é novo no Discourse e gostaria de fazer um fork deste projeto, as seguintes leituras podem ser úteis.

16 curtidas

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 curtidas