如何活在一个没有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
相关推荐
opbr几秒前
🚀 告别传统枚举的痛点!TypeScript 中的 constructEnum 让你的代码更优雅 ✨
前端·javascript
鬼鬼_静若为竹1 分钟前
今天在增加了攻击小马的功能
前端
遂心_2 分钟前
React性能优化实战:掌握memo、useCallback与useMemo的精妙用法
前端·javascript·react.js
CodePlayer3 分钟前
《学会提问》读后感
前端·程序员
是晓晓吖4 分钟前
源网站数据采集方案之解析DOM(五)
前端
FogLetter5 分钟前
CSS模块化:告别样式冲突,拥抱组件化开发
前端·react.js
angelQ5 分钟前
针对"@antfu/eslint-config": "^4.17.0"最新版本使用报错Unexpected token 'with'的解决方法
前端·eslint
小飞机噗噗噗5 分钟前
记录js使用原生 XMLHttpRequest方法 封装http请求,并提供使用实例
前端·javascript·react.js
用户2519162427117 分钟前
Canvas之绘制图形后续
前端·javascript·canvas
lixn9 分钟前
读懂Java字节码(1)
jvm·后端