Vize

Encadernações WASM

⚠️ Trabalho em andamento: O Vize está em desenvolvimento ativo e ainda não está pronto para uso em produção. APIs do WASM podem mudar sem aviso prévio.

@vizejs/wasm fornece bindings WebAssembly para executar o compilador Vue diretamente no navegador. Isso permite compilação, linting e formatação de SFC em tempo real sem servidor — ideal para playgrounds, documentação e ferramentas educacionais.

As ligações WASM são compiladas a partir do mesmo código Rust que as ligações CLI e NAPI (vize_vitrine), garantindo saída de compilação idêntica em todas as plataformas.

Instalação

Instale vp uma vez a partir do Vite+ install guide, depois adicione o pacote:

vp install @vizejs/wasm

API

Compatibilidade com opções de compilador

O tipo CompilerOptions é o inventário de opções suportado para compile, compileVapor, parseTemplatee compileSfc. Chaves de objeto desconhecidas são ignoradas na fronteira do JavaScript e não são promessas de compatibilidade. vueParserQuirks permanece como um pseudônimo obsoleto para templateSyntax: "quirks"; Uma templateSyntax explícita sempre tem prioridade. A experimentalServerScript de campo compartilhada de Rust é reservada e não é exposta até que uma etapa do compilador WASM a implemente. Cada fachada ignora campos suportados que não se aplicam à sua etapa de compilador: bindingMetadata se aplica apenas à compilação direta de templates. Nomes de runtime se aplicam a módulos VDOM gerados e à saída do cliente SFC (VDOM ou Vapor); os mapas de fonte aplicam-se à saída VDOM, incluindo o resultado do template retornado por compileSfc. outputMode e scriptExt se aplicam apenas à compilação SFC.

Compilar SFC

Compile um componente de arquivo único do Vue em JavaScript:

import init, { compileSfc } from "@vizejs/wasm";

await init();

const result = compileSfc(
  `<template>
    <div>{{ msg }}</div>
  </template>

  <script setup lang="ts">
  const msg = ref('Hello Vize!')
  </script>`,
  { filename: "App.vue" },
);

console.log(result.script.code); // compiled <script> / <script setup>
console.log(result.template?.code); // compiled render function, when a template exists
console.log(result.css); // compiled styles, when styles exist

SFC de fiapos

Regras específicas de fiapos para corrida Vue em um SFC:

import init, { lintSfc } from "@vizejs/wasm";

await init();

const result = lintSfc(source, {
  filename: "App.vue",
  locale: "en", // 'en' | 'ja' | 'zh'
});

for (const diagnostic of result.diagnostics) {
  console.log(
    `${diagnostic.severity}: ${diagnostic.message} (line ${diagnostic.location.start.line})`,
  );
}

Formato SFC

Formate um Vue SFC:

import init, { formatSfc } from "@vizejs/wasm";

await init();

const formatted = formatSfc(source, { printWidth: 80 });

console.log(formatted.code);

Inicialização

A função init() deve ser chamada uma vez antes de usar qualquer outra API. Ele carrega e instancia o módulo WebAssembly:

import init from "@vizejs/wasm";

// Basic initialization
await init();

// With custom WASM URL (useful for CDN or bundler setups)
await init("https://cdn.example.com/vize_vitrine_bg.wasm");

Casos de Uso

Playgrounds

Construa playgrounds interativos de compilação do Vue que rodem inteiramente no navegador. O Vize Playground oficial usa as ligações WASM para compilação em tempo real:

// React to editor changes and compile in real-time
editor.onChange((source) => {
  const result = compileSfc(source, {
    filename: "Playground.vue",
  });

  if (result.errors.length === 0) {
    preview.update({
      script: result.script.code,
      template: result.template?.code,
      css: result.css,
    });
  } else {
    diagnostics.show(result.errors);
  }
});

Documentação

Incorpore exemplos ao vivo e editáveis do Vue na sua documentação:

// Compile documentation examples on the fly
const examples = document.querySelectorAll("[data-vue-example]");
for (const el of examples) {
  const result = compileSfc(el.textContent, {
    filename: `example-${el.id}.vue`,
  });
  // Use result.script.code, result.template?.code, and result.css to mount it.
}

Educação

Crie ferramentas interativas de exploração de compiladores que mostrem a saída da compilação em tempo real, ajudando os desenvolvedores a entender como os templates do Vue são transformados.

CI/CD

Use bindings WASM para compilação leve em ambientes onde binários nativos não estão disponíveis (por exemplo, Cloudflare Workers, Deno Deploy, CI baseado em navegador).

Construindo a partir da Fonte

# Install wasm-bindgen-cli
cargo install wasm-bindgen-cli

# Build WASM
cargo build --release -p vize_vitrine \
  --no-default-features \
  --features wasm \
  --target wasm32-unknown-unknown

# Generate JS bindings
wasm-bindgen \
  target/wasm32-unknown-unknown/release/vize_vitrine.wasm \
  --out-dir npm/wasm \
  --target web

Internacionalização

Todas as APIs WASM que produzem diagnósticos (lint, erros de compilação) suportam mensagens localizadas:

Código Idioma
en Inglês (padrão)
ja Japonês (日本語)
zh Chinês (中文)

Passe a opção locale para qualquer API que produza diagnósticos:

const result = lintSfc(source, {
  filename: "App.vue",
  locale: "ja", // Lint messages in Japanese
});

console.log(result.diagnostics);

Tamanho do feixe

O módulo WASM inclui o pipeline completo do compilador Vue (analisador parser, analisador semântico, gerador de código) compilado para WebAssembly. O tamanho do bundle com gzip é aproximadamente 1,5 MB, o que é adequado para carregamento não por caminho crítico (por exemplo, carregado após a interatividade da página).

Para uso em produção, considere o carregamento preguiçoso do módulo WASM:

// Lazy-load the compiler only when needed
const compiler = await import("@vizejs/wasm");
await compiler.default(); // init()
const result = compiler.compileSfc(source, opts);
console.log(result.script.code, result.template?.code, result.css);