我們正在舊金山招聘系統工程師,以打造 JavaScript 的未來!
此版本修正了 64 個錯誤(解決了 62 個 👍)。它引入了 Bun.randomUUIDv7
、減少了長時間運行的程序的記憶體用量、napi_type_tag_object
和 napi_check_object_type_tag
、從配置日誌中編輯機密資訊、ReadableStream
和 HTTP/1.1 規範修正,以及多項 bun install
和 Node.js 相容性改進。
安裝 Bun
curl -fsSL https://bun.dev.org.tw/install | bash
npm install -g bun
powershell -c "irm bun.sh/install.ps1|iex"
scoop install bun
brew tap oven-sh/bun
brew install bun
docker pull oven/bun
docker run --rm --init --ulimit memlock=-1:-1 oven/bun
升級 Bun
bun upgrade
新增:Bun.randomUUIDv7()
Bun.randomUUIDv7()
傳回 UUID v7,這是一種單調遞增的 UUID,適用於排序和資料庫。
import { randomUUIDv7 } from "bun";
const id = randomUUIDv7();
// => "0192ce11-26d5-7dc3-9305-1426de888c5a"
長時間運行的程序使用更少的記憶體
當您的應用程式在事件迴圈中休眠時,垃圾回收器會運行並釋放更多記憶體。這減少了長時間運行的程序的記憶體用量。
在下一個 Bun 版本中
— Jarred Sumner (@jarredsumner) 2024年10月29日
長時間運行的程序使用的記憶體稍微減少了 pic.twitter.com/Q71tY0kU5r
範例程式碼
napi_type_tag_object
和 napi_check_object_type_tag
Bun v1.1.34 新增了對 napi_type_tag_object
和 napi_check_object_type_tag
的 Node-API 支援。這些函數允許將類型標籤與物件關聯,並解鎖了 tree-sitter 套件。
感謝 @190n 實作!
在 bunfig.toml
和 .npmrc
日誌中編輯機密資訊
現在,Bun 將在 bunfig.toml
和 .npmrc
日誌中,針對語法錯誤或無效配置編輯機密資訊。UUID、npm 機密令牌、url 密碼以及後接 _auth
、_authToken
、email
、_password
和 token
的值將被替換為 *
。
[registry]
a = { b = "http://user:pass@site.org", ; token = "ooops" }
$ bun install
- 2 | a = { b = "http://user:pass@site.org", ; token = "ooops" }
+ 2 | a = { b = "http://user:****@site.org", ; token = "*****" }
^
error: Unexpected semicolon
at /path/to/bunfig.toml:2:40
SyntaxError: failed to load bunfig
感謝 @dylan-conway!
在 bun build --compile
中內聯 process.versions.bun
當您使用 bun build --compile
時,Bun 現在將內聯 process.versions.bun
的用法。
這表示在使用 bun build --compile
時,可以使用以下程式碼來靜態載入 node native addons
const bindings =
typeof process.versions.bun === "string"
? // `bun build --compile` will bundle the prebuilt .node file into the standalone build
require(`./preload/${process.platform}-${process.arch}/my-addon.node`) // -> ./preload/linux-x64/my-addon.node
: // Otherwise, use node-gyp-build to resolve the .node file at runtime
require("node-gyp-build")(
path.join(
__dirname,
`${process.platform}-${process.arch}`,
`my-addon.node`,
),
);
感謝 @youennf!
錯誤修正
已修正:ReadableStream 規範更新
我們已根據 WebKit 的上游變更更新了 ReadableStream 實作,修正了多個規範問題,包括
- 在管道傳輸的 ReadableStream 上發生錯誤可能導致未處理的 Promise 拒絕
pipeThrough
和pipeTo
Promise 未標記為已處理ReadableStream
中的錯誤會在錯誤讀取 Promise 之前拒絕已關閉的 PromiseReadableStreamDefaultReader.releaseLock
正在拒絕待定的讀取 Promise
感謝 @pfgithub 和 @youennf(透過 WebKit)提供重要的修正!
已修正:bun install
在使用 patchedDependencies
和 bin
欄位時失敗
已修正當 package.json
也包含 bin
欄位時,導致修補的依賴項安裝失敗的錯誤。現在,兩者可以同時存在於 package.json
中,並且修補程式將正確應用。
{
"name": "pkg",
"version": "1.0.0",
"bin": "pkg.js",
"dependencies": {
"zod": "3.23.8"
},
"patchedDependencies": {
"zod@3.23.8": "patches/zod@3.23.8.patch"
}
}
感謝 @dylan-conway 的修正!
已修正:遷移 package-lock.json
時,依賴於根套件
假設有以下 package.json
{
"name": "root-dep",
"dependencies": {
// becomes `./node_modules/root-dep`, a symlink to the root package
"root-dep": "."
}
}
npm
將產生一個 package-lock.json
,其中包含兩個套件:一個用於根套件,另一個用於依賴於根套件的套件。根套件依賴項的 resolved
值將為空字串。當遷移具有此結構的 package.json
時,Bun 會因為此類型的根依賴項不是預期的而panic。
感謝 @dylan-conway 的修正!
已修正:在 Bun.build
中,沒有 outdir
的多個輸出檔案
修正了一個錯誤,該錯誤會導致在調用 Bun.build
時,如果有多個輸出檔案且沒有 outdir
,則會失敗並顯示訊息,指出需要輸出目錄。當 outdir
未定義時,Bun.build
預設為記憶體內建置,因此此錯誤是不正確的。現在,Bun.build
將在記憶體中建立具有多個輸出檔案的建置,而不會出錯。
const result = await Bun.build({
entrypoints: ["main.ts", "index.html"],
})
for (const output of result.outputs) {
console.log(output.path);
}
// "./main.js"
// "./index.js"
// "./index-7qpw8w4s.html"
感謝 @BjornTheProgrammer 的修正!
已修正:Amazon Linux 2 回歸問題
Bun v1.1.33 中不再支援 Amazon Linux 2 的回歸問題已修正。
此錯誤是由於依賴於 libc powf
函數引起的,該函數使用的 glibc 版本比 Amazon Linux 2 支援的版本更高。我們已新增一個回歸測試,以確保我們不會新增對 glibc 2.27 版本中不可用的符號的依賴。當使用 Vercel 的 Node.js v18 映像時,此錯誤也會影響 Vercel 建置。
已修正:在具有 glibc-compat 的 arm64 Linux 上,bun:sqlite
回歸問題
已修正透過 alpine linux 內部的 glibc 使用 bun:sqlite
會導致崩潰的回歸問題。
已新增:node:net
Socket 的 bytesWritten
屬性
現在已正確實作 node:net
Socket
物件上的 bytesWritten
屬性,感謝 @cirospaciari。
這也使 net.Socket
中的 encoding
選項與 Node.js 的行為保持一致。
已修正:node:fs
的選項解析與 "encoding"
選項
node:fs
中的 encoding
選項在某些 node:fs 函數中未正確解析。這導致在 Node 不會拋出錯誤時拋出錯誤。此問題已修正。
已修正:從另一個 File
建立的 File
物件附加 FormData 時可能發生的崩潰
已修正一個錯誤,該錯誤會導致在某些情況下,從另一個 File
建立的 Web File
物件附加 FormData
時可能會導致崩潰。這影響了 OpenAI 套件。
已修正:非物件上的 napi 屬性方法
Node-API 函數支援在原始值(如字串文字和數字)上調用方法。這與 JavaScript (如 "foo".slice()
) 一致,但在 native 程式碼中,為了提高效能,底層實作以不同於 JavaScript 的方式處理這些值。
已修正一個錯誤,該錯誤會導致當在非物件上調用 Node-API 函數(如 String.prototype.slice
或 Number.prototype.toFixed
)時拋出錯誤,感謝 @190n。
已修正:TextEncoder.encode(undefined)
結果不正確
TextEncoder.encode()
會字串化輸入,除非輸入為 undefined
。Bun 錯誤地將 undefined
包含在字串轉換中,而它應該傳回一個空的 Uint8Array
。
const encoder = new TextEncoder();
console.log(encoder.encode());
// Before: Uint8Array(9) [ 117, 110, 100, 101, 102, 105, 110, 101, 100 ]
// Bun v1.1.34: Uint8Array(0) []
感謝 @dylan-conway 的修正!
已修正:Error.prepareStackTrace
參數轉換中的崩潰
修正了一個錯誤,該錯誤會導致在使用非 CallSite 值的陣列調用 Error.prepareStackTrace()
時崩潰。現在,值會如預期般字串化以用於錯誤堆疊追蹤。
const result = Error.prepareStackTrace(new Error("oops"), [{ a: 1 }]);
console.log(result);
// Error: oops
// at [object Object]
已修正:多個 HTTP 規範問題
我們的 uWebSockets 依賴項已更新並新增了其他 HTTP/1.1 規範相容性測試,解決了多個涉及無效標頭的 HTTP 規範問題。
感謝 Alex Hultman 提供重要的修正!
已修正:EventEmitter.name
修正了一個錯誤,該錯誤會導致 EventEmitter.name
設定為 EventEmitter2
而不是 EventEmitter
。
import { EventEmitter } from "events";
console.log(EventEmitter.name);
// Before: EventEmitter2
// Bun v1.1.34: EventEmitter
已修正:使用 package.json
腳本時,額外參數的跳脫字元
當參數傳遞到 package.json
中的腳本時,參數未正確跳脫字元。感謝 @pfgithub,此問題已修正!
假設有以下 package.json
{
"scripts": {
"args": "echo"
}
}
bun run args \$HOME
之前會印出 /path/to/home
而不是 $HOME
。
已改進:移除 .npmrc
中未使用註冊表選項的警告
先前,如果為預設註冊表(使用 registry=<...>
設定)以外的註冊表設定了 npmrc
中的選項,Bun 會印出警告。我們已移除此警告,因為它是非必要的。
感謝 @dylan-conway!
已改進:使用 bun add
的第一個依賴項格式化 package.json
當使用 bun add/install/update
將第一個依賴項新增到 dependencies
時,產生的 package.json
現在將具有更好的格式。
bun add jquery@4.0.0-beta.2
{
"name": "dependency-formatting",
"dependencies": {
"jquery": "4.0.0-beta.2"
},
"dependencies": { "jquery": "4.0.0-beta.2" }
}
感謝 @nektro!
已改進:bun install -g <package>
將不會連結遞移二進位檔
全域安裝套件將不再連結來自遞移依賴項的二進位檔到全域 bin
目錄。這將防止將意外的二進位檔放置在 PATH 中。
感謝 @dylan-conway!