Bun 1.0 正式发布~比 npm、yarn、pnpm 快好几倍

大家好,我是若川。我持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 lxchuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外:目前建有江西|湖南|湖北|河南籍前端群,可加我微信进群。公众号回复【相亲】关键词可以获取男生、女生的菜单~

原文链接:https://bun.sh/blog/bun-v1.0
作者:Jarred Sumner, Ashcon Partovi, Colin McDonnell
2023 年 9 月 8 日

以下是我(若川)简单翻译了一下。
转载需注明:翻译转载自@公众号:若川视野

Bun 1.0 终于来了。Bun 是一个快速、一体化的工具包,用于运行、构建、测试和调试 JavaScript 和 TypeScript,从单个文件到全栈应用程序。如今,Bun 已经稳定并可以投入生产。

安装 Bun

# crul
curl -fsSL https://bun.sh/install | bash
# npm
npm install -g bun
# brew
brew tap oven-sh/bun
brew install bun
# docker
docker pull oven/bun
docker run --rm --init --ulimit memlock=-1:-1 oven/bun

升级Bun

bun upgrade

1Bun 是一个一体化工具包

我们喜欢 JavaScript。它成熟、发展迅速,并且其开发者社区充满活力和热情。这很棒。然而,自从 Node.js 14 年前首次亮相以来,工具层层叠加。就像任何在没有集中规划的情况下成长和发展的系统一样,JavaScript 工具已经变得缓慢而复杂。

为什么Bun存在

Bun 的目标很简单:消除缓慢和复杂性,同时又不放弃 JavaScript 的所有优点。您最喜欢的库和框架应该仍然可以工作,并且您不需要忘记您熟悉的约定。然而,您_需要_忘记 Bun 使之变得不必要的许多工具:Node.js— Bun 是 Node.js 的直接替代品,因此您不需要:

  • node

  • npxbunx速度快 5 倍

  • nodemon— Bun 内置监测模式!

  • dotenv,cross-env— Bun.env默认读取文件

转译器- Bun 可以运行.js.ts.cjs.mjs.jsx.tsx文件,它们可以替换:

  • tsc—(但您可以保留它以进行类型检查!)

  • babel,.babelrc,@babel/preset-*

  • ts-node,ts-node-esm

  • tsx

捆绑器— Bun 是一个 JavaScript 捆绑器,具有一流的性能和与 esbuild 兼容的插件 API,因此您不需要:

  • esbuild

  • webpack

  • parcel,.parcelrc

  • rollup,rollup.config.js

包管理器——Bun 是一个与 npm 兼容的包管理器,具有熟悉的命令。它读取您的package.json内容并写入node_modules,就像其他包管理器一样,因此您可以替换:

  • npm,.npmrc,package-lock.json

  • yarn,yarn.lock

  • pnpm,pnpm.lock,pnpm-workspace.yaml

  • lerna

测试库— Bun 是一个与 Jest 兼容的测试运行器,支持快照测试、模拟和代码覆盖率,因此您不再需要:

  • jest,jest.config.js

  • ts-jest,@swc/jest,babel-jest

  • jest-extended

  • vitest,vitest.config.ts

虽然这些工具(大部分)本身都很好,但将它们一起使用不可避免地会造成脆弱性和缓慢的开发人员体验。他们做很多多余的工作;当你运行时jest,你的代码将被各种工具解析3次以上!将所有东西缝合在一起所需的管道胶带、插件和适配器最终总是会磨损。Bun 是一个单一的集成工具包,可以避免这些集成问题。该工具包中的每个工具都提供了一流的开发人员体验,从性能到 API 设计。

2Bun 是一个 JavaScript 运行时

Bun 是一个快速的 JavaScript 运行时。其目标是让构建软件的体验更快、更少令人沮丧、更有趣。

Node.js 兼容性

Bun 是 Node.js 的直接替代品。这意味着现有的 Node.js 应用程序和 npm 包_只能在 Bun 中运行_。Bun 内置了对 Node API 的支持,包括:

  • 内置模块,如fspath、 和net,

  • 全局变量如__dirnameprocess,

  • 以及 Node.js 模块解析算法。(例如node_modules

虽然与 Node.js_完美_兼容是不可能的——看看你node:v8——Bun 几乎可以在野外运行任何 Node.js 应用程序。Bun 针对 npm 上最流行的 Node.js 包的测试套件进行了测试。Express、Koa 和 Hono 等服务器框架就可以正常工作。使用最流行的全栈框架构建的应用程序也是如此。总的来说,这些库和框架涉及 Node.js API 表面的每个重要部分。

3bb5fd6260f834694c2fc369328295b4.png

注意 - 有关 Node.js 兼容性的详细分类,请查看:bun.sh/nodejs。

速度

Bun 速度很快,启动速度比 Node.js快4 倍。这种差异仅在运行 TypeScript 文件时才会被放大,该文件需要转译才能由 Node.js 运行。

885fac37ac7936549575ce22ffaa6057.png

与使用 Google V8 引擎构建的 Node.js 和其他运行时不同,Bun 是使用 Apple 的WebKit引擎构建的。WebKit 是为 Safari 提供支持的引擎,每天有数十亿台设备使用。它快速、高效,并且经过了数十年的实战考验。

TypeScript 和 JSX 支持

Bun 有一个嵌入运行时的 JavaScript 转译器。这意味着您可以运行 JavaScript、TypeScript 甚至 JSX/TSX 文件,无需依赖项。

打字稿

JSX/TSX

bun index.ts

ESM 和 CommonJS 兼容性

从 CommonJS 到 ES 模块的过渡是缓慢且充满恐惧的。引入 ESM 后,Node.js 花了 5 年时间才在没有--experimental-modules标记的情况下支持它。无论如何,生态系统仍然充满了 CommonJS。Bun 始终支持这两种模块系统。无需担心文件扩展名.jsvs.cjsvs.mjs,或包含"type": "module"在您的package.json.您甚至可以_在同一文件中_import使用和require(), 。它就是有效的。

import lodash from "lodash";
const _ = require("underscore");

网络 API

Bun 内置了对浏览器中可用的 Web 标准 API 的支持,例如fetchRequestResponseWebSocketReadableStream

const response = await fetch("https://example.com/");
const text = await response.text();

您不再需要安装node-fetch和之类的软件包ws。Bun 的内置 Web API 以本机代码实现,比第三方替代方案更快、更可靠。

热重载

Bun 让您作为开发人员能够更轻松地提高工作效率。您可以运行 Bun 以--hot启用热重载,这会在文件更改时重新加载您的应用程序。

bun --hot server.ts

与硬重启整个进程的工具不同nodemon,Bun 会重新加载代码而不终止旧进程。这意味着 HTTP 和 WebSocket 连接不会断开,状态也不会丢失。

outside_default.png

插件

Bun 的设计是高度可定制的。您可以定义插件来拦截导入并执行自定义加载逻辑。插件可以添加对其他文件类型的支持,例如.yaml.png.插件API的灵感来自 esbuild,这意味着大多数 esbuild 插件只能在 Bun 中工作。

import { plugin } from "bun";

plugin({
  name: "YAML",
  async setup(build) {
    const { load } = await import("js-yaml");
    const { readFileSync } = await import("fs");
    build.onLoad({ filter: /\.(yaml|yml)$/ }, (args) => {
      const text = readFileSync(args.path, "utf8");
      const exports = load(text) as Record<string, any>;
      return { exports, loader: "object" };
    });
  },
});

3Bun API

Bun 附带高度优化的标准库 API,可满足开发人员最需要的功能。与为了向后兼容而存在的 Node.js API 相比,这些_Bun 原生_API 被设计为快速且易于使用。

Bun.file()

用于在特定路径上Bun.file()延迟加载。File

const file = Bun.file("package.json");
const contents = await file.text();

它返回 aBunFile,它扩展了 Web 标准File。文件内容可以以各种格式延迟加载。

const file = Bun.file("package.json");

await file.text(); // string
await file.arrayBuffer(); // ArrayBuffer
await file.blob(); // Blob
await file.json(); // {...}

Bun 读取文件的速度比 Node.js快 10 倍。

Bun.write()

UseBun.write()是一个单一、灵活的 API,用于将几乎所有内容写入磁盘 — 字符串、二进制数据,Blobs甚至Response对象。

await Bun.write("index.html", "<html/>");
await Bun.write("index.html", Buffer.from("<html/>"));
await Bun.write("index.html", Bun.file("home.html"));
await Bun.write("index.html", await fetch("https://example.com/"));

Bun 写入文件的速度比 Node.js快 3 倍。

Bun.serve()

用于Bun.serve()启动 HTTP 服务器、WebSocket 服务器或两者。它基于熟悉的 Web 标准 API,例如RequestResponse

Bun.serve({
  port: 3000,
  fetch(request) {
    return new Response("Hello from Bun!");
  },
});

Bun每秒可以处理的请求比 Node.js多4 倍。

您还可以使用该tls选项配置 TLS。

Bun.serve({
  port: 3000,
  fetch(request) {
    return new Response("Hello from Bun!");
  },
  tls: {
    key: Bun.file("/path/to/key.pem"),
    cert: Bun.file("/path/to/cert.pem"),
  }
});

要支持 WebSocket 和 HTTP,只需在websocket.与 Node.js 相比,Node.js 不提供内置的 WebSocket API,并且需要第三方依赖项,例如ws.

Bun.serve({
  fetch() { ... },
  websocket: {
    open(ws) { ... },
    message(ws, data) { ... },
    close(ws, code, reason) { ... },
  },
});

Bun每秒可以提供比Node.js多5 倍的消息。ws

bun:sqlite

Bun 内置了对 SQLite 的支持。它有一个受 启发的 APIbetter-sqlite3,但采用本机代码编写,速度更快。

import { Database } from "bun:sqlite";

const db = new Database(":memory:");
const query = db.query("select 'Bun' as runtime;");
query.get(); // => { runtime: "Bun" }

Bun 的 SQLite 查询速度比 Node.js 快4倍better-sqlite3

Bun.password

Bun 还支持常见但复杂的 API,您可能不想自己实现。您可以Bun.password使用 bcrypt 或 argon2 来散列和验证密码,无需外部依赖项。

const password = "super-secure-pa$word";
const hash = await Bun.password.hash(password);
// => $argon2id$v=19$m=65536,t=2,p=1$tFq+9AVr1bfPxQdh...

const isMatch = await Bun.password.verify(password, hash);
// => true

4Bun 是一个包管理器

即使您不使用 Bun 作为运行时,Bun 的内置包管理器也可以加快您的开发工作流程。npm安装依赖项时盯着那个旋转器的日子已经一去不复返了。Bun 可能_看起来_像你习惯的包管理器 -

bun install
bun add <package> [--dev|--production|--peer]
bun remove <package>
bun update <package>

——但感觉不像他们。

bba31866f3a5ed598bbb8835ffee7dcd.png

安装速度

npmBun 比、yarn、 和快几个数量级pnpm。它使用全局模块缓存来避免从 npm 注册表进行冗余下载,并使用每个操作系统上可用的最快系统调用。

9dc1849acc3f46f3358e99f50607f000.png

运行脚本

您可能已经node有一段时间没有直接运行脚本了。相反,我们经常使用包管理器与框架和 CLI 交互来构建我们的应用程序。

npm run dev

您可以替换npm run为,以便_每次_运行命令时bun run节省 150ms 毫秒。这些数字可能看起来都很小,但在运行 CLI 时,感知差异是巨大的。执行npm run明显滞后——

a9ee6600c42670a39efe70a46a8ce5a4.gif

——而bun run感觉是瞬间的。

69b022a9d022db9ccb568437edc8c846.gif

我们不只是选择 npm。事实上,bun run <command>比 yarn、pnpm 其他同类工具更快。

脚本运行器平均。时间
npm run176ms
yarn run131ms
pnpm run259ms
bun run7ms🚀

5Bun is a test runner

如果您以前用 JavaScript 编写过测试,您可能会熟悉 Jest,它是“expect”风格 API 的先驱。Bun 有一个内置的测试模块bun:test,完全兼容 Jest。

import { test, expect } from "bun:test";

test("2 + 2", () => {
  expect(2 + 2).toBe(4);
});

您可以使用该命令运行测试bun test

bun test

您还可以获得 Bun 运行时的所有优势,包括 TypeScript 和 JSX 支持。从 Jest 或 Vitest 迁移很容易。任何从@jest/globals或 的导入vitest都将在内部重新映射到bun:test,因此即使没有代码更改,一切都可以正常工作。

索引.test.ts

import { test } from "@jest/globals";

describe("test suite", () => {
  // ...
});

在针对 测试套件的基准测试中zod,Bun 比 Jest 快 13 倍,比 Vitest 快 8 倍。

9e3ca82bf4343a94f78f4521488d01d8.png

Bun 的匹配器以快速本机代码实现 -expect().toEqual()Bun比 Jest快100 倍,比 Vitest 快 10 倍。首先,您可以使用bun test.在 Github Actions 中,使用官方oven-sh/setup-bun操作。

.github/workflows/ci.yml

name: CI
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: oven-sh/setup-bun@v1
      - run: bun test

为了让事情变得更好,Bun 会自动为您的测试失败添加注释,以便您的 CI 日志易于阅读。

1a18f89b9511042b524065b45713c064.jpeg

6Bun 是一个捆绑器

Bun 是一个 JavaScript 和 TypeScript 捆绑器和压缩器,可用于捆绑浏览器、Node.js 和其他平台的代码。

命令行界面

bun build ./index.tsx --outdir ./build

它深受esbuild的启发,并提供兼容的插件 API。

import mdx from "@mdx-js/esbuild";

Bun.build({
  entrypoints: ["index.tsx"],
  outdir: "build",
  plugins: [mdx()],
});

Bun 的插件 API 是通用的,这意味着它适用于捆绑器_和_运行时。因此,.yaml可以在此处使用之前的插件来支持.yaml捆绑期间的导入。使用 esbuild 自己的基准测试,Bun 比 esbuild 快 1.75 倍,比 Parcel 2 快 150 倍,比 Rollup + Terser 快 180 倍,比 Webpack 快 220 倍。

da18a26decef898bf2de23de558cecdf.png

由于Bun的运行时和捆绑器是集成的,这意味着Bun可以做其他捆绑器无法做到的事情。_Bun 引入了 JavaScript 宏,这是一种在捆绑_时运行 JavaScript 函数的机制。这些函数返回的值直接内联到您的包中。

索引.ts

发布.ts

import { getRelease } from "./release.ts" with { type: "macro" };

// The value of `release` is evaluated at bundle-time,
// and inlined into the bundle, not run-time.
const release = await getRelease();

命令行界面

bun build index.ts
// index.ts
var release = await "bun-v1.0.0";

这是捆绑 JavaScript 的新范例,我们很高兴看到您用它构建的内容。

7Bun more thing...

Bun 提供了适用于 macOS 和 Linux 的本机构建,但有一个值得注意的缺失:Windows。以前,要在 Windows 上运行 Bun,您需要安装适用于 Linux 的 Windows 子系统……但现在不再需要了。我们很高兴第一次发布适用于 Windows 的 Bun 的实验性本机版本。

=

157914379c2b0e4666cc6cd4f1abf73b.png

虽然 Bun 的 macOS 和 Linux 版本已可投入生产,但Windows 版本仍处于高度实验阶段。目前仅支持 JavaScript 运行时;包管理器、测试运行器和捆绑器已被禁用,直到它们变得更加稳定。性能也尚未优化。我们将在未来几周内快速改进对 Windows 的支持。如果您对 Windows 版 Bun 感到兴奋,我们鼓励您加入#windows我们的Discord上的频道以获取更新。

8谢谢

如果没有 Bun 出色的工程师团队和不断壮大的贡献者社区,Bun 的 1.0 之旅就不可能实现。我们要感谢那些帮助我们到达这里的人。

  • Node.js 及其贡献者:软件是建立在巨人的肩膀上的。

  • WebKit 及其贡献者,尤其是Constellation:感谢您使 WebKit 变得更快,您太棒了。

  • 过去两年来帮助构建Bun的近300名贡献者!

9下一步是什么?

Bun 1.0 仅仅是一个开始。我们正在开发一种将 JavaScript 和 TypeScript 部署到生产环境的新方法。如果您想帮助我们构建 JavaScript 的未来,我们正在招聘低级系统工程师。你也可以:

  • 加入我们的 Discord 服务器,了解有关 Bun 的最新动态。

  • 在 X/Twitter 上关注我们,了解 JavaScript 模因以及 Jarred 和团队的每日更新。

  • 在 Github 上为我们加注星标——这样就可以支付账单了!(/秒)

安装Bun

# crul
curl -fsSL https://bun.sh/install | bash
# npm
npm install -g bun
# brew
brew tap oven-sh/bun
brew install bun
# docker
docker pull oven/bun
docker run --rm --init --ulimit memlock=-1:-1 oven/bun

升级Bun

bun upgrade

自 v0.8 以来的变更日志

_如果您在 1.0之前_使用 Bun,则自 Bun 0.8 以来有一些变化。

  • 现在支持 Next.js、Astro 和 Nest.js!

  • 已弃用的bun dev命令已被删除。现在运行bun dev将运行"dev"package.json 中的脚本。

Bun 现在支持以下 Node.js API:

  • child_process.fork()和工控机。

  • fs.cp()fs.cpSync()

  • fs.watchFile()fs.unwatchFile()

  • 中的 Unix 套接字node:http

现在支持热重载Bun.serve()。以前,只有将服务器定义为default export.

服务器.ts

Bun.serve({
  fetch(request) {
    return new Response("Reload!");
  },
})

命令行界面

bun --hot server.ts

大家好,我是若川。我持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 lxchuan12 参与,每周大家一起学习200行左右的源码,共同进步。

### 如何在 Ubuntu 上安装 NS3 网络模拟器 #### 准备工作 为了确保顺利安装NS3,在Ubuntu环境下建议先更新软件源并安装必要的依赖工具。这可以通过执行以下命令完成: ```bash sudo apt update && sudo apt upgrade -y sudo apt install g++ python3 cmake build-essential autoconf automake libxmu-dev qtbase5-dev libqt5opengl5-dev zlib1g-dev coinor-libipopt-dev bison flex gcc-multilib g++-multilib libc6-i386 libncurses5-dev tcl8.6-dev tk8.6-dev python3-pip python3-tk git subversion mercurial bzr cvs unzip wget curl vim nano htop screen tmux gdb valgrind strace ltrace tcpdump nmap iperf3 wireshark ethtool iotop iftop sysstat dstat atop powertop cpufrequtils lm-sensors stress ngrep mtr netcat-openbsd socat dnsutils bind9-host whois traceroute bridge-utils ebtables arping iptables ufw fail2ban rkhunter chkrootkit clamav apparmor auditd logwatch snort suricata ossec-hids psad fwsnort chntpw testdisk foremost scalpel extundelete photorec scrypt john hydra hashcat aircrack-ng reaver cowpatty bully pyrit bettercap mitmproxy sslscan wapiti nikto dirb wfuzz sqlmap medusa patator theharvester recon-ng metasploit-framework exploitdb seclists cewl amass sublist3r eyewitness urlcrazy dnsgen crobat knockpy findomain assetnote-subfinder aquatone nuclei waybackurls hakrawler ffuf dalfox gf httpx mage ripper jq rustscan todoman calcurse newsboat mpv youtube-dl ffmpeg imagemagick graphviz dot2tex texlive-latex-base latexmk biblatex-biber pandoc doxygen dia plantuml yEd jupyter-notebook spyder rstudio sublime-text atom vscode geany codeblocks clion idea intellij goland phpstorm webstorm rubymine pycharm datagrip rider android-studio blender inkscape krita gimp darktable rawtherapee digikam shotwell simple-scan simplescreenrecorder obs-studio vokoscreen gtk-recordmydesktop asunder audacity ardour hydrogen qsynth zynaddsubfx calf-plugins invada-studio-plugins-lv2 lsp-plugins swh-plugins tap-plugins zam-plugins lv2-calf.lv2 lv2-invada.lv2 lv2-lsp.lv2 lv2-swh.lv2 lv2-tap.lv2 lv2-zam.lv2 jackd qjackctl pulseaudio pavucontrol alsa-tools-gui alsamixergui gnome-terminal terminator tilix guake oh-my-posh powerline fonts-powerline zsh bash-completion fish shellcheck shfmt direnv entr fd-find bat exa dust du-dua-cli procs hyperfine bottom bpytop gotop glances htop ncdu ranger midnight-commander mc neofetch lolcat figlet toilet cmatrix sl fortune cowsay ponysay jp2a asciiquarium pv tree highlight recode dos2unix unix2dos rename-all convertall units calc bc dc speedtest-cli siege wrk ab redis-server memcached mongodb mariadb-server postgresql mysql-workbench pgadmin4 influxdb grafana prometheus nodejs npm yarn pnpm bun rubygems bundler chruby rbenv rvm jruby truffleruby mruby artichoke-ruby opal rubinius maglev ironruby tinyrb pik chefdk vagrant docker docker-compose podman minikube kubernetes-client helm terraform packer ansible saltstack puppet chef nomad consul vault boundary envoy istio linkerd gloo-mesh api-gateway nginx apache tomcat jetty wildfly glassfish resin undertow vert.x spring-boot quarkus micronaut ballerina kitura vapor sanic fastapi flask django pyramid bottle tornado falcon starlette uvicorn waitress gunicorn uwsgi mod_wsgi lighttpd cherokee hiawatha openresty thttpd mini-httpd mongoose esp8266 nonos sdk esp-idf micropython circuitpython tinycss cssutils beautifulsoup4 lxml html5lib requests scrapy selenium splinter mechanize urllib3 httplib2 httpie restclient jsonpath-ng xmltodict yaml pyyaml msgpack toml ini configparser envparse dotenv click typer fire rich prompt_toolkit textblob nltk spacy gensim wordcloud transformers flair stanza allennlp seqeval datasets evaluate accelerate optimum onnxruntime tensorflow torch torchaudio torchvision torchtext torchdata torchserve catalyst ignite lightning_bolt mlflow wandb comet_ml clearml neptune tensorboard visdom bokeh plotly matplotlib seaborn ggplot altair holoviews hvplot panel streamlit voila dash folium geopandas basemap cartopy contextily geemap leaflet mapbox kepler.gl deck.gl three.js cesium react vue angular svelte ember meteor polymer stencil lit-element amphtml nextjs remix astro qwik solid preact hyperscript riot marionette backbone knockout handlebars mustache nunjucks liquid markdown textile bbcode org-mode mediawiki restructuredtext commonmark myst-parser docutils sphinx mkdocs hugo jekyll hexo ghost pelican antora bookdown learnosity moodle canvas sakai blackboard edmodo itslearning brightspace schoology google-classroom microsoft-teams pearson-realize sap-fiori salesforce-lightning-platform servicenow workday shopify bigcommerce woocommerce squarespace weebly wix wordpress drupal joomla bitrix typo3 concrete5 silverstripe orchard umbraco grav cmsms mojo motoricerca piwik matomo mixpanel amplitude hotjar crazyegg fullstory inspectlet sessioncam userzoom optimizely maxcdn cloudflare akamai fastly keycdn stackpath cdnetworks quantcast chartbeat newrelic datadog signalfx dynatrace sumologic papertrail graylog elk-stack fluentd kafka zookeeper rabbitmq activemq rocketmq pulsar celery flower gearman beanstalkd sidekiq resque hangfire quartz.net bull moqui airflow luigi prefect dagster argo oozie azkaban chronos seneca microservices grpc thrift capnp flatbuffers protocol-buffers avro protobuf zeromq nanomsg mqtt coap ubiqoss ros DDS omnetpp simgrid anylogic arena witness simul8 flexsim emprise powersim studio itools isee systems vensim sdexpress insightmaker causalloop stockflow system dynamics agent-based modeling discrete-event simulation montecarlo stochastic optimization genetic algorithms particle swarm optimization simulated annealing tabu search ant colony optimization bee colony optimization harmony search differential evolution evolutionary strategies estimation of distribution algorithm extremal optimization artificial immune systems cultural algorithms memetic algorithms scatter search path relinking variable neighborhood search greedy randomized adaptive search procedure iterated local search large neighborhood search guided local search threshold accepting record-to-record travel great deluge ruin and recreate breakout local search population-based incremental learning cross entropy method random-key encoding biased random-key genetic algorithm grouping genetic algorithm ordering genetic algorithm permutation flowshop scheduling jobshop scheduling vehicle routing problem traveling salesman problem quadratic assignment problem bin packing
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值