Show HN: Criei uma ferramenta CLI para gerar extensões web sem configuração de build
(github.com/cezaraugusto)- Extension.js é uma CLI para criar extensões web para Chrome, Edge e Firefox, permitindo começar o desenvolvimento apenas com
npx extension@latest create my-extensionenpm run dev - O objetivo é reduzir a fragmentação do Manifest V3, diferenças entre navegadores, ausência de hot reload em scripts de conteúdo e pipelines de build separados por destino a um fluxo de desenvolvimento sem configuração
- Oferece Hot Module Replacement para scripts de background, conteúdo, popup e opções, com suporte de primeira classe a componentes React, Vue, Svelte e Preact, além de TypeScript
- Com
extension build --zip, é possível criar um ZIP de produção para envio à Chrome Web Store, Edge Add-ons e Firefox AMO, além de builds específicos por navegador, como--browser=firefox - Também pode ser adotado em extensões existentes adicionando
extension@latestcomo dependência de desenvolvimento e conectando os scriptsbuild,devepreview
Problemas que o Extension.js busca resolver
- Extension.js é uma ferramenta CLI para criar extensões para Chrome, Edge e Firefox
- O fluxo básico de uso consiste em criar um novo projeto e depois iniciar o servidor de desenvolvimento
npx extension@latest create my-extensioncd my-extensionnpm run dev
- Funciona com
npm,pnpm,yarnebun - A documentação, os templates e os exemplos são fornecidos respectivamente em Documentation, Templates e Examples
Experiência de desenvolvimento e recursos principais
- Foca em reduzir problemas comuns no desenvolvimento de extensões de navegador, como fragmentação do Manifest V3, diferenças entre navegadores, falta de hot reload para scripts de conteúdo e pipelines de build por destino
- Hot Module Replacement é aplicado a scripts de background, content, popup e options
- Inclui também componentes React, Vue, Svelte e Preact
- Usa Manifest V3 por padrão e fornece adaptadores automáticos para os alvos Chrome, Edge e Firefox
- Com uma única CLI, é possível executar tendo como alvo Chrome, Edge, Firefox e binários baseados em Chromium ou Gecko
- Busca uma abordagem zero config, sem webpack, rollup ou plugins para manter
- Oferece suporte de primeira classe a TypeScript, React, Vue, Svelte e Preact
- Com
extension build --zip, é possível criar builds de produção adequados para envio à Chrome Web Store e ao Firefox Add-ons - Também pode ser adicionado a extensões existentes como uma única
devDependency
Diferenciais em relação a outras ferramentas de desenvolvimento de extensões
- Apresenta as diferenças do Extension.js por recurso para usuários que já experimentaram Plasmo, WXT e CRXJS
- É possível executar amostras do GitHub diretamente
- Ex.:
extension dev https://github.com/.../sample
- Ex.:
- Fornece binários de navegador gerenciados
- Ex.:
extension install firefoxbaixa uma build isolada do Firefox
- Ex.:
- Inclui HMR cross-browser para scripts de conteúdo, sem necessidade de conectar plugins separados
- Permite criar ZIPs de produção para envio às lojas
- Ex.:
extension build --zip
- Ex.:
- Não é dependente de framework
- Permite especificar binários personalizados de Chromium e Gecko
--chromium-binary--gecko-binary
Frameworks e navegadores suportados
- Os frameworks suportados e exemplos de execução são fornecidos como templates ou exemplos
- Flags relacionadas a navegador podem ser usadas em
extension dev,extension starteextension preview--browser <chrome | edge | firefox>seleciona o navegador--chromium-binary <path-to-binary>especifica um binário Chromium personalizado--gecko-binary <path-to-binary>especifica um binário Gecko ou Firefox personalizado
- Os navegadores suportados são Google Chrome, Microsoft Edge, Mozilla Firefox, baseados em Chromium e baseados em Gecko
- Apple Safari aparece marcado como
Next
Build, empacotamento e navegadores gerenciados
- O build de produção é executado com
npx extension@latest build - O pacote ZIP para envio às lojas é gerado com
npx extension@latest build --zip - Builds específicos por navegador também são possíveis
- Ex.:
npx extension@latest build --browser=firefox --zip
- Ex.:
- Flags úteis de build são fornecidas
--zip: empacota como ZIP para upload em lojas--zip-source: inclui os arquivos-fonte para revisão de código-fonte pela loja--zip-filename <name>: controla o nome do arquivo de saída--polyfill: ativa o polyfill webextension cross-browser
- O Extension.js pode baixar e gerenciar binários de navegador isolados para sessões de desenvolvimento limpas
npx extension@latest install firefoxnpx extension@latest install --browser=allnpx extension@latest install --where
Extensões existentes e execução de amostras
- Em extensões existentes, ele é instalado como dependência de desenvolvimento
npm install extension@latest --save-dev
- É possível usá-lo conectando
extension build,extension deveextension previewaos scripts dopackage.jsonnpm run dev: desenvolvimentonpm run build: build de produçãonpm run preview: verificar a saída de produção
- É possível trazer e executar diretamente amostras do Chrome Extension Samples
- Ex.:
npx extension@latest dev https://github.com/GoogleChrome/chrome-extensions-samples/… --browser=edge
- Ex.:
- A comunidade e os exemplos estão disponíveis em Discord, GitHub issues e examples
- A licença é MIT
1 comentários
Comentários do Hacker News
Projeto bacana. Estou pensando em usar também na minha extensão (https://github.com/herrherrmann/omnivore-list-popup)
Até agora eu vinha cuidando por conta própria, com scripts, do build da extensão e do gerenciamento do modo de desenvolvimento, mas já estava vendo se dava para fazer isso de forma mais prática com web-ext
Só que meu navegador principal é o Firefox, e o Extension.js ainda não parece oferecer suporte completo ao Firefox
--polyfill, mas hoje ainda é preciso adicionar a extensão manualmente no FirefoxHá planos de incluir suporte ao Firefox em breve, mas por enquanto não há um launcher de navegador
É exatamente a ferramenta de que eu precisava agora. Obrigado por criar e compartilhar, e espero que o suporte ao Firefox fique bom
Issue de suporte ao Firefox: https://github.com/cezaraugusto/extension.js/issues/5
manifest.jsonPor exemplo, há diferenças entre páginas de evento e service workers em segundo plano, ou casos em que as permissões exigidas ou proibidas variam de forma inconsistente entre navegadores
Estou meio confuso. Já escrevi uma extensão só para Chrome em JavaScript, e começar foi basicamente copiar alguns arquivos do site de documentação de extensões do Chrome
Não configurei IDE à parte e nem sei bem o que deveria fazer
Quero entender o que essa ferramenta faz além de copiar alguns arquivos. Fico me perguntando se é suporte cross-browser ou suporte a várias linguagens
Depois de copiar alguns arquivos da documentação de extensões do Chrome, você precisa ativar manualmente o “modo de desenvolvedor” no navegador e adicionar os arquivos. Quando altera o código, precisa recarregar manualmente os vários contextos de execução afetados pela extensão do navegador para ver as mudanças. Para testar em vários navegadores, é preciso repetir esse processo em cada um
Se quiser usar dependências de pacotes como TypeScript ou frameworks JavaScript, você precisa depender de algum framework de abstração para extensões já existente e aprender uma nova abordagem, ou criar sua própria configuração com ferramentas como webpack, Parcel ou esbuild. A essa altura, o desenvolvimento de extensões de navegador pode ficar complexo e frustrante
O Extension.js simplifica isso automatizando o processo de empacotar e executar a extensão em navegadores de desenvolvimento. Ele oferece recarregamento automático para todos os contextos de execução, inclusive áreas do navegador que não são HTML/CSS/JavaScript, e também dá suporte a dependências de código como TypeScript e React só com a instalação, sem mágica de configuração adicional. Também roda simultaneamente em vários navegadores
Bom projeto. Fiz minha primeira extensão para Chrome com https://crxjs.dev/vite-plugin/getting-started, mas deu bastante trabalho fazer os estilos funcionarem direito
Talvez tenha sido por ser meu primeiro desenvolvimento de extensão de navegador: https://chromewebstore.google.com/detail/bettermenu-for-door...
Ainda tenho muita coisa para fazer, então também vou dar uma olhada neste projeto
Muito legal. Até o README está lindo e bem feito
Eu vinha adiando colocar uma extensão no app porque o Google Play é uma bagunça, mas pretendo experimentar isso
Legal. Fico curioso para saber como ele se compara ao Plasmo, um framework parecido
https://www.plasmo.com/
Também precisa seguir arquivos de configuração e regras específicas que não estão necessariamente relacionados à própria extensão de navegador
Já o Extension.js permite criar extensões com as APIs padrão de extensões e abstrai apenas os arquivos de configuração. Não é preciso aprender detalhes específicos da ferramenta. Assim, se exemplos do Chrome ou da MDN funcionam tendo o arquivo de manifesto como única referência, não é necessário refatorá-los para usar no Extension.js, o que facilita iniciar um novo projeto e criar protótipos
Já fiz algumas extensões. Uma era meio de brincadeira: quando o imgur mudou a cor do coração e todo mundo reclamou, ela mudava essa cor
Toda vez que faço uma extensão para Chrome, tenho uma forte síndrome do impostor. Por algum motivo, é difícil demais criar um novo projeto, então uma ferramenta assim seria muito boa
Gostei. Seria bom se também passasse um pouco de mágica na comunicação entre extensão e abas
Toda vez que faço uma extensão, ler o DOM ou enviar mensagens da extensão para a aba ativa é sempre doloroso
https://docs.plasmo.com/framework/messaging
Adicionei uma issue. Suporte ao Safari deve ser relativamente simples usando a ferramenta CLI safari-web-extension-converter da Apple
Parece bom. Pretendo experimentar na minha extensão Vim for Docs
É uma pena o Firefox não ser suportado, mas, de qualquer forma, também não há exatamente uma ferramenta de build de extensões que dê suporte tanto ao Firefox quanto a navegadores baseados em Chromium