跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

前端实现 Word 文档在线编辑与导出:基于 mammoth.js 与 Blob 对象

综述由AI生成介绍利用 mammoth.js 和 Blob 对象在浏览器中实现 Word 文档在线编辑与导出的技术方案。通过解析.docx 的 XML 结构将其转换为语义化 HTML,配合 Blob 对象包装数据并触发下载。文章涵盖环境搭建、文件上传转换、内容编辑导出等核心步骤,提供完整代码示例。同时对比了原生 Blob、mammoth.js 及 docxtemplater 三种方案的优缺点,并针对中文乱码、样式一致性、大型文档性能等问题给出了解决策略,适用于企业内部系统或项目管理工具中的文档处理需求。

BigDataPan发布于 2026/4/5更新于 2026/5/2033 浏览

前端实现 Word 文档在线编辑与导出

如何在浏览器中直接编辑 Word 文档并导出?本文将深入探索一种基于 mammoth.js 和 Blob 对象的完整技术方案。

在当今的 Web 应用开发中,实现文档的在线编辑与导出已成为常见需求。无论是企业内部系统、教育平台还是项目管理工具,都迫切需要让用户能够在浏览器中直接编辑 Word 文档,而无需安装桌面软件。本文将详细介绍如何利用 mammoth.js 和 Blob 对象实现这一功能,并对比其他可行方案。

一、为什么选择 mammoth.js 与 Blob 方案?

在 Web 前端实现 Word 文档处理,主要有三种主流方案:浏览器原生 Blob 导出、mammoth.js 专业转换和基于模板的 docxtemplater 方案。它们各有优劣,适用于不同场景。

mammoth.js 的核心优势在于它能将.docx 文档转换为语义化的 HTML,而非简单复制视觉样式。这意味着它生成的 HTML 结构清晰、易于维护和样式定制。配合 Blob 对象,我们可以轻松将编辑后的内容重新导出为 Word 文档。

与直接使用 Microsoft Office Online 或 Google Docs 嵌入相比,mammoth.js 方案不依赖外部服务,能更好地保护数据隐私,且可定制性更高。

二、实现原理与技术架构

2.1 mammoth.js 的转换原理

mammoth.js 的工作原理可分为四个关键阶段:

  1. 文档解析:读取.docx 文件的 XML 结构(.docx 本质上是包含多个 XML 文件的压缩包)
  2. 样式处理:识别 Word 文档中的样式定义,并应用用户定义的样式映射规则
  3. 转换引擎:将文档元素转换为对应的 HTML 元素
  4. 输出生成:生成最终的 HTML 代码
// 基本转换示例
mammoth.convertToHtml({arrayBuffer: arrayBuffer}).then(function(result) {
    // result.value 包含生成的 HTML
    document.getElementById('editor').innerHTML = result.value;
}).catch(function(error) {
    console.error('转换出错:', error);
});

2.2 Blob 对象的作用

Blob(Binary Large Object)对象代表不可变的原始数据,类似于文件对象。在前端文件操作中,它扮演着关键角色:

  1. 数据包装:将 HTML 内容包装成 Word 文档格式
  2. 类型指定:通过 MIME 类型声明文档格式(如 application/msword)
  3. 下载触发:结合 URL.createObjectURL() 实现文件下载

三、完整实现步骤

3.1 基础环境搭建

首先,在 HTML 中引入 mammoth.js 并构建基本界面:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Word 在线编辑器</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/mammoth/1.5.1/mammoth.browser.min.js"></script>
    <style>
        .editor-container { display: flex; height: 80vh; }
        #editor { flex: 1; border: 1px solid #ccc; padding: 20px; overflow-y: auto; }
    </style>
</head>
<body>
    <input type="file" id="fileInput" accept=".docx">
    <button id="exportBtn">导出为 Word</button>
    <div class="editor-container">
        <div id="editor" contenteditable="true"></div>
    </div>
    <script>// 实现代码将在这里</script>
</body>
</html>

3.2 文档上传与转换

实现文件上传和 Word 到 HTML 的转换:

document.getElementById('fileInput').addEventListener('change', function(event) {
    const file = event.target.files[0];
    if (!file) return;
    const reader = new FileReader();
    reader.onload = function(e) {
        const arrayBuffer = e.target.result;
        // 使用 mammoth 进行转换
        mammoth.convertToHtml({arrayBuffer: arrayBuffer}).then(function(result) {
            document.getElementById('editor').innerHTML = result.value;
        }).catch(function(error) {
            console.error('转换出错:', error);
        });
    };
    reader.readAsArrayBuffer(file);
});

3.3 内容编辑与导出

实现编辑后内容的导出功能:

document.getElementById('exportBtn').addEventListener('click', function() {
    // 获取编辑后的内容
    const editedContent = document.getElementById('editor').innerHTML;
    // 创建 Word 文档的 HTML 结构
    const fullHtml = `
        <html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word">
        <head>
            <meta charset="UTF-8">
            <title>编辑后的文档</title>
            <style>
                body { font-family: '宋体', serif; font-size: 12pt; }
            </style>
        </head>
        <body>${editedContent}</body>
        </html>`;
    // 创建 Blob 对象并触发下载
    const blob = new Blob(['\uFEFF' + fullHtml], { type: 'application/msword' });
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = '编辑后的文档.doc';
    document.body.appendChild(a);
    a.click();
    // 清理资源
    setTimeout(() => {
        document.body.removeChild(a);
        URL.revokeObjectURL(url);
    }, 100);
});

四、高级功能与优化

4.1 样式映射定制

mammoth.js 的强大之处在于其样式映射系统,允许自定义转换规则:

const options = {
    styleMap: [
        "p[style-name='Title'] => h1:fresh",
        "p[style-name='Subtitle'] => h2:fresh",
        "p[style-name='Warning'] => div.warning:fresh",
        "b => strong",
        "i => em"
    ]
};
mammoth.convertToHtml({arrayBuffer: arrayBuffer}, options).then(function(result) {
    // 应用自定义样式映射的结果
});

4.2 图片处理策略

处理文档中的图片是一个常见挑战,mammoth.js 提供了灵活的解决方案:

  1. Base64 内嵌:默认将图片转换为 Base64 格式直接嵌入 HTML
  2. 外部文件输出:可将图片保存为独立文件并更新引用路径

4.3 实时协作支持(进阶)

对于需要多人协作的场景,可以结合 WebSocket 或 SignalR 实现实时同步:

// 简化的协作编辑示例
const socket = new WebSocket('wss://yourserver.com/collaboration');
socket.onmessage = function(event) {
    const data = JSON.parse(event.data);
    if (data.type === 'content-update') {
        // 应用其他用户的编辑
        applyRemoteEdit(data.content, data.selection);
    }
};
// 监听本地编辑事件
document.getElementById('editor').addEventListener('input', function() {
    // 广播编辑内容
    socket.send(JSON.stringify({
        type: 'content-update',
        content: this.innerHTML,
        timestamp: Date.now()
    }));
});

五、方案对比与选择指南

下表对比了三种主要方案的特性:

方案优点缺点适用场景
Blob 原生导出零依赖、简单易用样式控制有限、兼容性问题简单文本导出、快速原型
mammoth.js 转换语义化输出、良好可定制性复杂格式可能丢失、需学习曲线内容型文档、需要样式定制
docxtemplater模板驱动、企业级控制需要预设计模板、复杂度高标准化报告、合同生成

六、常见问题与解决方案

6.1 中文乱码问题

确保在 HTML 头部声明 UTF-8 编码,并在 Blob 内容前添加 BOM 头:

const blob = new Blob(['\uFEFF' + htmlContent], { type: 'application/msword;charset=utf-8' });

6.2 样式不一致问题

  • 使用 Word 标准单位(如 pt 而非 px)
  • 尽量使用内联样式确保兼容性
  • 针对 Word 专用 CSS 属性进行优化

6.3 大型文档性能优化

  • 实现分片加载和懒渲染
  • 使用 Web Worker 在后台线程处理转换任务
  • 添加加载状态指示器和进度反馈

七、总结与最佳实践

mammoth.js 配合 Blob 对象提供了一种平衡功能性与复杂性的 Word 文档在线编辑方案。它在保留基本格式的同时,提供了良好的可扩展性和定制能力。

成功实施的关键因素包括:

  1. 渐进增强:先实现核心功能,再逐步添加高级特性
  2. 用户体验:提供清晰的反馈和状态指示
  3. 兼容性测试:在不同版本 Word 中测试导出结果
  4. 性能监控:对大文档处理进行性能优化

对于需要更高级功能(如复杂格式保留、实时协作)的场景,可以考虑结合Microsoft Graph API或专业文档处理服务,构建更强大的文档管理系统。

未来发展方向包括更智能的样式映射、AI 辅助的格式优化以及与新兴 Web 标准(如 Web Assembly)的深度集成,这些都将进一步提升在线文档编辑的体验和能力边界。


完整实现代码示例

以下是一个完整的单页应用示例,整合了上传、编辑与导出功能:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Word 文档在线编辑器</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/mammoth/1.4.2/mammoth.browser.min.js"></script>
    <style>
        * { box-sizing: border-box; margin: 0; padding: 0; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
        body { background-color: #f5f7fa; color: #333; line-height: 1.6; padding: 20px; }
        .container { max-width: 1200px; margin: 0 auto; background-color: white; border-radius: 10px; box-shadow: 0 0 20px rgba(0, 0, 0, 0.1); overflow: hidden; }
        header { background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%); color: white; padding: 20px 30px; text-align: center; }
        h1 { font-size: 2.2rem; margin-bottom: 10px; }
        .subtitle { font-size: 1rem; opacity: 0.9; }
        .toolbar { display: flex; justify-content: space-between; padding: 15px 30px; background-color: #f8f9fa; border-bottom: 1px solid #eaeaea; flex-wrap: wrap; }
        .toolbar-group { display: flex; gap: 10px; margin: 5px 0; }
        .btn { padding: 10px 15px; border: none; border-radius: 5px; cursor: pointer; font-weight: 600; transition: all 0.3s ease; display: flex; align-items: center; gap: 8px; }
        .btn-primary { background-color: #4a6cf7; color: white; }
        .btn-primary:hover { background-color: #3a5ce0; transform: translateY(-2px); }
        .btn-success { background-color: #28a745; color: white; }
        .btn-success:hover { background-color: #218838; transform: translateY(-2px); }
        .format-btn { background-color: white; border: 1px solid #ddd; padding: 8px 12px; }
        .format-btn:hover { background-color: #f8f9fa; }
        .format-btn.active { background-color: #e9ecef; border-color: #6c757d; }
        .editor-container { display: flex; height: 70vh; min-height: 500px; }
        .upload-section { flex: 0 0 300px; padding: 20px; background-color: #f8f9fa; border-right: 1px solid #eaeaea; display: flex; flex-direction: column; gap: 20px; }
        .upload-area { border: 2px dashed #6a11cb; border-radius: 8px; padding: 30px 20px; text-align: center; cursor: pointer; transition: all 0.3s; background-color: rgba(106, 17, 203, 0.05); }
        .upload-area:hover { background-color: rgba(106, 17, 203, 0.1); }
        .upload-icon { font-size: 48px; color: #6a11cb; margin-bottom: 15px; }
        .file-input { display: none; }
        .editor-section { flex: 1; display: flex; flex-direction: column; }
        .editor-toolbar { padding: 10px 20px; background-color: white; border-bottom: 1px solid #eaeaea; display: flex; gap: 5px; flex-wrap: wrap; }
        #editor { flex: 1; padding: 30px; overflow-y: auto; background-color: white; line-height: 1.8; font-size: 16px; }
        #editor:focus { outline: none; }
        .status-bar { padding: 10px 30px; background-color: #f8f9fa; border-top: 1px solid #eaeaea; display: flex; justify-content: space-between; font-size: 0.9rem; color: #6c757d; }
        .message { padding: 15px; margin: 15px 30px; border-radius: 5px; display: none; }
        .message.success { background-color: #d4edda; color: #155724; border: 1px solid #c3e6cb; }
        .message.error { background-color: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; }
        .loading { display: none; text-align: center; padding: 20px; }
        .spinner { border: 4px solid rgba(0, 0, 0, 0.1); border-left-color: #6a11cb; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 0 auto 15px; }
        @keyframes spin { to { transform: rotate(360deg); } }
        @media(max-width: 768px) {
            .editor-container { flex-direction: column; height: auto; }
            .upload-section { flex: none; border-right: none; border-bottom: 1px solid #eaeaea; }
            .toolbar { flex-direction: column; gap: 10px; }
            .toolbar-group { justify-content: center; }
        }
    </style>
</head>
<body>
<div class="container">
    <header>
        <h1>Word 文档在线编辑器</h1>
        <p class="subtitle">上传、编辑并导出 Word 文档 - 基于 mammoth.js 与 Blob 对象实现</p>
    </header>
    <div class="toolbar">
        <div class="toolbar-group">
            <button class="btn btn-primary" id="uploadBtn"><i class="upload-icon">📤</i> 上传 Word 文档</button>
            <input type="file" id="fileInput" class="file-input" accept=".docx">
        </div>
        <div class="toolbar-group">
            <button class="btn btn-success" id="exportBtn"><i class="export-icon">📥</i> 导出为 Word 文档</button>
        </div>
    </div>
    <div class="message success" id="successMessage"></div>
    <div class="message error" id="errorMessage"></div>
    <div class="loading" id="loadingIndicator">
        <div class="spinner"></div>
        <p>正在处理文档,请稍候...</p>
    </div>
    <div class="editor-container">
        <div class="upload-section">
            <div class="upload-area" id="uploadArea">
                <div class="upload-icon">📄</div>
                <h3>上传 Word 文档</h3>
                <p>点击此处或使用上方上传按钮</p>
                <p>支持.docx 格式文件</p>
            </div>
            <div>
                <h3>使用说明</h3>
                <ul style="padding-left: 20px; margin-top: 10px;">
                    <li>上传.docx 格式的 Word 文档</li>
                    <li>在编辑区域直接修改内容</li>
                    <li>使用工具栏格式化文本</li>
                    <li>完成后导出为新的 Word 文档</li>
                </ul>
            </div>
        </div>
        <div class="editor-section">
            <div class="editor-toolbar">
                <button class="format-btn" data-command="bold" title="加粗">B</button>
                <button class="format-btn" data-command="italic" title="斜体">I</button>
                <button class="format-btn" data-command="underline" title="下划线">U</button>
                <div style="width: 1px; background-color: #ddd; margin: 0 10px;"></div>
                <button class="format-btn" data-command="formatBlock" data-value="h1" title="标题 1">H1</button>
                <button class="format-btn" data-command="formatBlock" data-value="h2" title="标题 2">H2</button>
                <button class="format-btn" data-command="formatBlock" data-value="p" title="段落">P</button>
                <div style="width: 1px; background-color: #ddd; margin: 0 10px;"></div>
                <button class="format-btn" data-command="insertUnorderedList" title="无序列表">●</button>
                <button class="format-btn" data-command="insertOrderedList" title="有序列表">1.</button>
                <div style="width: 1px; background-color: #ddd; margin: 0 10px;"></div>
                <button class="format-btn" data-command="justifyLeft" title="左对齐">↶</button>
                <button class="format-btn" data-command="justifyCenter" title="居中对齐">↹</button>
                <button class="format-btn" data-command="justifyRight" title="右对齐">↷</button>
            </div>
            <div id="editor" contenteditable="true" style="border: 1px solid #ccc; min-height: 500px; padding: 20px;">
                <p>请上传 Word 文档开始编辑,或直接在此处输入内容...</p>
            </div>
        </div>
    </div>
    <div class="status-bar">
        <div id="charCount">字符数:0</div>
        <div id="docInfo">文档状态:未加载</div>
    </div>
</div>
<script>
// DOM 元素引用
const fileInput = document.getElementById('fileInput');
const uploadBtn = document.getElementById('uploadBtn');
const uploadArea = document.getElementById('uploadArea');
const exportBtn = document.getElementById('exportBtn');
const editor = document.getElementById('editor');
const successMessage = document.getElementById('successMessage');
const errorMessage = document.getElementById('errorMessage');
const loadingIndicator = document.getElementById('loadingIndicator');
const charCount = document.getElementById('charCount');
const docInfo = document.getElementById('docInfo');

// 上传按钮点击事件
uploadBtn.addEventListener('click', () => fileInput.click());
uploadArea.addEventListener('click', () => fileInput.click());

// 文件选择变化事件
fileInput.addEventListener('change', function(event) {
    const file = event.target.files[0];
    if (!file) return;
    // 检查文件类型
    if (!file.name.endsWith('.docx')) {
        showMessage('请选择.docx 格式的 Word 文档', 'error');
        return;
    }
    // 显示加载指示器
    showLoading(true);
    // 使用 FileReader 读取文件
    const reader = new FileReader();
    reader.onload = function(e) {
        const arrayBuffer = e.target.result;
        // 使用 mammoth.js 转换 Word 文档为 HTML
        mammoth.convertToHtml({arrayBuffer: arrayBuffer}).then(function(result) {
            // 将转换后的 HTML 插入编辑器
            editor.innerHTML = result.value;
            // 更新文档信息
            updateDocInfo(file.name, result.value);
            // 显示成功消息
            showMessage(`文档"${file.name}"加载成功!`, 'success');
            // 隐藏加载指示器
            showLoading(false);
        }).catch(function(error) {
            console.error('转换出错:', error);
            showMessage('文档转换失败:' + error.message, 'error');
            showLoading(false);
        });
    };
    reader.onerror = function() {
        showMessage('文件读取失败', 'error');
        showLoading(false);
    };
    reader.readAsArrayBuffer(file);
});

// 导出按钮点击事件
exportBtn.addEventListener('click', function() {
    // 获取编辑后的 HTML 内容
    const editedContent = editor.innerHTML;
    if (!editedContent || editedContent.trim() === '') {
        showMessage('编辑器内容为空,无法导出', 'error');
        return;
    }
    // 显示加载指示器
    showLoading(true);
    // 创建完整的 HTML 文档结构
    const fullHtml = `
        <!DOCTYPE html>
        <html>
        <head>
            <meta charset="UTF-8">
            <title>编辑后的文档</title>
            <style>
                body { font-family: 'Times New Roman', serif; line-height: 1.5; margin: 1in; }
                h1, h2, h3 { margin-top: 0.5em; margin-bottom: 0.25em; }
                p { margin-bottom: 0.5em; text-align: justify; }
                table { border-collapse: collapse; width: 100%; }
                table, th, td { border: 1px solid black; }
                th, td { padding: 8px; text-align: left; }
            </style>
        </head>
        <body>
            ${editedContent}
        </body>
        </html>`;
    // 创建 Blob 对象
    const blob = new Blob([fullHtml], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
    // 创建下载链接
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = 'edited-document.docx';
    document.body.appendChild(a);
    a.click();
    // 清理
    setTimeout(() => {
        document.body.removeChild(a);
        URL.revokeObjectURL(url);
        showLoading(false);
        showMessage('文档导出成功!', 'success');
    }, 100);
});

// 编辑器内容变化时更新字符计数
editor.addEventListener('input', updateCharCount);

// 格式化按钮事件处理
document.querySelectorAll('.format-btn').forEach(button => {
    button.addEventListener('click', function() {
        const command = this.dataset.command;
        const value = this.dataset.value;
        // 切换活动状态
        if (command === 'bold' || command === 'italic' || command === 'underline') {
            this.classList.toggle('active');
        }
        // 执行命令
        document.execCommand(command, false, value);
        editor.focus();
    });
});

// 显示消息函数
function showMessage(text, type) {
    const messageElement = type === 'success' ? successMessage : errorMessage;
    messageElement.textContent = text;
    messageElement.style.display = 'block';
    // 3 秒后自动隐藏消息
    setTimeout(() => {
        messageElement.style.display = 'none';
    }, 3000);
}

// 显示/隐藏加载指示器
function showLoading(show) {
    loadingIndicator.style.display = show ? 'block' : 'none';
}

// 更新字符计数
function updateCharCount() {
    const text = editor.innerText || '';
    charCount.textContent = `字符数:${text.length}`;
}

// 更新文档信息
function updateDocInfo(filename, content) {
    const text = content.replace(/<[^>]*>/g, '');
    docInfo.textContent = `文档:${filename} | 字符数:${text.length}`;
}

// 初始化字符计数
updateCharCount();
</script>
</body>
</html>

目录

  1. 前端实现 Word 文档在线编辑与导出
  2. 一、为什么选择 mammoth.js 与 Blob 方案?
  3. 二、实现原理与技术架构
  4. 2.1 mammoth.js 的转换原理
  5. 2.2 Blob 对象的作用
  6. 三、完整实现步骤
  7. 3.1 基础环境搭建
  8. 3.2 文档上传与转换
  9. 3.3 内容编辑与导出
  10. 四、高级功能与优化
  11. 4.1 样式映射定制
  12. 4.2 图片处理策略
  13. 4.3 实时协作支持(进阶)
  14. 五、方案对比与选择指南
  15. 六、常见问题与解决方案
  16. 6.1 中文乱码问题
  17. 6.2 样式不一致问题
  18. 6.3 大型文档性能优化
  19. 七、总结与最佳实践
  20. 完整实现代码示例
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 纯 Java 手写 TopoJSON 生成器零依赖实战
  • C++ 指针基础与内存管理总结
  • 医疗 AI 可信系统构建:向量索引与贝叶斯网络实现
  • MCP 工具实战:npx 与 uvx 跨平台安装指南
  • 大数据架构存储设计:HDFS、S3、HBase 选型指南
  • AI 大模型核心概念、架构与发展梳理
  • OpenClaw 飞书机器人权限配置与安全指南
  • 金融风控文本分析:基于 Llama-Factory 训练反欺诈模型
  • MISRA C++ 静态分析集成 CI/CD 项目实践
  • Redis 主从复制原理详解:配置、同步与故障处理
  • MySQL 环境配置实战:CentOS 7 与 Ubuntu 双系统安装指南
  • C++ 哈希表基础介绍与原理实现
  • Flutter wasm_ffi 在鸿蒙端的 WebAssembly 集成与适配实战
  • 快速排序深度解析与实战优化
  • C++ 类与对象:深入解析默认成员函数
  • 服务端高并发分布式架构演进之路
  • Java 面试题及答案精选
  • JDK 17 安装与环境配置实战指南
  • AI Agent 中的 Skills 是什么?有什么用?
  • 链表经典算法实战:相交节点查找与回文结构判断

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online