NPM 自动更新版本号

本文首发于 YFun's Blog

前言

ChenYFan 大佬的文章:SpeedUp!使用黑科技为你的网站提速 有提到过将 Hexo 博客的全部静态文件上传至 NPM 达到加速效果。

但是 NPM 版本号不能重复,而且为了精准命中缓存和防止边缘 @latest 缓存过长,就必须指定版本号。

本人在 我的图床解决方案 一文中使用的方法是 npm version patch

image.png

但这个方法也有一些弊端,比如 patch 只会更新 z 位数的版本号,而且并不会上传至仓库,很可能会出现版本号冲突导致上传失败。这就是为什么最后还需要重新推送 Git 提交。

试试看

NPM 版本号遵循 semver 规范,格式为 major.minor.patch

为了在获取最新版本号的时候不发生混乱,我选择先获取最新的版本号。

记得把 cky-blog-static 改成自己的项目名。
const getVersion = async() => {
    const latestVersion = await fetch("https://registry.npmjs.org/cky-blog-static/latest").then(res => res.json()).then(res => {
        return res.version;
    })
    return latestVersion;
}

获取到最新版本号后,就可以对版本号进行分析。

1.4.7-b541af2ea284a39da0bbf63b88fdb65c 为例,先按 major.minor.patch 分离。当然,也需要考虑版本号后还有 build metadata 的情况。

const version = await getVersion();
var verArray = version.split(".");
verArray[2] = verArray[2].split("-")[0];

为了版本号好看些,可以通过判断实现满十进一。

if (verArray[2] < 9) {
    // z 位小于 9,直接 +1
    verArray[2] = String(Number(verArray[2])+1);
} else if (verArray[1] < 9) {
    // z 位大于等于 9,y 位小于 9,y+1, z=0
    verArray[1] = String(Number(verArray[1])+1);
    verArray[2] = 0;
} else {
    // z 大于等于 9,y 大于等于 9,x+1,y=0,z=0
    verArray[0] = String(Number(verArray[0])+1);
    verArray[1] = 0;
    verArray[2] = 0;
}

最后,重新拼接版本号。如果担心服务器缓存版本号导致冲突,还可以加上一些随机字符串。

var newVersion = `${verArray[0]}.${verArray[1]}.${verArray[2]}`
var newVersion = newVersion + "-" + md5(`${new Date().getTime()}${newVersion}`);

将最新的版本号信息重新写入 package.json 文件:

var packageJson = fs.readFileSync("./package.json");
var packageJson = JSON.parse(packageJson);
packageJson.version = newVersion;
var newPackage = JSON.stringify(packageJson);
fs.writeFileSync("./package.json", newPackage);

代码

直接 CV 代码!

/**
 * 更新 package.json 版本号
 */
const fetch = require("node-fetch");
const md5 = require("js-md5");
const fs = require("fs");

const getVersion = async() => {
    const latestVersion = await fetch("https://registry.npmjs.org/cky-blog-static/latest").then(res => res.json()).then(res => {
        return res.version;
    })
    return latestVersion;
}

const update = async() => {
    const version = await getVersion();
    var verArray = version.split(".");
    verArray[2] = verArray[2].split("-")[0];
    if (verArray[2] < 9) {
        verArray[2] = String(Number(verArray[2])+1);
    } else if (verArray[1] < 9) {
        verArray[1] = String(Number(verArray[1])+1);
        verArray[2] = 0;
    } else {
        verArray[0] = String(Number(verArray[0])+1);
        verArray[1] = 0;
        verArray[2] = 0;
    }
    var newVersion = `${verArray[0]}.${verArray[1]}.${verArray[2]}`
    var newVersion = newVersion + "-" + md5(`${new Date().getTime()}${newVersion}`);
    console.log(newVersion);
    var packageJson = fs.readFileSync("./package.json");
    var packageJson = JSON.parse(packageJson);
    packageJson.version = newVersion;
    var newPackage = JSON.stringify(packageJson);
    fs.writeFileSync("./package.json", newPackage);
    console.log("Complete!!");
}

update();

最后

如果是 Hexo 文件部署,就可以直接把文件直接丢在项目根目录,Action 集成部署加上:

node update.js

image.png

Blog 半年没更新,除除草 --(....

Coding For Fun!

4 声望
0 粉丝
0 条评论
推荐阅读
手把手教你写一份优质的前端技术简历
不知不觉一年一度的秋招又来了,你收获了哪些大厂的面试邀约,又拿了多少offer呢?你身边是不是有挺多人技术比你差,但是却拿到了很多大厂的offer呢?其实,要想面试拿offer,首先要过得了简历那一关。如果一份简...

tonychen153阅读 18k评论 5

封面图
正则表达式实例
收集在业务中经常使用的正则表达式实例,方便以后进行查找,减少工作量。常用正则表达式实例1. 校验基本日期格式 {代码...} {代码...} 2. 校验密码强度密码的强度必须是包含大小写字母和数字的组合,不能使用特殊...

寒青57阅读 8.7k评论 11

JavaScript有用的代码片段和trick
平时工作过程中可以用到的实用代码集棉。判断对象否为空 {代码...} 浮点数取整 {代码...} 注意:前三种方法只适用于32个位整数,对于负数的处理上和Math.floor是不同的。 {代码...} 生成6位数字验证码 {代码...} ...

jenemy49阅读 7.4k评论 12

再也不学AJAX了!(二)使用AJAX ① XMLHttpRequest
「再也不学 AJAX 了」是一个以 AJAX 为主题的系列文章,希望读者通过阅读本系列文章,能够对 AJAX 技术有更加深入的认识和理解,从此能够再也不用专门学习 AJAX。本篇文章为该系列的第二篇,最近更新于 2023 年 1...

libinfs42阅读 7k评论 12

封面图
CSS 绘制一只思否猫
欢迎关注我的公众号:前端侦探练习 CSS 有一个比较有趣的方式,就是发挥想象,绘制各式各样的图案,比如来绘制一只思否猫?思否猫,SegmentFault 思否的吉祥物,是一只独一无二、特立独行、热爱自由的(&gt;^ω^&lt...

XboxYan48阅读 3.4k评论 14

封面图
「多图预警」完美实现一个@功能
一天产品大大向 boss 汇报完研发成果和产品业绩产出,若有所思的走出来,劲直向我走过来,嘴角微微上扬。产品大大:boss 对我们的研发成果挺满意的,balabala...(内心 OS:不听,讲重点)产品大大:咱们的客服 I...

wuwhs32阅读 3.6k评论 5

封面图
还在用 JS 做节流吗?CSS 也可以防止按钮重复点击
举个例子:一个保存按钮,为了避免重复提交或者服务器考虑,往往需要对点击行为做一定的限制,比如只允许每300ms提交一次,这时候我想大部分同学都会到网上直接拷贝一段throttle函数,或者直接引用lodash工具库

XboxYan35阅读 2.7k评论 2

封面图

Coding For Fun!

4 声望
0 粉丝
宣传栏