gulp应该怎么用,前端批量自动化替换文件
背景
最近公司准备把所有项目中用到的国际化相关的key规范化,原因是:
- 一直以来公司的app和web端 在针对相同的需求以及相同的国际化语言,需要设置不同的两份国际化文件,难以维护
- 旧版的国际化文件中,存在的大量值重复,但是key不相同的地方,如:以“取消”值为例
- ‘取消’ — ‘cancel’ ---- ‘xxx_cancel’
- 三个key,都是用来表示 “取消”
- 更新一次国际化语言的方式,奇葩至极,每次都需要同步最近一次的国际化,然后整合;
- 之前的国际化key,不规范,五花八门的写法,中文、数字、英文都有,这次也需要一并优化。
目的
- app和web端针对相同的设计,使用同一份国际化配置;
- 优化国际化的更新
难点
公司目前除了app端外,web端的服务一共有7个项目设计到了需要更改国际化,所以
需要把每个项目中旧的国际化key替换为新版本国际化的key
怎么样快速并且不漏掉旧key的替换呢?
分析
- 代码中特定的关键字;
- 已有一份xlsx文档,上面记录了新旧key的记录;
这个时候,脑海中已经浮现出来自动化的批量处理,好在之前有过类似的经历,使用gulp处理过主题相关的自动化任务,不是重点就不提了。
所以这里也打算使用gulp来实现自动化任务,来实现一个名叫search-replace的任务:完成在前端项目中批量并且精准匹配一定特性的关键词,然后替换成想要的值
- 需要注意
- 自动化工具始终是辅助的,最终还是我们要手动确认一下每个文件中替换的位置 为什么呢
- 不同人在处理国际化上,有自己独特的使用方式
- 导致项目中国际化的写法五花八门,我们没办法精准匹配
gulp
本次的主角,官网

具体实现
- 项目中安装需要的依赖,由于该自动化任务,只用于开发中的依赖,安装记得使用
--save-dev || -D
npm i -D gulp gulp-replace xlsx
- 准备好需要处理的xlsx文件,本次博主按照如下的xlsx格式讲述此案例的
| oldkey | newkey |
|---|---|
| 取消 | key_main_cancel |
| 确定 | key_main_confirm |
- 在根目录中创建
gulpfile.js文件
const gulp = require("gulp");
const replace = require("gulp-replace");
const filelist = require("gulp-filelist");
const XLSX = require("xlsx");/*** 获取关键词映射*/
const getKeywordMap = () => {const workbook = XLSX.readFile("./key.xlsx");const sheetName = workbook.SheetNames[0];const sheet = workbook.Sheets[sheetName];const jsonData = XLSX.utils.sheet_to_json(sheet);const oldKey = "oldkey";const newKey = "newkey";let result = {};jsonData.forEach(item => {if (!item[oldKey] || !item[newKey]) {return;}result[item[oldKey]] = item[newKey]});return result;
};/*** 全局检索,替换关键词*/
gulp.task("search-replace", () => {const keyMap = getKeywordMap();// 检索 可能出现国际化key的文件类型,这里博主的只有js jsx 大家酌情return gulp.src(["./src/**/*.js", "./src/**/*.jsx"]).pipe(// 正则匹配,前后加上单或者双引号,防止误匹配// 这里最好是加上引号,将错误识辨降低到最低replace(new RegExp(`(["'])(${Object.keys(keyMap).join("|")})\\1`, "g"),function (match) {// match 去掉单双引号match = match.replace(/^['"]|['"]$/g, "");return `"${keyMap[match]}"`;})).pipe(gulp.dest("./src")) // 将替换后的文件输出到原始文件夹.on("end", function () {// 完成});
});gulp.task("replace-key", gulp.series("search-replace"));
- 执行命令
gulp replace-key,请放到package.json的scripts中,毕竟我们没有全局安装gulp。 - 检查每个被替换的文件,搂一眼没什么问题就可以了

博主执行完自动化脚本,一共更改了191个文件,随便打开一个文件,我们可以通过编辑器的git插件可以看到

其实更改的地方不是很多,我们check起来没那么慢,比起一个个改好多啦。
写在最后
显然大家可以看到,实现起来没有想象中那么麻烦,不过呢,要想到这种解决方案,首先我们自己需要充实我们的项目经历和经验,多去发现不同的解决方案。
这样,当遇到棘手的问题,总有一种方案是契合现在的问题的。
好啦,废话就说这么多,如果有帮助到大家,记得给博主点个小赞赞,抱拳感谢!!!
相关文章:
gulp应该怎么用,前端批量自动化替换文件
背景 最近公司准备把所有项目中用到的国际化相关的key规范化,原因是: 一直以来公司的app和web端 在针对相同的需求以及相同的国际化语言,需要设置不同的两份国际化文件,难以维护旧版的国际化文件中,存在的大量值重复,…...
石岩湿地公园的停车场收费情况
周末石岩湿地公园停车场【967个】小车停车费封顶14元价格还行,我还记得2020年的时候湿地公园还是10元一天封顶。现在的收费情况也是可以的,尤其是周末停车比工作日停车便宜还是很得民心的哈。 车型 收费标准 小车 工作日 高峰时间8:00~20:00 首小时…...
A7157 基于Java+SSM+mysql+jsp的医院挂号系统的设计与实现 源码 文档 配置 全套资料
医院挂号系统 1.项目描述2. 绪论3.项目功能4.界面展示5.源码获取 1.项目描述 摘 要 随着计算机和网络技术的飞速发展,医院管理与互联网的结合也越来越紧密,享受便捷的医疗服务也变成了人民群众关注的重点。通过对医院就诊挂号情况的调查分析,…...
数据处理与统计分析——11-Pandas-Seaborn可视化
Seaborn 简介 Seaborn 是一个基于 Matplotlib 的图形可视化 Python 库,提供了高度交互式的接口,使用户能够轻松绘制各种吸引人的统计图表。Seaborn 可以直接使用 Pandas 的 DataFrame 和 Series 数据进行绘图。 1. Seaborn 绘制单变量图 (1) 直方图 h…...
【计算机网络】实验13:运输层端口
实验13 运输层端口 一、实验目的 本次实验旨在验证TCP和IP运输层端口号的作用,深入理解它们在网络通信中的重要性。通过实验,我将探讨端口号如何帮助区分不同的应用程序和服务,使得在同一台主机上能够同时运行多个网络服务而不发生冲突。此…...
STL之适配器(adapters)_下
STL之适配器adapters container adapersstackqueue iterator adaptgersinsert iteratorsreverse iteratorsstream iterators function adapters对返回值进行逻辑判断:not1,not2对参数进行绑定:bind1st, bind2nd用于函数合成:compose1,compose2用于函数指针 ptr_func…...
基于51单片机64位病床呼叫系统设计( proteus仿真+程序+设计报告+原理图+讲解视频)
基于51单片机病床呼叫系统设计( proteus仿真程序设计报告原理图讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0095 1. 主要功能: 基于51单片机的病床呼叫系统proteus仿…...
安装 Zookeeper 和 Kafka
注意:需要java环境 [roothcss-ecs-2a6a ~]# java -version java version "17.0.12" 2024-07-16 LTS Java(TM) SE Runtime Environment (build 17.0.128-LTS-286) Java HotSpot(TM) 64-Bit Server VM (build 17.0.128-LTS-286, mixed mode, sharing) [roo…...
操作系统输入输出系统知识点
I/O系统的功能、模型和接口 I/O系统的基本功能 隐藏物理设备的细节与设备的无关性提高处理机和I/O设备的利用率对1/0 设备进行控制确保对设备的正确共享 独占设备,进程应互斥地访问这些设备共享设备,在一段时间内允许多个进程同时访问的设备 错误处理 I…...
C语言控制语句与案例
控制语句与案例 1. 选择结构 1.1 if 语句 if 语句用于根据条件执行不同的代码块。最基本的语法形式如下: // 单分支 if (条件) {// 条件为真时执行的代码 }// 双分支 if (条件) {// 条件为真时执行的代码 } else {// 条件为假时执行的代码 }// 多分支 if (条件1…...
JVM的内存布局
Java虚拟机(JVM)的内存布局可以分为几个主要部分,每个部分都有特定的用途。以下是JVM内存布局的基本组成: 方法区(Method Area): 方法区是所有线程共享的内存区域,用于存储已被虚拟机…...
aws codepipeline + github + sonarqube + jenkins实践CI/CD
https://blog.csdn.net/u011564831/article/details/144007981文章浏览阅读1.2k次,点赞31次,收藏21次。本文使用 Jenkins 结合 CodeBuild, CodeDeploy 实现 Serverless 的 CI/CD 工作流,用于自动化发布已经部署 lambda 函数。在 AWS 海外区&a…...
mistralai 部署笔记
目录 mistralai 部署笔记 mistralai 部署笔记 #! /usr/bin/env python3 import os import sys import torch os.chdir(os.path.dirname(os.path.abspath(__file__)))current_dir = os.path.dirname(os.path.abspath(__file__))paths = [os.path.abspath(__file__).split(scri…...
Java——异常机制(上)
1 异常机制本质 (异常在Java里面是对象) (抛出异常:执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE) 工作中,程序遇到的情况不可能完美。比如…...
坐标系,向量_batch及向量点乘部分知识
坐标系 Unity所采用的是左手坐标系。 对于Vector3.forward ,其坐标值为(0,0,1),为定值 而transform.forward 该值不固定,本地坐标正方向所在世界坐标系中的方向 向量 向量是终点位置减去起始点位置得…...
【计算机网络】期末速成(2)
部分内容来源于网络,侵删~ 第五章 传输层 概述 传输层提供进程和进程之间的逻辑通信,靠**套接字Socket(主机IP地址,端口号)**找到应用进程。 传输层会对收到的报文进行差错检测。 比特流(物理层)-> 数据帧(数据链路层) -> 分组 / I…...
【设计模式】结构型设计模式总结之代理模式、装饰模式、外观模式、享元模式
文章目录 代理模式示例结构分类动态代理 装饰模式示例结构使用场景与代理模式区别Context 外观模式结构示例使用场景Context 享元模式结构示例使用场景Message 代理模式 代理模式(Proxy Pattern) 是一种结构型设计模式,它提供了一个代理对象…...
11进阶篇:专业课论文阅读方向指南(2025版)
文章目录 第一个检索式:图情档核心期刊(北大 + CSSCI)发文情况研究方法类关键词研究主题类关键词论文阅读建议第二个检索式:川大公共管理学院在核心期刊(北大 + CSSCI)的发文情况研究方法类关键词研究主题类关键词特点关键词与2024年972(现815)两道题目的映射情况815信…...
watch里可以写异步吗
在Vue的 watch 中可以写异步,但通常不推荐。 原因 - 可维护性差: watch 的主要用途是响应式地监听数据变化。如果在里面写复杂的异步操作,会让代码逻辑变得难以理解和维护。例如,同时监听多个数据变化并触发不同异步操作时&am…...
基于 Spring Boot + Vue 的宠物领养系统设计与实现
引言 近年来,随着人们生活水平的提高,宠物逐渐成为许多家庭的重要成员。然而,宠物的流浪和弃养问题日益严重,这促使社会对宠物领养的需求不断增长。为解决宠物领养中信息不对称、领养流程复杂等问题,设计并实现一个基…...
从固定到自适应:手把手教你改进Savitzky-Golay滤波器,告别边界效应和参数调优烦恼
从固定到自适应:手把手教你改进Savitzky-Golay滤波器,告别边界效应和参数调优烦恼 信号处理领域的从业者常常面临一个两难选择:如何在去除噪声的同时,尽可能保留信号的关键特征?传统Savitzky-Golay滤波器虽然在一定程度…...
AI大语言模型其实就是一个归纳与演绎的概率机器
您这句话精准地概括了当前主流人工智能(尤其是大语言模型)的核心本质。它确实是一个基于海量数据,通过统计归纳来学习模式,并通过概率演绎来生成输出的机器。 但这一定义既是其强大能力的根源,也是其根本局限的边界。我们可以从三个层面来理解: 一、这句话为什么是精准…...
Wan2.2-I2V-A14B镜像应用案例:快速生成高质量短视频,助力内容创作
Wan2.2-I2V-A14B镜像应用案例:快速生成高质量短视频,助力内容创作 1. 引言:短视频创作的新范式 在数字内容爆炸式增长的今天,短视频已成为最主流的内容形式之一。无论是电商平台的商品展示、社交媒体上的创意内容,还…...
别再乱用Adam了!PyTorch中AdamW优化器的正确打开方式(附代码示例)
别再乱用Adam了!PyTorch中AdamW优化器的正确打开方式(附代码示例) 当你盯着训练曲线发呆,发现验证集表现始终不如预期时,或许该检查一下优化器的选择了。很多开发者习惯性地在PyTorch脚本里写下optim.Adam(model.para…...
别再只用欧氏距离了!用Python+NumPy实战马氏距离异常检测(附卡方分布阈值设定)
用Python实战马氏距离异常检测:从理论到工业级实现 在数据分析领域,距离度量是许多算法的基石。当数据维度升高且特征间存在相关性时,传统的欧氏距离就像用一把没有刻度的尺子测量复杂空间——它无法捕捉变量间的相互作用。想象一下金融交易监…...
别再只会用Burpsuite了!手把手教你用Python脚本+Crunch字典搞定DVWA暴力破解
从零构建Python自动化爆破工具:DVWA全等级攻防实战解析 在渗透测试领域,暴力破解(Brute Force)始终是验证系统弱口令防御的基础手段。虽然Burpsuite这类图形化工具降低了入门门槛,但真正理解底层通信原理并构建自定义攻击脚本,才是…...
cv_unet_image-colorization稳定性验证:连续72小时高负载运行无内存泄漏
cv_unet_image-colorization稳定性验证:连续72小时高负载运行无内存泄漏 1. 项目简介与测试背景 在AI工具的实际应用中,稳定性与可靠性往往比惊艳的演示效果更为重要。一个工具能否在长时间、高负载的场景下稳定运行,直接决定了它能否从“玩…...
百度网盘提取码智能获取工具:3秒解锁任何分享资源的终极方案
百度网盘提取码智能获取工具:3秒解锁任何分享资源的终极方案 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾遇到过这样的场景?好不容易找到一个急需的学习资源,点击百度网盘链接后…...
3步解决华硕笔记本显示异常:G-Helper色彩配置修复指南
3步解决华硕笔记本显示异常:G-Helper色彩配置修复指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址…...
OpenClaw性能优化:降低Qwen3-VL:30B多模态任务的Token消耗
OpenClaw性能优化:降低Qwen3-VL:30B多模态任务的Token消耗 1. 问题背景:多模态任务的高Token消耗困境 上周我在飞书群里测试OpenClaw对接Qwen3-VL:30B模型时,遇到了一个典型问题:当同事上传一张产品设计图要求分析时,…...
