如何活在一个没有Node.js只有Bun的环境里

大家好,我是农村程序员,独立开发者,行业观察员,前端之虎陈随易。我会在这里分享关于 独立开发编程技术思考感悟 等内容,欢迎关注。

技术群与交朋友请在个人网站联系我,网站 1️⃣:chensuiyi.me,网站 2️⃣:me.yicode.tech

如果你觉得本文有用,一键三连 (点赞评论转发),就是对我最大的支持~


相关文章:Bun v1.2.19 发布,node_modules 隔离,sql 比 node 快 6 倍

我已经 All in Bun 几个月了,怎么 All in 法呢?就是把 本地的Node.js线上的Node.js 全部删除了,完全生活在一个只有 Bun,没有 Node.js 的世界里。

为何如此?因为我的个人习惯就是,要么高度纯粹,要么高度自由。

就像为什么我从业10年都没有用 TypeScript 写过项目?并不是我学不会,而是我无法把 TypeScript 用得纯粹,也就是说,如果我一旦用 TypeScript,那么我就只想处处都是严格的类型,严格的代码。

但很多人的实践证明,这是无法做到的,或者说要耗费非常大的心力才能做到,所以我觉得没有使用的必要,最终还是选择了 JavaScript 的高度自由。

本文并不是让你像我一样,完全抛弃 Node.js 而转投 Bun 的门下,而是想分享一些我的使用经验,给需要的人提供一些参考。我也不建议大家在生产项目中使用 Bun,Node.js 还是更加成熟稳定不易出错的,但推荐大家去看一看 Bun 的文档,理念,功能,去了解一下这个 Bun 的最强有力的竞争者,正在做的事情。

昨天刷到 Bun 的创始人 Jarred Sumner 的一条帖子,将会让 Bun 长期运行的服务内存减少 10 倍,真是令人期待。而 Bun,每天都有帖子分享进展,每周,基本都有一个版本发布,真是一个充满了活力与激情的团队。根据我的个人经验来看,一个东西行不行,主要看负责人是否有自信,是否在积极推进,我非常看好 Bun。

闲言少叙,我的老粉应该知道,我写文章有时候并不是直接分享冷冰冰的技术的,所以会有一些技术之外的思考和感想,如果读者朋友们不喜欢,直接取关我即可,同时也感谢大家的支持与厚爱,昨天关注人数突破 10000。

这是花费了一年半,写了 200 多篇原创文章的成果,不简单,也不容易,但是不累,因为分享技术是我很喜欢的一个事情,做喜欢的事情就不会累。

Bun 在本地的 All in 就不说了,非常简单,直接用 Bun 来替代 Node.js 的一切即可。而如果要想在服务器上 All in Bun,那很有可能就会遇到麻烦。

服务器部署 js 应用,比较常见的方法就是使用 pm2 来进行项目的管理,负载均衡,多进程,平滑重启等等。但如果按照往常 Node.js 的配置方式,Bun 还是需要 Node.js 的配合才能跑起来,那么下面之间把几个要点分享:

  1. 使用 --bun 参数指定为用 Bun 运行 pm2。
  2. 使用 -a 参数重启应用,同时包括环境变量更新。
  3. 指定 bun 为项目的执行程序。
  4. pm2 命令设置别名。

解决以上几个问题,就能保持 Bun 的纯粹啦,这几个问题,当初可是耗费我不少时间的查找,研究,测试,询问才总结出来,下面详细分享。

package.json 文件

json 复制代码
{
    "scripts": {
        "dev": "bun run main.js",
        "start": "bunx --bun pm2 start pm2.config.cjs -a"
    }
}

首先,package.json 文件中的 start 脚本配置如上,--bun 参数表示使用 bun 来运行 pm2,否则 pm2 还是会默认使用 Node.js 来运行。如果你服务器上面没有 Node.js,就会提示 node 命令不存在,pm2 就跑不起来了。

pm2.config.cjs 文件

js 复制代码
module.exports = {
    apps: [
        {
            name: 'project1',
            instances: 4,
            script: './main.js',
            exec_mode: 'cluster',
            watch: false,
            autorestart: true,
            interpreter: 'bun',
            ignore_watch: ['node_modules', 'logs', 'data'],
            max_memory_restart: '200M',
            env: {
                NODE_ENV: 'production'
            }
        }
    ]
};

pm2.config.cjs 文件是 pm2 的配置文件,可以非常方便地把项目的 pm2 部署参数长期保存和修改,这里只需要把 interpreter 参数设置为 bun,script 参数指向运行入口文件即可。

给 pm2 命令设置别名

以上配置完毕,使用 bun run start,就能把项目跑起来了,如果你还想查看项目的运行日志怎么办?此时,如果你运行 pm2 logs project1,命令行会提示 node 命令没找到,因为 pm2 是默认使用 node 来执行它的代码的。

此处呢,我们只需要给 pm2 的常用命令设置别名即可,内容如下:

这里为了跟 pm2 进行区别,我特意把命令全部设置为 pm3 前缀了。

这样呢,我们就能直接用别名来查看 pm2 的应用列表,运行状态啦,如果本文有用,麻烦来个一键三连吧,感谢啦~

bash 复制代码
#!/bin/bash
# PM3 + Bun 别名配置文件
# 使用方法:在 ~/.bashrc 中添加 source ~/.pm3.sh

# 基础 PM3 命令
alias pm3='bunx --bun pm2'
alias pm3v='bunx --bun pm2 -v'
alias pm3list='bunx --bun pm2 ls'
alias pm3status='bunx --bun pm2 status'

# PM3 信息查看
alias pm3info='bunx --bun pm2 info'
alias pm3desc='bunx --bun pm2 describe'
alias pm3show='bunx --bun pm2 show'

# PM3 监控相关
alias pm3monit='bunx --bun pm2 monit'
alias pm3monitor='bunx --bun pm2 monitor'

# PM3 更新和维护
alias pm3update='bunx --bun pm2 update'
alias pm3reset='bunx --bun pm2 reset'
alias pm3kill='bunx --bun pm2 kill'

# PM3 重启应用(支持参数)
pm3rt() {
    if [ $# -eq 0 ]; then
        echo "用法: pm3r <name|id|all>"
        echo "示例: pm3r myapp"
        return 1
    fi
    bunx --bun pm2 restart "$@" -a
}

# PM3 停止应用(支持参数)
pm3st() {
    if [ $# -eq 0 ]; then
        echo "用法: pm3st <name|id|all>"
        echo "示例: pm3st myapp"
        return 1
    fi
    bunx --bun pm2 stop "$@"
}

# PM3 删除应用(支持参数)
pm3dn() {
    if [ $# -eq 0 ]; then
        echo "用法: pm3dn <name|id|all>"
        echo "示例: pm3dn myapp"
        return 1
    fi
    bunx --bun pm2 delete "$@"
}

# PM3 查看应用信息(支持参数)
pm3in() {
    if [ $# -eq 0 ]; then
        bunx --bun pm2 info
    else
        bunx --bun pm2 info "$@"
    fi
}

# PM3 查看日志(支持参数)
pm3log() {
    if [ $# -eq 0 ]; then
        bunx --bun pm2 logs
    else
        bunx --bun pm2 logs "$@"
    fi
}

# 快速重启所有应用
pm3ra() {
    bunx --bun pm2 restart all
}

# 快速停止所有应用
pm3sa() {
    bunx --bun pm2 stop all
}

# 快速删除所有应用
pm3da() {
    echo "确定要删除所有 PM3 应用吗? (y/N)"
    read -r response
    if [[ "$response" =~ ^[Yy]$ ]]; then
        bunx --bun pm2 delete all
    else
        echo "操作已取消"
    fi
}

# PM3 状态概览
pm3stat() {
    echo "=== PM3 状态概览 ==="
    bunx --bun pm2 list
    echo ""
    echo "=== 系统资源 ==="
    bunx --bun pm2 monit --no-daemon
}



# 显示帮助信息
pm3h() {
    echo "=== PM3 + Bun 别名帮助 ==="
    echo ""
    echo "  pm3                 - PM2 基础命令"
    echo "  pm3list             - 列出所有应用"
    echo "  pm3status           - 显示应用状态"
    echo "  pm3monit            - 打开监控界面"
    echo "  pm3rt <name>        - 重启应用"
    echo "  pm3st <name>        - 停止应用"
    echo "  pm3dn <name>        - 删除应用"
    echo "  pm3in [name]        - 查看应用信息"
    echo "  pm3log [name]       - 查看日志"
    echo "  pm3ra               - 重启所有应用"
    echo "  pm3sa               - 停止所有应用"
    echo "  pm3da               - 删除所有应用(需确认)"
    echo "  pm3stat             - 状态概览"
    echo "  pm3update           - 更新 PM2"
    echo "  pm3reset            - 重置"
    echo "  pm3kill             - 杀死 PM2 守护进程"
    echo ""
    echo "说明: 大部分命令支持应用名称、ID 或 'all' 参数"
    echo "更多帮助: pm3 help"
}

# 设置命令补全(如果支持)
if command -v complete >/dev/null 2>&1; then
    # 为主要的 PM3 命令设置补全
    _pm3_completions() {
        local apps
        apps=$(bunx --bun pm2 list --no-header 2>/dev/null | awk '{print $2}' | grep -v '^$')
        COMPREPLY=($(compgen -W "$apps all" -- "${COMP_WORDS[COMP_CWORD]}"))
    }

    complete -F _pm3_completions pm3r pm3st pm3d pm3i pm3desc pm3l pm3log pm3reset
fi
相关推荐
Drawing stars5 分钟前
JAVA后端 前端 大模型应用 学习路线
java·前端·学习
品克缤10 分钟前
Element UI MessageBox 增加第三个按钮(DOM Hack 方案)
前端·javascript·vue.js
小二·19 分钟前
Python Web 开发进阶实战:性能压测与调优 —— Locust + Prometheus + Grafana 构建高并发可观测系统
前端·python·prometheus
小沐°26 分钟前
vue-设置不同环境的打包和运行
前端·javascript·vue.js
行百里er36 分钟前
用 ThreadLocal + Deque 打造一个“线程专属的调用栈” —— Spring Insight 的上下文管理术
java·后端·架构
玄〤1 小时前
黑马点评中 VoucherOrderServiceImpl 实现类中的一人一单实现解析(单机部署)
java·数据库·redis·笔记·后端·mybatis·springboot
qq_419854051 小时前
CSS动效
前端·javascript·css
烛阴1 小时前
3D字体TextGeometry
前端·webgl·three.js
J_liaty1 小时前
Spring Boot拦截器与过滤器深度解析
java·spring boot·后端·interceptor·filter
短剑重铸之日1 小时前
《7天学会Redis》Day2 - 深入Redis数据结构与底层实现
数据结构·数据库·redis·后端