Estrutura de projeto do mini app
Assim como antes com as linguagens de marcação, as linguagens de estilo e os componentes. Além disso, com a estrutura do projeto de miniapp, os detalhes como as extensões de arquivo ou os nomes padrão variam. No entanto, a ideia geral é a mesma para todos os superprovedores de apps. A estrutura do projeto sempre consiste em:
- Um arquivo raiz
app.js
que inicializa o miniapp. - Um arquivo de configuração
app.json
que corresponde aproximadamente a um manifesto de app da Web. - Um arquivo
app.css
de folha de estilo comum opcional com estilos padrão compartilhados. - Um arquivo
project.config.json
que contém informações do 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 ser nomeados como a pasta que os contém, exceto as extensões de arquivo. Dessa forma, o miniapp só precisa de um ponteiro para o diretório no arquivo app.json
(o arquivo do tipo manifesto) e pode encontrar todos os sub-recursos dinamicamente. Da perspectiva de um desenvolvedor Web, os miniapps são apps de 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 de miniapps
Para registrar um miniapp no superapp, chame o método App()
definido globalmente.
Com referência à estrutura do projeto descrita antes, isso acontece em
app.js
. O ciclo de vida do mini app consiste basicamente em quatro eventos: launch
, show
, hide
e
error
. Os gerenciadores desses eventos podem ser transmitidos para o método App()
na forma de um
objeto de configuração, que também pode conter uma propriedade globalData
com 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 também o 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 de ciclo de vida que o desenvolvedor pode
detectar e reagir. Os 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 build
O processo de build de miniapps é abstraído pelo desenvolvedor. Em segundo plano, ele usa
ferramentas do setor, como o compilador Babel para transpilação e minificação e
o transformador CSS postcss (link em inglês). A experiência de build é comparável à do
Next.js ou do
create-react-app
, em que os desenvolvedores nunca mudam os parâmetros de build. Os arquivos processados resultantes
são finalmente assinados, criptografados e empacotados em um ou vários (sub)pacotes, que são enviados
aos servidores dos super provedores de apps. Os subpacotes se destinam ao carregamento lento. Portanto, um miniapp
não precisa ser transferido de uma só vez. Os detalhes da embalagem são particulares e não
estão documentados, mas alguns formatos de pacote, como o wxapkg
do WeChat, passaram por
engenharia reversa.
Agradecimentos
Este artigo foi revisado por Joe Medley, Kayce Basques, Milica Mihajlija, Alan Kent e Keith Gu.