首页 > 其他分享 >解决 Jenkins 环境下 Lingui 构建报错 "btoa is not defined"

解决 Jenkins 环境下 Lingui 构建报错 "btoa is not defined"

时间:2025-01-21 11:55:09浏览次数:1  
标签:Node defined polyfill Lingui btoa js 构建 报错 环境

问题描述

在 Jenkins CI 环境中构建 React 项目时,遇到了以下错误:

Error: btoa is not defined
  11 | };
  12 | const QkImagePreview = (props: QkImagePreviewType) => {
> 13 |   const { i18n, t } = useLingui();
     |                       ^^^^^^^^^^^
  14 |   const [visible, setVisible] = useState(false);

这个错误发生在使用 @lingui/macro 进行国际化构建时。有趣的是,这个错误只在 Jenkins 环境中出现,在本地 Windows 环境中构建是正常的。

原因分析

  • btoa 函数是浏览器原生提供的 API,用于将二进制字符串转换为 Base64 编码
  • 在 Node.js 环境中,btoa 函数默认是不存在的
  • Lingui 在构建过程中需要使用 btoa 来生成消息 ID
  • Jenkins 使用 Node.js 环境进行构建,所以缺少这个函数

解决方案

1. 创建 Polyfill 文件

创建 src/utils/btoa-polyfill.ts:

// btoa polyfill for Node.js
if (typeof btoa === 'undefined') {
  global.btoa = function (str: string) {
    return Buffer.from(str, 'binary').toString('base64');
  };
}

export {};

2. 在 Vite 配置中引入 Polyfill

修改 vite.config.ts:

import { defineConfig, loadEnv } from 'vite';
// ... 其他导入
import './src/utils/btoa-polyfill';

export default defineConfig(({ mode }) => {
  // ... 配置内容
});

技术要点

  • 这是一个典型的环境差异导致的问题 - 浏览器环境 vs Node.js 环境
  • Polyfill 的实现利用了 Node.js 的 Buffer API 来模拟浏览器的 btoa 功能
  • 在 Vite 配置文件中导入 polyfill 确保它在构建过程的早期被加载

注意事项

1. 这个 polyfill 只在构建时需要,不会影响到生产环境的代码

2. 该解决方案适用于所有使用 Lingui + Vite 的项目在 Node.js 环境下的构建

3. 如果使用其他构建工具(如 webpack),可能需要调整 polyfill 的引入方式

相关依赖版本

{
  "@lingui/core": "^5.1.0",
  "@lingui/macro": "^5.1.0",
  "@lingui/react": "^5.1.0",
  "vite": "^4.3.9"
}

  

标签:Node,defined,polyfill,Lingui,btoa,js,构建,报错,环境
From: https://www.cnblogs.com/yz-blog/p/18683370

相关文章

  • 2025.1.20——一、[RCTF2015]EasySQL1 二次注入|报错注入|代码审计
    题目来源:buuctf [RCTF2015]EasySQL1目录一、打开靶机,整理信息二、解题思路step1:初步思路为二次注入,在页面进行操作step2:尝试二次注入step3:已知双引号类型的字符型注入,构造payloadstep4:报错注入step5:三爆方法①extractvalue()函数方法②updatexml()函数三、小......
  • InfluxDB:单节点与集群部署实操及 java.lang.RuntimeException 报错的高效解决方案
    前言:在当今数据驱动的时代,时序数据的管理和分析变得愈发重要。InfluxDB作为一款高性能、开源的时序数据库,凭借其强大的写入性能、灵活的查询功能以及对大规模数据的高效处理能力,成为了众多开发者的首选工具。无论是用于监控系统、物联网设备数据存储,还是日志分析,InfluxDB......
  • 微擎程序安装后报错缺少ixed.5.6.win
    您好,针对您提到的微擎程序安装后报错缺少ixed.5.6.win的问题,我们进行了详细的分析。这个错误通常意味着您的PHP环境中缺少SourceGuardian解密器,而微擎程序依赖于该解密器来运行加密后的代码。为了解决这个问题,建议您按照以下步骤进行操作:下载并安装SourceGuardian解密器:首先,您......
  • 服务器所有网站报错502,如何排查和修复?
    针对您遇到的服务器所有网站均报错502的问题,这是一个比较常见的错误代码,表示网关超时,即代理服务器未能及时从上游服务器收到响应。这种情况可能由多种原因引起,下面我们将详细介绍如何排查和修复这个问题。检查Web服务器状态:首先,登录到服务器控制面板(如宝塔面板),查看Web服务器(如N......
  • oracle使用case when报错ORA-12704字符集不匹配原因分析及解决方法
    问题概述使用oracle的casewhen函数时,报错提示ORA-12704字符集不匹配,如下图,接下来分析报错原因并提出解决方法。样例演示现在有一个TESTTABLE表,本表包含的字段如下图所示,COL01字段是NVARCHAR2类型,COL02字段是VARCHAR2类型。场景一使用case简单函数,case后面的内容和when......
  • 为什么网站后台连接不了并报错?
    当您发现网站后台无法连接并报错时,可能是由多种原因引起的。为了有效解决问题,我们需要从多个角度进行排查和优化。以下是详细的解决方案:一、检查数据库连接数据库配置:确认数据库配置文件(如config.php)中的连接参数是否正确。包括数据库主机名、端口、用户名、密码和数据库名......
  • keil报错的可能原因与解决办法
    1.未插入头文件上述警告的原因是未在文件夹中插入包含这个函数的头文件2.进行初始化后蜂鸣器还是会响在主函数中加入死循环,保证不会退出主函数voidmain(void){ Cls_Peripheral(); Led_Disp(0x0f); while(1) { }}3.注释为问号或乱码点击edit,将Encoding改为如......
  • 打包前端项目时报错:Task function must be specified
    注意:以下示例是你前端环境安装好的情况下排查的问题,前端环境没安装好请自行安装好报错示例:输入命令: gulp-v查看全局gulp和本地项目的gulp版本  这里可以看出这两个版本不一致,这时我们需要在项目里去修改一下对应的版本,改成3.0.0(这里根据自己的需求更改就好)重新运行......
  • 如何解决数据库导出报错的问题?
    遇到数据库导出报错的问题,可能是由于多种原因引起的,包括PHP配置限制、数据库大小、权限问题等。为了确保数据库导出顺利完成,您可以按照以下步骤进行排查和优化:检查PHP配置:确认PHP的配置文件(php.ini)中,关于内存限制和执行时间的设置是否合理。特别是memory_limit、max_executio......
  • 页面链接超时502报错
    您好,当您遇到页面链接超时并返回502错误时,这通常意味着客户端与服务器之间的通信出现了问题。502错误表示网关超时,即代理服务器从上游服务器接收无效响应。以下是几种常见原因及其解决方案:应用程序执行超时:某些脚本或应用程序可能因为处理时间过长而触发了超时机制。检查相关......