Estrutura, ciclo de vida e pacotes do projeto

Assim como antes com as linguagens de marcação, as linguagens de estilo e os componentes, com a estrutura do miniapp, os detalhes, como as extensões de arquivo ou os nomes padrão, variam. A ideia geral, no entanto, é a mesma para todos os provedores de superapps. A estrutura do projeto sempre consiste em:

  • Um arquivo raiz app.js que inicializa o miniapp.
  • Um arquivo de configuração app.json que aproximadamente corresponde a um manifesto de app da Web.
  • Um arquivo de folha de estilo comum opcional app.css com estilos padrão compartilhados.
  • Um arquivo project.config.json que contém informações de build.

Todas as páginas são armazenadas em subpastas individuais em uma pasta pages. Cada subpasta de página contém um arquivo CSS, um arquivo JS, um arquivo HTML e um arquivo JSON de configuração opcional. Todos os arquivos precisam ter o mesmo nome da pasta que os contém, além das extensões de arquivo. Assim, o miniapp só precisa de um ponteiro para o diretório no arquivo app.json (o arquivo semelhante a um manifesto) e pode encontrar todos os subrecursos de forma dinâmica. Do ponto de vista de um desenvolvedor da Web, os miniapps são apps com várias páginas.

├── app.js               # Initialization logic
├── app.json             # Common configuration
├── app.css              # Common style sheet
├── project.config.json  # Project configuration
└── pages                # List of pages
   ├── index               # Home page
      ├── index.css         # Page style sheet
      ├── index.js          # Page logic
      ├── index.json        # Page configuration
      └── index.html        # Page markup
   └── other               # Other page
       ├── other.css         # Page style sheet
       ├── other.js          # Page logic
       ├── other.json        # Page configuration
       └── other.html        # Page markup

Ciclo de vida do miniapp

Um miniapp precisa ser registrado no superapp chamando o método App() definido globalmente. Em relação à estrutura do projeto descrita antes, isso acontece em app.js. O ciclo de vida do miniapp consiste basicamente em quatro eventos: launch, show, hide e error. Os manipuladores desses eventos podem ser transmitidos ao método App() na forma de um objeto de configuração, que também pode conter uma propriedade globalData que armazena dados que precisam estar disponíveis globalmente em todas as páginas.

/* app.js */
App({
  onLaunch(options) {
    // Do something when the app is launched initially.
  },
  onShow(options) {
    // Do something when the app is shown.
  },
  onHide() {
    // Do something when the app is hidden.
  },
  onError(msg) {
    console.log(msg);
  },
  globalData: "I am global data",
});

Como de costume, os detalhes individuais variam, mas o conceito é o mesmo para WeChat, Alipay, Baidu, ByteDance e Quick App.

Ciclo de vida da página

Assim como o ciclo de vida do app, o ciclo de vida da página também tem eventos que o desenvolvedor pode detectar e reagir. Esses eventos principais são load, show, ready, hide e unload. Algumas plataformas oferecem outros eventos, como pulldownrefresh. A configuração dos manipuladores de eventos acontece no método Page() definido para cada página. Para as páginas index ou other da estrutura do projeto antes, isso aconteceria em index.js ou other.js, respectivamente.

/* index.js */
Page({
  data: {
    text: "This is page data.",
  },
  onLoad: function (options) {
    // Do something when the page is initially loaded.
  },
  onShow: function () {
    // Do something when the page is shown.
  },
  onReady: function () {
    // Do something when the page is ready.
  },
  onHide: function () {
    // Do something when the page is hidden.
  },
  onUnload: function () {
    // Do something when the page is closed.
  },
  onPullDownRefresh: function () {
    // Do something when the user pulls down to refresh.
  },
  onReachBottom: function () {
    // Do something when the user scrolls to the bottom.
  },
  onShareAppMessage: function () {
    // Do something when the user shares the page.
  },
  onPageScroll: function () {
    // Do something when the user scrolls the page.
  },
  onResize: function () {
    // Do something when the user resizes the page.
  },
  onTabItemTap(item) {
    // Do something when the user taps the page's tab.
  },
  customData: {
    foo: "bar",
  },
});

O processo de compilação

O processo de build de miniapps é abstrato do desenvolvedor. Por trás, ele usa ferramentas do setor, como o compilador Babel para transpilação e minificação, e o transformador CSS postcss. A experiência de build é comparável à do Next.js ou create-react-app, em que os desenvolvedores, se escolherem explicitamente não fazer isso, nunca tocam nos parâmetros de build. Os arquivos processados resultantes são assinados, criptografados e empacotados em um ou vários (sub)pacotes que são enviados para os servidores dos provedores de superapps. Os subpacotes são destinados ao carregamento lento, para que um miniapp não precise ser baixado de uma só vez. Os detalhes de empacotamento são particulares e não são documentados, mas alguns formatos de pacote, como o wxapkg do WeChat, foram reengenheirados.

Agradecimentos

Este artigo foi revisado por Joe Medley, Kayce Basques, Milica Mihajlija, Alan Kent e Keith Gu.