title: "Mejores prácticas de WebAssembly y TinyGo" section: webassembly-tinygo order: 10 tags:
- "go"
- "webassembly-tinygo"
- "best-practices"
- "list"
- "webassembly"
- "tinygo" level: basic description: "Aprende las mejores prácticas para WebAssembly y TinyGo, incluyendo pruebas CI, evitar syscall/js y optimizar la higiene de compilación de WASM." highlights:
- "Compilaciones de servidor predeterminadas a wasip1/wasm, no a js/wasm"
- "CI debe compilar WASM y realizar pruebas de humo con wasmtime"
- "Aislar syscall/js detrás de las etiquetas js && wasm"
- "Preabrir directorios de mínimo privilegio en los hosts"
- "Fijar versiones de Go, TinyGo, wasmtime y wazero juntas" updated: "2026-07-16"
Mejores prácticas de WebAssembly y TinyGo
Pruebas de compilaciones WASM en CI y evitación de syscall/js en módulos de servidor.
Estas reglas mantienen los artefactos WASM portátiles, amigables con el sandbox y de tamaño apropiado, desde el primer prototipo hasta los hosts de producción.
Cómo usar esta lista
- Aplica durante la revisión de diseño cuando una característica mencione WASM, TinyGo, wazero o despliegue en el borde (edge).
- Agrega pasos de compilación
GOOS=wasip1 GOARCH=wasmy de prueba de humowasmtime runa CI para paquetes invitados. - Empareja con la Guía de decisión de Go nativo vs TinyGo vs Rust WASM cuando la elección de la cadena de herramientas no esté decidida.
- Revisa después de las actualizaciones menores de Go; el comportamiento del tiempo de ejecución de WASM evoluciona (la fragmentación del heap de Go 1.26 es un ejemplo reciente).
A - Higiene de destino y compilación
- Establece los módulos de servidor predeterminados en
wasip1/wasm. Reservajs/wasmsolo para requisitos del DOM del navegador. - Nunca importes
syscall/jsen paquetes WASI. Aplícalo con etiquetas de compilaciónjs && wasmen archivos del navegador. - Elimina las versiones de lanzamiento de WASM con
-ldflags="-s -w". Conserva los artefactos sin eliminar en el almacenamiento de CI para el análisis de fallos. - Fija las versiones de la cadena de herramientas en las imágenes de CI. Registra Go 1.26.x, TinyGo, wasmtime y wazero juntos en el registro de compilación.
- Audita
go list -depspara las entradas principales de invitados. Rechaza importaciones accidentales denet/http/pprofo solo de prueba en los puntos de entrada de los plugins.
B - CI y pruebas
- Compila WASM en cada PR que toque código de invitado.
GOOS=wasip1 GOARCH=wasm go build ./...detecta regresiones de importación tempranamente. - Ejecuta pruebas de humo de invitados con wasmtime. Los códigos de salida distintos de cero deben fallar el pipeline como los binarios nativos.
- Refleja las pruebas de incrustación de wazero si los hosts de producción están en Go. El éxito de la CLI no garantiza que la configuración de incrustación sea correcta.
- Agrega trabajos de compilación de TinyGo cuando TinyGo se envíe a producción.
tinygo build -target=wasmpuede fallar mientras que las compilaciones de gc pasan. - Registra los tamaños de los artefactos en CI. Rastrea los bytes de gc vs TinyGo para detectar la hinchazón de dependencias con el tiempo.
C - Tiempo de ejecución del host y sandboxing
- Preabrir directorios con mínimo privilegio. Mapea solo las rutas de host requeridas en los espacios de nombres de invitados (
--dir/FSConfigde wazero). - Pasa el entorno explícitamente. No confíes en la paridad implícita del entorno del host entre los portátiles de desarrollo y la producción.
- Limita la ejecución de invitados con plazos de contexto en wazero. Evita la CPU descontrolada en incrustadores multitenant.
- Almacena en caché los módulos compilados en hosts de larga ejecución. La reinicialización de compilaciones en frío domina la latencia.
- Elige wazero para incrustadores puramente Go; wasmtime para paridad CLI/desarrollo. Documenta por qué si eliges lo contrario.
D - Tamaño y selección de la cadena de herramientas
- Mide el tamaño antes de elegir gc vs TinyGo. Compara
ls -lhen la misma porción de funcionalidad, no solo en "hola mundo". - Reevalúa gc WASM en Go 1.26+ cuando la memoria era el bloqueo. Los fragmentos de heap más pequeños ayudan a los grupos densos de wazero.
- Usa TinyGo para MCU y límites de borde sub-megabyte. Verifica las limitaciones de la biblioteca estándar y la reflexión con un pico de compilación primero.
- Evita marcos JSON/reflexión pesados en invitados TinyGo. Prefiere estructuras pequeñas y marshaling ajustado a mano.
- Documenta la cadena de herramientas por plugin en los metadatos del registro de plugins. Los operadores deben saber qué compilador construyó cada
.wasm.
E - Navegador y syscall/js
- Versiona
wasm_exec.jscon tu cadena de herramientas Go. Las discrepancias causan fallos de importación oscuros en los navegadores. - Llama a
js.Func.Release()al eliminar los listeners. Previene fugas en páginas SPA de larga duración. - Bloquea
mainconselect {}en invitados del navegador. Salir demaindeshabilita el tiempo de ejecución antes de que se activen las devoluciones de llamada. - Sirve
.wasmcomoapplication/wasm. Corrige los mapas MIME del servidor estático parainstantiateStreaming. - Mantén pequeña la superficie de la interfaz DOM. Prefiere TS/React para el diseño; WASM para la computación cuando sea posible.
F - Operaciones y seguridad
- Trata WASM como artefactos inmutables versionados. Publica hashes; actualiza intercambiando deliberadamente los bytes del módulo.
- No montes la raíz del host en los invitados. Un plugin comprometido no debería leer todo el sistema de archivos.
- Alinea las concesiones de capacidades WASI entre desarrollo y producción. La deriva aquí es un modo de fallo común de "funciona localmente".
- Actualiza Go para correcciones de seguridad en invitados de criptografía. Fija a 1.26.x y recompila WASM en lanzamientos de seguridad.
- Ejecuta los modernizadores
go fixen paquetes compartidos.go fixde Go 1.26 mantiene el código idiomático antes de compilar cruzado a WASM.
Preguntas frecuentes
¿Cuál es el error WASM más común en los repositorios de Go?
Compilar plugins de servidor a js/wasm o filtrar syscall/js en compilaciones wasip1.
Predetermina a wasip1 y aplica etiquetas de compilación en la revisión.
¿CI mínimo para WASM?
GOOS=wasip1 GOARCH=wasm go build más wasmtime run en al menos un binario invitado representativo por módulo.
¿Cuándo debe aparecer TinyGo en CI?
Siempre que los artefactos de despliegue de producción se produzcan con TinyGo, incluyendo firmware MCU y WASM con límite de tamaño en el borde.
¿Cómo cambia Spin las prácticas?
Agrega spin build y enruta las pruebas; los desencadenadores HTTP pueden reemplazar los listeners net/http directos en los invitados.
¿Debo fijar las versiones de la API de wazero?
Sí, en go.mod junto con Go 1.26.x.
Las API del tiempo de ejecución evolucionan; las actualizaciones deben ejecutar pruebas de integración de incrustación.
¿Siguen siendo relevantes los interruptores GOWASM en la versión 1.26?
signext y satconv se ignoran según las notas de la versión.
Lee la documentación actual en cada actualización en lugar de copiar banderas antiguas.
¿Cómo pruebo invitados del sistema de archivos localmente?
Usa wasmtime run --dir $(pwd)::/work (o rutas más ajustadas) y mantén los mismos montajes en la configuración del módulo de wazero.
¿Qué pertenece a un ADR?
Cadena de herramientas elegida, mediciones de tamaño/memoria, alternativas rechazadas, tiempo de ejecución del host y matriz de capacidades para FS/env/red.
Relacionados
- Compilación con GOOS=wasip1 GOARCH=wasm - comandos de compilación
- Tiempos de ejecución de host WASI: wasmtime, wazero y Spin - configuración del host
- syscall/js: Go en el Navegador - interop solo para navegador
- Mejoras en el tiempo de ejecución y memoria de WASM de Go 1.26 - desencadenadores de actualización
- Conceptos básicos de WebAssembly y TinyGo - puntos de partida prácticos
Versiones de pila: Esta página fue escrita para Go 1.26.x (predeterminado de Green Tea GC, modernizadores de
go fix- verifica el parche en la compilación), chi (última versión - verifica en la compilación), gin (última versión - verifica en la compilación), echo (última versión - verifica en la compilación), google.golang.org/grpc (última versión - verifica en la compilación), sigs.k8s.io/controller-runtime (última versión - verifica en la compilación), kubebuilder (última versión - verifica en la compilación), tinygo (última versión - verifica los objetivos de placa en la compilación), wazero (última versión - verifica en la compilación) y golangci-lint (última versión - verifica el conjunto de linters en la compilación).