从Go工具到Vite插件:参考esbuild案例打造前端自动化部署神器

在前端工程化的现在,自动化的构建与部署直接决定了开发效率,常规生产环境有CI/CD流水线,而测试环境使用CI/CD流水线存在一下问题

  1. 因为CI/CD是服务端构建,而服务器的cpu能力相对较弱,打包速度也相对较慢。
  2. 因为测试环境存在频繁的bug发现、代码修改部署上传再到发现,短时间内可能存在高频次代码提交。

因此以上两点问题照旧在测试阶段存在效率问题

因此我使用go开发了一个自动压缩上传的程序

整体思路

程序整体思路并不难,就是使用go对打包后的产物进行代码压缩,然后以sftp上传至服务器,而这只需要在vite构建后自动执行既可,或者webpack构建完成后。

而js与go的交互只需通过node调用spawnapi启动go的进程既可,二者进程互相独立。

开发过程问题详细解

问题一:ESM与CommonJS

在package.json上这俩个个模式只是一行配置

json 复制代码
    {
     "type": "module",//commonjs
    }

默认不填写为commonjs

  1. 二者语法
js 复制代码
//commonjs
const os = require('os')
//esm
import os from 'os'
  1. comonjs 为动态执行,esm为静态执行
  2. Tree‑Shaking优化,由于esm为静态执行,可以支持,但commonjs不支持
  3. commonjs是值拷贝,如果导出是对象,那么a模块修改后b模块并不会动,esm相反

问题二:require.resolve

在将我开发的功能转为npm插件中,阅读esbuild源码当中发现大量使用require.resolve。 常规cjs当中使用require('xx')导入node_modules里面的包 而require.resolve就是解析该包的路径

js 复制代码
console.log(require.resolve('axios)) /xxx/xxx/项目名/node_modules/axios/xxx

后面的会为package.json里面配置的main 这是这个包的入口文件。 在esm当中也有推荐使用 createRequire

js 复制代码
import { createRequire } from "module";
const require = createRequire(import.meta.url);

问题三:关于package当中各种dependencies

在package当中dependencies有很多种,以esbuild当中的dependencies看

json 复制代码
 {
  "optionalDependencies": {
    "@esbuild/aix-ppc64": "0.28.0",
    ...xx
  },
 }

这个optionalDependencies是可安装依赖。

当执行npm i的时候,你下载的依赖内存会有一个package记录他这个包所需要的依赖这个是走dependencies与devDependencies,当报错的时候npm i就会失败。

而optionalDependencies下载失败是不会停止,这就为esbuild配置实现了自动根据用户操作系统与cpu架构自行从npm仓库拉去自己想要的esbuild程序

而go开发的原生二进制程序只需要在package上写入os与cpu俩个属性就能让npm匹配当前用户的操作系统与cpu架构是否符合

json 复制代码
"os": [
    "linux"
  ],
  "cpu": [
    "arm"
  ]
  //限制为linux的arm架构可以安装成功

问题四:关于下载失败的保底机制

在esbuild当中,存在一个如果你npm i执行后esbuild的二进制包没有下载失败的保底程序,就从新下载

js 复制代码
async function checkAndPreparePackage() {

  const { pkg, subpath, isWASM } = pkgAndSubpathForCurrentPlatform(); //获取你电脑的操作系统与架构
  let binPath;
  try {
    binPath = require.resolve(`${pkg}/${subpath}`); 
    //如果npm i下载成功后,node_modules里这一段代码就会解析成功不会报错
  } catch (e) {
  
    binPath = downloadedBinPath(pkg, subpath); 
    //解析失败,准备下载二进制文件,这是获取需要放入的文件地址
    try {
      installUsingNPM(pkg, subpath, binPath);
    } catch (e2) {
      
      try {
        await downloadDirectlyFromNPM(pkg, subpath, binPath); //下载
      } catch (e3) {
        throw new Error(`Failed to install package "${pkg}"`);
      }
    }
  }
}
//检查
checkAndPreparePackage().then(() => {
  if (isToPathJS) {
    validateBinaryVersion(process.execPath, toPath);
  } else {
    validateBinaryVersion(toPath);
  }
});

而想让这个代码在npm i后执行只需要在package.json当中配置

json 复制代码
 "scripts": {
    "postinstall": "node install.js"
  },

以上就是个人目前总结的东西!

也欢迎使用本人用go开发的sftp压缩上传的vite插件

www.npmjs.com/package/vit...

目前没有像esbuild那样存在如果在npm i下载失败的保底机制,正在深入研究

相关推荐
Highcharts.js4 小时前
软件开发公司为什么选择 Highcharts?
前端·前端框架·echarts·数据可视化·技术选型·highcharts·图表工具
snow@li8 小时前
Node.js:在前端项目中的全景应用指南 / 为什么前端需要它 / 本地开发 vs 生产环境
前端·node.js
Charonmomo9 小时前
react/antd - 不能正确打开标签页问题记录
前端·react.js·前端框架
gis开发之家9 小时前
vue3直击架构痛点 依赖倒置与接口隔离——打造坚如磐石的插件与高阶组件(HOC)模式
javascript·架构·typescript·前端框架·vue3
大尚来也12 小时前
React Hooks全解析:告别繁琐Class组件
前端·react.js·前端框架
用户67570498850213 小时前
别再乱用了!var arr []int 和 arr := []int{} 给整懵了?不就声明个空数组,项目居然崩了?
后端·go
海上彼尚13 小时前
Nodejs也能写Agent - 17.LangGraph篇 - Checkpointer 与 Memory
前端·javascript·人工智能·langchain·node.js
LaughingZhu14 小时前
Product Hunt 每日热榜 | 2026-07-15
前端·人工智能·神经网络·react.js·搜索引擎·前端框架
小堂子这厢有礼了16 小时前
Chet.Admin 权限模型:菜单级 + 按钮级 + 行级三层防护
前端·后端·信息可视化·前端框架·.net
特立独行的猫a17 小时前
HarmonyOS鸿蒙PC三方库移植:Node.js 三方库鸿蒙 PC 移植指南
华为·node.js·node·harmonyos·三方库移植·鸿蒙pc