WordPress como Backend para Aplicações Móveis: Guia React Native
PT-PT

WordPress como Backend para Aplicações Móveis: Guia React Native

Última verificação: 1 de junho de 2026
14 min de leitura
Guia
500+ projetos WP

A convergência entre sistemas de gestão de conteúdos e desenvolvimento de aplicações móveis criou oportunidades sem precedentes para empresas que procuram soluções eficientes e escaláveis. O WordPress, que alimenta mais de 40% da web, surge como um backend surpreendentemente capaz para aplicações móveis quando aproveitado através de arquitetura headless moderna. Este guia técnico explora como utilizar o WordPress como Headless CMS para aplicações React Native e Expo, permitindo um desenvolvimento rápido sem sacrificar o desempenho ou a flexibilidade.


#Introdução: Por que WordPress como Backend Móvel em 2026

O panorama das aplicações móveis evoluiu dramaticamente, com os utilizadores a esperarem experiências perfeitas em todas as plataformas, enquanto as empresas exigem fluxos de trabalho eficientes de gestão de conteúdos. O desenvolvimento tradicional de backend para aplicações móveis frequentemente requer investimento significativo em APIs personalizadas, gestão de bases de dados e interfaces de administração de conteúdos. O WordPress, quando implementado como Headless CMS, elimina estas barreiras ao mesmo tempo que fornece capacidades de gestão de conteúdos de nível empresarial.

A arquitetura headless desacopla o backend de gestão de conteúdos da camada de apresentação, permitindo que o WordPress sirva como uma API de conteúdo pura enquanto o React Native gere a interface do utilizador móvel. Está separação oferece vantagens convincentes: os editores de conteúdo trabalham na interface familiar do WordPress, os programadores constroem experiências móveis nativas é ambos os sistemas evoluem independentemente sem alterações significativas.

O caso de negócio estende-se para além da eficiência técnica. As organizações já investidas em infraestrutura WordPress podem estender o seu conteúdo existente para plataformas móveis sem reconstruir sistemas de backend. As equipas de marketing mantêm a publicação de conteúdos de fonte única, reduzindo a duplicação e garantindo consistência entre canais web e móveis. As equipas de desenvolvimento aproveitam as capacidades multiplataforma do React Native, entregando aplicações iOS e Android a partir de uma única base de código enquanto o WordPress gere atualizações de conteúdos em tempo real.


#Visão Geral da Arquitetura: Como o WordPress Headless Alimenta Aplicações Móveis

Compreender a fundação arquitetural permite decisões informadas sobre abordagens de implementação e seleção de tecnologias.

#O Paradigma de Headless CMS

O WordPress tradicional combina gestão de conteúdos com apresentação baseada em temas. O WordPress headless remove completamente a camada de temas, expondo conteúdos através de APIs que qualquer frontend - web, móvel, IoT ou outro - pode consumir.

Componentes Arquiteturais Chave

  • Núcleo WordPress: Criação de conteúdos, gestão de utilizadores, manipulação de media e ecossistema de plugins
  • Camada API: REST API (incorporada) ou GraphQL (via plugin WPGraphQL) para entrega de conteúdos
  • Autenticação: JWT (JSON Web Tokens) para autenticação segura de aplicações móveis
  • React Native/Expo: Framework móvel multiplataforma que consome APIs WordPress
  • Camada de Cache: Redis ou similar para otimização de respostas API

#Opções de API: REST vs GraphQL

O WordPress oferece duas abordagens principais de API para integração móvel:

FuncionalidadeREST APIGraphQL (WPGraphQL)
IncorporadoSim (WordPress 4.7+)Não (plugin necessário)
Eficiência de pedidosMúltiplos endpointsEndpoint único
Over-fetching de dadosComumEliminado
Curva de aprendizagemMenorModerada
Capacidades em tempo realPollingSubscrições
Otimização móvelBoaExcelente

Para aplicações móveis, o GraphQL tipicamente oferece desempenho superior através da obtenção precisa de dados, reduzindo tamanhos de payload e melhorando a capacidade de resposta percebida em conexões de rede variáveis.


#Guia de Implementação: Construir o Backend da Sua Aplicação Móvel

Está secção fornece orientação completa e pronta para produção para conectar aplicações React Nativé ao WordPress.

#Fase 1: Configuração do Backend WordPress

Passo 1: Instalar e Configurar o WPGraphQL

O WPGraphQL transforma o WordPress num servidor GraphQL, fornecendo obtenção ótima de dados para aplicações móveis.

# Instalar WPGraphQL via WP-CLI
wp plugin install wp-graphql --activate

# Instalar Autenticação JWT para WPGraphQL
wp plugin install wp-graphql-jwt-authentication --activate

Configurar a autenticação JWT no wp-config.php:

// Configuração de Autenticação JWT
define('GRAPHQL_JWT_AUTH_SECRET_KEY', 'a-sua-chave-secreta-aqui');
define('GRAPHQL_JWT_AUTH_CORS_ENABLE', true);
define('GRAPHQL_JWT_AUTH_COOKIE_NAME', 'graphqlJwtAuth');

// Ativar CORS para acesso de aplicações móveis
define('GRAPHQL_API_CORS_ALLOW_ORIGIN', '*');
define('GRAPHQL_API_CORS_ALLOW_METHODS', 'POST, GET, OPTIONS');

Passo 2: Modelação de Conteúdos para Móvel

Estruturar tipos de conteúdo WordPress otimizados para consumo móvel:

// Registar tipo de post personalizado para conteúdo móvel
function register_mobile_content_type() {
    register_post_type('mobile_article', array(
        'labels' => array(
            'name' => 'Artigos Móveis',
            'singular_name' => 'Artigo Móvel'
        ),
        'public' => true,
        'show_in_graphql' => true,
        'graphql_single_name' => 'mobileArticle',
        'graphql_plural_name' => 'mobileArticles',
        'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
        'menu_icon' => 'dashicons-smartphone'
    ));
}
add_action('init', 'register_mobile_content_type');

Passo 3: Otimizar Media para Móvel

Configurar o WordPress para gerar tamanhos de imagem otimizados para móvel:

// Adicionar tamanhos de imagem otimizados para móvel
add_image_size('mobile_thumbnail', 300, 300, true);
add_image_size('mobile_featured', 800, 600, true);
add_image_size('mobile_hero', 1200, 800, true);

// Expor tamanhos de imagem no GraphQL
add_filter('graphql_post_object_connection_query_args', function($query_args, $source, $args, $context, $info) {
    $query_args['update_post_term_cache'] = false;
    $query_args['update_post_meta_cache'] = false;
    return $query_args;
}, 10, 5);

#Fase 2: Configuração da Aplicação React Native

Passo 1: Inicializar Projeto Expo

# Criar novo projeto Expo
npx create-expo-app WordPressMobileApp
cd WordPressMobileApp

# Instalar dependências necessárias
npm install @apollo/client graphql
npm install @react-navigation/native @react-navigation/stack
npm install react-native-screens react-native-safe-area-context
npm install @react-native-async-storage/async-storage
npm install jwt-decode

Passo 2: Configurar Apollo Client

Criar src/apollo/client.js:

import { ApolloClient, InMemoryCache, createHttpLink } from '@apollo/client';
import { setContext } from '@apollo/client/link/context';
import AsyncStorage from '@react-native-async-storage/async-storage';

const httpLink = createHttpLink({
  uri: 'https://o-seu-site-wordpress.com/graphql',
});

const authLink = setContext(async (_, { headers }) => {
  // Obter token de autenticação do armazenamento
  const token = await AsyncStorage.getItem('authToken');
  return {
    headers: {
      ...headers,
      authorization: token ? `Bearer ${token}` : '',
    },
  };
});

export const apolloClient = new ApolloClient({
  link: authLink.concat(httpLink),
  cache: new InMemoryCache({
    typePolicies: {
      Query: {
        fields: {
          mobileArticles: {
            keyArgs: ['first', 'where'],
            merge(existing = [], incoming) {
              // Combinar resultados para páginação infinita
              return [...existing, ...incoming.nodes];
            },
          },
        },
      },
    },
  }),
  defaultOptions: {
    watchQuery: {
      fetchPolicy: 'cache-and-network',
    },
  },
});

Passo 3: Implementação de Autenticação

Criar src/services/auth.js:

import { gql } from '@apollo/client';
import AsyncStorage from '@react-native-async-storage/async-storage';
import jwtDecode from 'jwt-decode';

const AUTH_TOKEN_MUTATION = gql`
  mutation LoginUser($username: String!, $password: String!) {
    login(input: { username: $username, password: $password }) {
      authToken
      refreshToken
      user {
        id
        name
        email
      }
    }
  }
`;

const REFRESH_TOKEN_MUTATION = gql`
  mutation RefreshToken($token: String!) {
    refreshJwtAuthToken(input: { jwtRefreshToken: $token }) {
      authToken
    }
  }
`;

class AuthService {
  async login(username, password) {
    try {
      const { data } = await apolloClient.mutate({
        mutation: AUTH_TOKEN_MUTATION,
        variables: { username, password },
      });

      const { authToken, refreshToken, user } = data.login;

      // Armazenar tokens de forma segura
      await AsyncStorage.setItem('authToken', authToken);
      await AsyncStorage.setItem('refreshToken', refreshToken);
      await AsyncStorage.setItem('userData', JSON.stringify(user));

      return { success: true, user };
    } catch (error) {
      return { success: false, error: error.message };
    }
  }

  async refreshAuthToken() {
    const refreshToken = await AsyncStorage.getItem('refreshToken');
    if (!refreshToken) return null;

    try {
      const { data } = await apolloClient.mutate({
        mutation: REFRESH_TOKEN_MUTATION,
        variables: { token: refreshToken },
      });

      const newToken = data.refreshJwtAuthToken.authToken;
      await AsyncStorage.setItem('authToken', newToken);
      return newToken;
    } catch (error) {
      await this.logout();
      return null;
    }
  }

  async logout() {
    await AsyncStorage.multiRemove(['authToken', 'refreshToken', 'userData']);
  }

  async isTokenValid() {
    const token = await AsyncStorage.getItem('authToken');
    if (!token) return false;

    try {
      const decoded = jwtDecode(token);
      return decoded.exp > Date.now() / 1000;
    } catch {
      return false;
    }
  }
}

export const authService = new AuthService();

#Fase 3: Obtenção e Apresentação de Conteúdos

Passo 1: Definir Consultas GraphQL

Criar src/graphql/queries.js:

import { gql } from '@apollo/client';

export const GET_MOBILE_ARTICLES = gql`
  query GetMobileArticles($first: Int = 10, $after: String) {
    mobileArticles(first: $first, after: $after) {
      nodes {
        id
        title
        excerpt
        content
        featuredImage {
          node {
            sourceUrl(size: MOBILE_FEATURED)
            altText
          }
        }
        author {
          node {
            name
            avatar {
              url
            }
          }
        }
        date
        categories {
          nodes {
            name
            slug
          }
        }
      }
      pageInfo {
        hasNextPage
        endCursor
      }
    }
  }
`;

export const GET_ARTICLE_BY_SLUG = gql`
  query GetArticleBySlug($slug: ID!) {
    mobileArticle(id: $slug, idType: SLUG) {
      id
      title
      content
      featuredImage {
        node {
          sourceUrl(size: MOBILE_HERO)
          altText
        }
      }
      author {
        node {
          name
          description
          avatar {
            url
          }
        }
      }
      date
      categories {
        nodes {
          name
          slug
        }
      }
      tags {
        nodes {
          name
          slug
        }
      }
    }
  }
`;

Passo 2: Criar Componente de Lista de Artigos

Criar src/components/ArticleList.js:

import React from 'react';
import { FlatList, View, Text, Image, TouchableOpacity, StyleSheet } from 'react-native';
import { useQuery } from '@apollo/client';
import { GET_MOBILE_ARTICLES } from '../graphql/queries';

const ArticleCard = ({ article, onPress }) => (
  <TouchableOpacity style={styles.card} onPress={() => onPress(article)}>
    <Image
      source={{ uri: article.featuredImage?.node?.sourceUrl }}
      style={styles.image}
      resizeMode="cover"
    />
    <View style={styles.content}>
      <Text style={styles.category}>
        {article.categories?.nodes?.[0]?.name?.toUpperCase()}
      </Text>
      <Text style={styles.title} numberOfLines={2}>
        {article.title}
      </Text>
      <Text style={styles.excerpt} numberOfLines={3}>
        {article.excerpt?.replace(/<[^>]*>/g, '')}
      </Text>
      <View style={styles.meta}>
        <Text style={styles.author}>{article.author?.node?.name}</Text>
        <Text style={styles.date}>
          {new Date(article.date).toLocaleDateString('pt-PT')}
        </Text>
      </View>
    </View>
  </TouchableOpacity>
);

export const ArticleList = ({ navigation }) => {
  const { data, loading, error, fetchMore } = useQuery(GET_MOBILE_ARTICLES, {
    variables: { first: 10 },
    notifyOnNetworkStatusChange: true,
  });

  if (error) return <Text>Erro: {error.message}</Text>;

  const loadMore = () => {
    if (data?.mobileArticles?.pageInfo?.hasNextPage) {
      fetchMore({
        variables: {
          after: data.mobileArticles.pageInfo.endCursor,
        },
      });
    }
  };

  return (
    <FlatList
      data={data?.mobileArticles?.nodes || []}
      renderItem={({ item }) => (
        <ArticleCard
          article={item}
          onPress={(article) => navigation.navigate('ArticleDetail', { slug: article.slug })}
        />
      )}
      keyExtractor={(item) => item.id}
      onEndReached={loadMore}
      onEndReachedThreshold={0.5}
      contentContainerStyle={styles.list}
    />
  );
};

const styles = StyleSheet.create({
  list: {
    padding: 16,
  },
  card: {
    backgroundColor: '#fff',
    borderRadius: 12,
    marginBottom: 16,
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.1,
    shadowRadius: 4,
    elevation: 3,
  },
  image: {
    width: '100%',
    height: 200,
    borderTopLeftRadius: 12,
    borderTopRightRadius: 12,
  },
  content: {
    padding: 16,
  },
  category: {
    fontSize: 12,
    color: '#4ade80',
    fontWeight: '600',
    marginBottom: 8,
  },
  title: {
    fontSize: 18,
    fontWeight: 'bold',
    marginBottom: 8,
    lineHeight: 24,
  },
  excerpt: {
    fontSize: 14,
    color: '#666',
    lineHeight: 20,
    marginBottom: 12,
  },
  meta: {
    flexDirection: 'row',
    justifyContent: 'space-between',
  },
  author: {
    fontSize: 12,
    color: '#999',
  },
  date: {
    fontSize: 12,
    color: '#999',
  },
});

#Estratégias de Otimização de Desempenho

As aplicações móveis exigem desempenho excecional, particularmente quando consomem APIs remotas. Estas estratégias garantem uma experiência de utilizador ótima.

#Estratégias de Cache

Configuração de Cache do Apollo Client

const cache = new InMemoryCache({
  typePolicies: {
    Query: {
      fields: {
        mobileArticles: {
          keyArgs: ['where', 'orderBy'],
          merge(existing = { nodes: [] }, incoming, { args }) {
            if (args?.after) {
              return {
                ...incoming,
                nodes: [...existing.nodes, ...incoming.nodes],
              };
            }
            return incoming;
          },
          read(existing) {
            return existing;
          },
        },
      },
    },
    MobileArticle: {
      fields: {
        content: {
          read(content) {
            // Remover HTML para pré-visualização
            return content?.replace(/<[^>]*>/g, ' ').trim();
          },
        },
      },
    },
  },
});

Otimização de Imagens

import { Image } from 'react-native';

// Carregamento progressivo de imagens
const ProgressiveImage = ({ thumbnailSource, source, style }) => {
  const [loaded, setLoaded] = React.useState(false);

  return (
    <View style={style}>
      <Image
        source={{ uri: thumbnailSource }}
        style={[style, { opacity: loaded ? 0 : 1 }]}
        blurRadius={2}
      />
      <Image
        source={{ uri: source }}
        style={[style, { opacity: loaded ? 1 : 0, position: 'absolute' }]}
        onLoad={() => setLoaded(true)}
      />
    </View>
  );
};

#Otimização de Rede

Agrupamento de Pedidos

Configurar Apollo Client para agrupamento de pedidos para reduzir overhead de rede:

import { BatchHttpLink } from '@apollo/client/link/batch-http';

const batchLink = new BatchHttpLink({
  uri: 'https://o-seu-site-wordpress.com/graphql',
  batchMax: 5,
  batchInterval: 20,
});

Suporte Offline

import { persistCache } from 'apollo3-cache-persist';
import AsyncStorage from '@react-native-async-storage/async-storage';

// Persistir cache para acesso offline
await persistCache({
  cache,
  storage: AsyncStorage,
  trigger: 'background',
  debounce: 1000,
});

#Considerações de Segurança

As aplicações móveis requerem medidas de segurança robustas, particularmente ao lidar com autenticação e dados de utilizadores.

#Melhores Práticas JWT

Armazenamento de Tokens: Utilizar sempre armazenamento seguro da plataforma:

import * as SecureStore from 'expo-secure-store';

// Armazenar tokens de forma segura
await SecureStore.setItemAsync('authToken', token, {
  keychainAccessible: SecureStore.WHEN_UNLOCKED,
});

// Recuperar tokens
const token = await SecureStore.getItemAsync('authToken');

Estratégia de Atualização de Tokens: Implementar atualização automática de tokens antes da expiração:

// Tratamento de erros do Apollo Client para atualização de tokens
const errorLink = onError(({ graphQLErrors, operation, forward }) => {
  if (graphQLErrors) {
    for (let err of graphQLErrors) {
      if (err.extensions?.code === 'invalid-jwt') {
        return fromPromise(
          authService.refreshAuthToken().catch(() => {
            authService.logout();
            return null;
          })
        ).flatMap((newToken) => {
          if (newToken) {
            operation.setContext({
              headers: {
                ...operation.getContext().headers,
                authorization: `Bearer ${newToken}`,
              },
            });
            return forward(operation);
          }
          return null;
        });
      }
    }
  }
});

#Cabeçalhos de Segurança da API

Configurar o WordPress para enviar cabeçalhos de segurança apropriados:

// Adicionar cabeçalhos de segurança para pedidos API
add_action('rest_api_init', function() {
    add_filter('rest_pre_serve_request', function($value) {
        header('X-Content-Type-Options: nosniff');
        header('X-Frame-Options: DENY');
        header('X-XSS-Protection: 1; mode=block');
        header('Referrer-Policy: strict-origin-when-cross-origin');
        return $value;
    });
});

#Dados Estruturados Amigáveis para LLM

{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "WordPress como Backend para Aplicações Móveis: Guia React Native",
  "description": "Guia técnico completo sobre a utilização de WordPress como Headless CMS para aplicações móveis React Native e Expo.",
  "author": {
    "@type": "Organization",
    "name": "WPPoland"
  },
  "datePublished": "2026-01-29",
  "dateModified": "2026-01-29",
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://wppoland.com/blog/wordpress-backend-mobile-apps-react-native"
  }
}
{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "name": "Como Utilizar WordPress como Backend para Aplicações React Native",
  "description": "Guia passo a passo para construir aplicações móveis com WordPress como Headless CMS",
  "totalTime": "PT4H",
  "supply": [
    "Instalação WordPress",
    "Node.js e npm",
    "Ambiente de desenvolvimento React Native"
  ],
  "step": [
    {
      "@type": "HowToStep",
      "position": 1,
      "name": "Configurar Backend WordPress",
      "text": "Instalar e configurar plugins WPGraphQL e JWT Authentication para permitir acesso API."
    },
    {
      "@type": "HowToStep",
      "position": 2,
      "name": "Configurar Projeto React Native",
      "text": "Inicializar projeto Expo e instalar Apollo Client para comunicação GraphQL."
    },
    {
      "@type": "HowToStep",
      "position": 3,
      "name": "Implementar Autenticação",
      "text": "Criar fluxo de autenticação baseado em JWT com armazenamento seguro de tokens é atualização."
    },
    {
      "@type": "HowToStep",
      "position": 4,
      "name": "Construir Componentes de Conteúdo",
      "text": "Desenvolver componentes React Native para obter é apresentar conteúdos WordPress."
    },
    {
      "@type": "HowToStep",
      "position": 5,
      "name": "Otimizar Desempenho",
      "text": "Implementar estratégias de cache, otimização de imagens e suporte offline."
    }
  ]
}
{
  "@context": "https://schema.org",
  "@type": "QAPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "O WordPress pode lidar com aplicações móveis de alto tráfego?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Sim, com cache e infraestrutura adequadas. Instalações empresariais WordPress servem milhões de pedidos diariamente. Implemente cache de objetos Redis, CDN para entrega de media e considere alojamento dedicado para cenários de alto tráfego."
      }
    },
    {
      "@type": "Question",
      "name": "Como é que o WordPress headless se compara ao Firebasé ou backends personalizados?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "O WordPress excede quando a gestão de conteúdos é primária - as equipas de marketing podem atualizar conteúdos sem intervenção de programadores. O Firebasé oferece capacidades em tempo real mais adequadas para chat ou aplicações ao vivo. Backends personalizados fornecem máxima flexibilidade mas requerem investimento significativo em desenvolvimento."
      }
    },
    {
      "@type": "Question",
      "name": "Qual é o impacto de desempenho de usar GraphQL vs REST?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "O GraphQL tipicamente melhora o desempenho móvel através de tamanhos de payload reduzidos e menos pedidos de rede. No entanto, consultas complexas podem aumentar o tempo de processamento do servidor. Implemente limites de complexidade de consulta e cache para resultados ótimos."
      }
    },
    {
      "@type": "Question",
      "name": "Posso usar plugins WordPress com arquitetura headless?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "A maioria dos plugins funciona, mas suas funcionalidades frontend não se aplicam. Plugins que estendem a REST API ou WPGraphQL funcionam normalmente. Plugins personalizados podem requerer definições adicionais de esquema GraphQL."
      }
    },
    {
      "@type": "Question",
      "name": "Como posso lidar com funcionalidades em tempo real como notificações push?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "O WordPress não suporta nativamente funcionalidades em tempo real. Integre com serviços como OneSignal, Firebase Cloud Messaging ou Pusher para notificações push é atualizações em tempo real."
      }
    }
  ]
}

#Artigos Relacionados

Para aprofundar os seus conhecimentos sobre desenvolvimento WordPress e otimização, consulte os seguintes recursos:

Última atualização: 29 de janeiro de 2026

Próximo passo

Transforme o artigo numa implementação real

Este bloco reforça a ligação interna e conduz o leitor para o passo seguinte mais útil dentro da arquitetura do site.

Quer implementar isto no seu site?

Se quer transformar o artigo em melhorias concretas, redesign ou num plano de implementação, posso fechar o escopo e executar.

Cluster relacionado

Explorar outros serviços WordPress e base de conhecimento

Reforce o seu negócio com suporte técnico profissional em áreas-chave do ecossistema WordPress.

O que é WordPress como Backend para Aplicações Móveis: Guia React Native?#
A implementação deve ser feita por etapas pequenas: definir o objetivo, testar a alteração, medir o impacto e só depois publicar.
Como funciona o WordPress como Backend para Aplicações Móveis: Guia React Native?#
WordPress como Backend para Aplicações Móveis: Guia React Native começa por confirmar o objetivo, rever o estado atual do site, aplicar a alteração em ambiente controlado e validar o resultado antes de publicar.
Porque é que o WordPress como Backend para Aplicações Móveis: Guia React Native é importante para o WordPress?#
A implementação deve ser feita por etapas pequenas: definir o objetivo, testar a alteração, medir o impacto e só depois publicar.

Precisa de FAQ adaptado ao setor e mercado? Criamos uma versão alinhada com os seus objetivos de negócio.

Fale connosco

Artigos Relacionados

WordPress 7.0 Armstrong lançado: infraestrutura de IA, Abilities API e o que realmente mudou

O WordPress 7.0 com o nome de código Armstrong foi lançado em maio de 2026, com infraestrutura de IA fundamental (Abilities API, AI Services Registry, AI Client), um painel modernizado, Command Palette em todo o lado, CSS personalizado ao nivel do bloco e o bloco Icons. A colaboracao em tempo real foi retirada durante o ciclo release candidate. Este guia e o resumo pos-lançamento: o que mudou, o que testar e o que ligar.