Biblioteca Office WASM — Início Rápido
O pacote office-oxide-wasm é o office_oxide compilado para WebAssembly. Zero dependências nativas, um único binário do core em Rust e três entradas via subpath para que rode em qualquer lugar onde JavaScript rode — navegadores, Node.js e bundlers como Vite, Webpack e Rollup.
Para Node.js sem o overhead de WASM, use o pacote nativo
office-oxide.
Instalação
npm install office-oxide-wasm
Sem passo de postinstall. Funciona em Node 18+, navegadores modernos com suporte a WebAssembly e qualquer ambiente com loader ES module / CommonJS.
Exports por subpath
| Caminho de import | Alvo | Formato |
|---|---|---|
office-oxide-wasm (padrão) |
ESM amigável a bundlers (Vite, Webpack, Rollup) | ESM |
office-oxide-wasm/node |
Node.js | CommonJS |
office-oxide-wasm/web |
Navegadores via <script type="module"> ou import |
ESM, requer init() |
Escolha a variante que combina com seu runtime.
Ler um documento
Bundler (ESM)
import { WasmDocument } from 'office-oxide-wasm';
const res = await fetch('/report.docx');
const data = new Uint8Array(await res.arrayBuffer());
const doc = new WasmDocument(data, 'docx');
try {
console.log(doc.plainText());
} finally {
doc.free();
}
Node.js (CJS)
const { readFileSync } = require('node:fs');
const { WasmDocument } = require('office-oxide-wasm/node');
const data = readFileSync('report.docx');
const doc = new WasmDocument(data, 'docx');
try {
console.log(doc.plainText());
} finally {
doc.free();
}
Navegador (sem bundler)
<script type="module">
import init, { WasmDocument } from 'https://cdn.jsdelivr.net/npm/office-oxide-wasm/web/office_oxide.js';
await init();
const res = await fetch('/report.docx');
const data = new Uint8Array(await res.arrayBuffer());
const doc = new WasmDocument(data, 'docx');
try {
document.body.textContent = doc.plainText();
} finally {
doc.free();
}
</script>
Apenas no navegador: é obrigatório
await init()antes de construir umWasmDocument. As entradas para Node e bundlers cuidam da inicialização internamente.
API principal
WasmDocument é o único handle — o build WASM não tem a divisão Document / EditableDocument (a edição vive nos bindings nativos).
import { WasmDocument } from 'office-oxide-wasm';
const doc = new WasmDocument(bytes, 'xlsx');
try {
console.log(doc.formatName()); // "xlsx"
console.log(doc.plainText());
console.log(doc.toMarkdown());
console.log(doc.toHtml());
const ir = doc.toIr(); // objeto já parseado
} finally {
doc.free(); // obrigatório — memória WASM não é gerida por GC
}
Todos os métodos são em camelCase: plainText, toMarkdown, toHtml, toIr, formatName. bytes precisa ser Uint8Array. format precisa ser um de 'docx' | 'xlsx' | 'pptx' | 'doc' | 'xls' | 'ppt'.
Os formatos binários legados (doc, xls, ppt) também são parseados em WASM.
Edição (não está no WASM)
EditableDocument — substituição de texto e escrita de células — não é exposto pelo build WASM. Para editar, use:
- Binding nativo para Node (
office-oxide) - Binding Python
- Binding .NET
- Crate Rust
Para fluxos somente leitura — texto / Markdown / HTML / IR — o WASM tem todos os recursos.
IR independente de formato
const doc = new WasmDocument(bytes, 'docx');
const ir = doc.toIr();
doc.free();
for (const section of ir.sections) {
console.log(section.title);
for (const el of section.elements) {
// el.kind: "Heading" | "Paragraph" | "Table" | "List" | "Image" | ...
}
}
O esquema IR bate exatamente com a DocumentIR em Rust, então pipelines do lado do servidor e do cliente podem compartilhar o mesmo processador.
Bytes entram, bytes saem
O build WASM aceita só bytes — não há superfície de I/O de arquivo.
// De um <input type="file">
const file = inputEl.files[0];
const data = new Uint8Array(await file.arrayBuffer());
const doc = new WasmDocument(data, file.name.split('.').pop().toLowerCase());
// De fetch
const res = await fetch(url);
const data = new Uint8Array(await res.arrayBuffer());
// No Node
const data = new Uint8Array(require('node:fs').readFileSync('file.docx'));
Bundlers
// Vite — geralmente sem configuração
import { WasmDocument } from 'office-oxide-wasm';
// Webpack 5 — adicione em module.rules:
// { test: /\.wasm$/, type: 'asset/resource' }
TypeScript
Definições de tipo (office_oxide.d.ts) acompanham o glue JS para cada subpath. Importar pela raiz pega automaticamente os tipos para bundler; import type { WasmDocument } from 'office-oxide-wasm/node' também funciona.
Gerenciamento de memória
const doc = new WasmDocument(bytes, 'docx');
try {
// ... trabalho
} finally {
doc.free();
}
Esquecer o free() faz a memória WASM vazar até a instância ser destruída.
Erros
As falhas surgem como instâncias normais de Error, com mensagem descritiva. Como o build WASM usa JsValue::from_str, os códigos de erro não são expostos numericamente — verifique o texto da mensagem.
Solução de problemas
| Sintoma | O que fazer |
|---|---|
ReferenceError: WebAssembly is not defined |
O ambiente alvo não suporta WASM. Use o pacote nativo office-oxide. |
Navegador: TypeError: ... before init() |
Esqueceu o await init() ao usar office-oxide-wasm/web. |
Bundler reclama de .wasm |
Adicione uma regra de asset para WASM ou troque o target para esnext. |
unsupported format: pdf |
Apenas seis formatos são aceitos: docx, xlsx, pptx, doc, xls, ppt. |
| Memória cresce sem parar em loop quente | Não está chamando doc.free() entre as iterações. |
Veja também
- Binding nativo para Node — mais rápido, suporta edição
- Benchmarks de performance
- Pacote no npm