تتضمن Bun مصغر JavaScript و TypeScript سريع يمكنه تقليل أحجام الحزم بنسبة 80% أو أكثر (اعتمادًا على قاعدة الكود) وجعل كود الإخراج يعمل بشكل أسرع. ينفذ المصغر عشرات التحسينات بما في ذلك طي الثوابت وإزالة الكود الميت وتحويلات الصيغة. على عكس المصغرات الأخرى، يجعل مصغر Bun أمر bun build يعمل بشكل أسرع نظرًا لوجود كود أقل للطباعة.
استخدام CLI
تمكين كل التصغير
استخدم العلم --minify لتمكين جميع أوضاع التصغير:
bun build ./index.ts --minify --outfile=out.jsالعلم --minify يمكّن تلقائيًا:
- تصغير المساحات البيضاء
- تصغير الصيغة
- تصغير المعرفات
وضع الإنتاج
العلم --production يمكّن التصغير تلقائيًا:
bun build ./index.ts --production --outfile=out.jsالعلم --production أيضًا:
- يضبط
process.env.NODE_ENVعلىproduction - يمكّن استيراد وتحويل JSX لوضع الإنتاج
تحكم دقيق
يمكنك تمكين أوضاع تصغير محددة بشكل فردي:
# إزالة المساحات البيضاء فقط
bun build ./index.ts --minify-whitespace --outfile=out.js
# تصغير الصيغة فقط
bun build ./index.ts --minify-syntax --outfile=out.js
# تصغير المعرفات فقط
bun build ./index.ts --minify-identifiers --outfile=out.js
# دمج أوضاع محددة
bun build ./index.ts --minify-whitespace --minify-syntax --outfile=out.jsJavaScript API
عند استخدام حزمة Bun برمجيًا، قم بتكوين التصغير من خلال خيار minify:
await Bun.build({
entrypoints: ["./index.ts"],
outdir: "./out",
minify: true, // تمكين كل أوضاع التصغير
});للتحكم الدقيق، مرر كائنًا:
await Bun.build({
entrypoints: ["./index.ts"],
outdir: "./out",
minify: {
whitespace: true,
syntax: true,
identifiers: true,
},
});أوضاع التصغير
يحتوي مصغر Bun على ثلاثة أوضاع مستقلة يمكن تمكينها بشكل منفصل أو مجتمعة.
تصغير المساحات البيضاء (--minify-whitespace)
يزيل جميع المساحات البيضاء والأسطر الجديدة والتنسيق غير الضروري من الإخراج.
تصغير الصيغة (--minify-syntax)
يعيد كتابة صيغة JavaScript إلى أشكال أقصر مكافئة وينفذ طي الثوابت وإزالة الكود الميت وتحسينات أخرى.
تصغير المعرفات (--minify-identifiers)
يعيد تسمية المتغيرات المحلية وأسماء الدوال إلى معرفات أقصر باستخدام التحسين القائم على التكرار.
كل التحويلات
تقصير الحرف البولياني
الوضع: --minify-syntax
يحول الحروف البوليانية إلى تعبيرات أقصر.
true
false!0
!1تحسينات الجبر البولياني
الوضع: --minify-syntax
يبسط التعبيرات البوليانية باستخدام القواعد المنطقية.
!!x
x === true
x && true
x || false
!true
!falsex
x
x
x
!1
!0تقصير undefined
الوضع: --minify-syntax
يستبدل undefined بمكافئ أقصر.
undefined
let x = undefined;void 0
let x=void 0;تحسين مساواة undefined
الوضع: --minify-syntax
يحسن فحوصات المساواة الفضفاضة مع undefined.
x == undefined
x != undefinedx == null
x != nullتقصير Infinity
الوضع: --minify-syntax
يحول Infinity إلى تعبيرات رياضية.
Infinity
-Infinity1/0
-1/0تحسينات typeof
الوضع: --minify-syntax
يحسن مقارنات typeof ويقيم تعبيرات typeof الثابتة.
typeof x === 'undefined'
typeof x !== 'undefined'
typeof require
typeof null
typeof true
typeof 123
typeof "str"
typeof 123ntypeof x>'u'
typeof x<'u'
"function"
"object"
"boolean"
"number"
"string"
"bigint"تنسيق الأرقام
الوضع: --minify-syntax
ينسق الأرقام في التمثيل الأكثر إحكامًا.
10000
100000
1000000
1.0
-42.01e4
1e5
1e6
1
-42طي الثوابت الحسابية
الوضع: --minify-syntax
يقيم العمليات الحسابية في وقت التجميع.
1 + 2
10 - 5
3 * 4
10 / 2
10 % 3
2 ** 33
5
12
5
1
8طي الثوابت الثنائية
الوضع: --minify-syntax
يقيم العمليات الثنائية في وقت التجميع.
5 & 3
5 | 3
5 ^ 3
8 << 2
32 >> 2
~51
7
6
32
8
-6دمج السلاسل
الوضع: --minify-syntax
يجمع حروف السلاسل في وقت التجميع.
"a" + "b"
"x" + 123
"foo" + "bar" + "baz""ab"
"x123"
"foobarbaz"فهرسة السلاسل
الوضع: --minify-syntax
يقيم الوصول إلى أحرف السلاسل في وقت التجميع.
"foo"[2]
"hello"[0]"o"
"h"طي الحرف القالبية
الوضع: --minify-syntax
يقيم الحروف القالبية بتعابير ثابتة.
`a${123}b`
`result: ${5 + 10}`"a123b"
"result: 15"تحويل الحرف القالبية إلى سلسلة
الوضع: --minify-syntax
يحول الحروف القالبية البسيطة إلى سلاسل عادية.
`Hello World`
`Line 1
Line 2`"Hello World"
"Line 1\nLine 2"تحسين علامات اقتباس السلاسل
الوضع: --minify-syntax
يختار حرف علامة الاقتباس الأمثل لتقليل الهروب.
"It's a string"
'He said "hello"'
`Simple string`"It's a string"
'He said "hello"'
"Simple string"دمج نشر المصفوفة
الوضع: --minify-syntax
يدمج عمليات نشر المصفوفة مع المصفوفات الثابتة.
[1, ...[2, 3], 4]
[...[a, b]][1,2,3,4]
[a,b]فهرسة المصفوفة
الوضع: --minify-syntax
يقيم الوصول إلى المصفوفة الثابتة في وقت التجميع.
[x][0]
['a', 'b', 'c'][1]
['a', , 'c'][1]x
'b'
void 0تحسين الوصول إلى الخاصية
الوضع: --minify-syntax
يحول تدوين الأقواس إلى تدوين النقطة عندما يكون ذلك ممكنًا.
obj["property"]
obj["validName"]
obj["123"]
obj["invalid-name"]obj.property
obj.validName
obj["123"]
obj["invalid-name"]طي المقارنة
الوضع: --minify-syntax
يقيم المقارنات الثابتة في وقت التجميع.
3 < 5
5 > 3
3 <= 3
5 >= 6
"a" < "b"!0
!0
!0
!1
!0طي العمليات المنطقية
الوضع: --minify-syntax
يبسط العمليات المنطقية بقيم ثابتة.
true && x
false && x
true || x
false || xx
!1
!0
xطي الاندماج nullish
الوضع: --minify-syntax
يقيم الاندماج nullish بقيم معروفة.
null ?? x
undefined ?? x
42 ?? xx
x
42تبسيط تعبير الفاصلة
الوضع: --minify-syntax
يزيل التعابير الخالية من الآثار الجانبية من تسلسلات الفواصل.
(0, x)
(123, "str", x)x
xطي الشرط الثلاثي
الوضع: --minify-syntax
يقيم التعابير الشرطية بشروط ثابتة.
true ? a : b
false ? a : b
x ? true : false
x ? false : truea
b
x ? !0 : !1
x ? !1 : !0طي التعبير الأحادي
الوضع: --minify-syntax
يبسط العمليات الأحادية.
+123
+"123"
-(-x)
~~x
!!x123
123
123
123
x
~~x
!!x
xإزالة النفي المزدوج
الوضع: --minify-syntax
يزيل النفي المزدوج غير الضروري.
!!x
!!!xx
!xتحسين عبارة if
الوضع: --minify-syntax
يحسن عبارات if بشروط ثابتة.
if (true) x;
if (false) x;
if (x) { a; }
if (x) {} else y;x;
// تم الإزالة
if(x)a;
if(!x)y;إزالة الكود الميت
الوضع: --minify-syntax
يزيل الكود الذي لا يمكن الوصول إليه والكود بدون آثار جانبية.
if (false) {
unreachable();
}
function foo() {
return x;
deadCode();
}function foo(){return x}إزالة الفروع التي لا يمكن الوصول إليها
الوضع: --minify-syntax
يزيل الفروع التي لا يمكن تنفيذها أبدًا.
while (false) {
neverRuns();
}// تم الإزالة بالكاملإزالة الكتل الفارغة
الوضع: --minify-syntax
يزيل الكتل الفارغة والأقواس غير الضرورية.
{ }
if (x) { };
// تم الإزالةفك كتل العبارة الواحدة
الوضع: --minify-syntax
يزيل الأقواس غير الضرورية حول العبارات الواحدة.
if (condition) {
doSomething();
}if(condition)doSomething();دمج قيم enum في TypeScript
الوضع: --minify-syntax
يدمج قيم enum في TypeScript في وقت التجميع.
enum Color { Red, Green, Blue }
const x = Color.Red;const x=0;دعم تعليقات Pure
الوضع: نشط دائمًا
يحترم تعليقات /*@__PURE__*/ لهز الشجرة.
const x = /*@__PURE__*/ expensive();
// إذا لم يتم استخدام x...// تم الإزالة بالكاملإعادة تسمية المعرفات
الوضع: --minify-identifiers
يعيد تسمية المتغيرات المحلية إلى أسماء أقصر بناءً على تكرار الاستخدام.
function calculateSum(firstNumber, secondNumber) {
const result = firstNumber + secondNumber;
return result;
}function a(b,c){const d=b+c;return d}استراتيجية التسمية:
- المعرفات الأكثر استخدامًا تحصل على أقصر الأسماء (a, b, c...)
- أحرف مفردة: a-z (26 اسم)
- أحرف مزدوجة: aa-zz (676 اسم)
- أحرف ثلاثية وما فوق حسب الحاجة
المعرفات المحفوظة:
- كلمات JavaScript المحجوزة والكلمات الرئيسية
- المعرفات العامة
- الصادرات المسماة (للحفاظ على API)
- أسماء CommonJS:
exports،module
إزالة المساحات البيضاء
الوضع: --minify-whitespace
يزيل جميع المساحات البيضاء غير الضرورية.
function add(a, b) {
return a + b;
}
let x = 10;function add(a,b){return a+b;}let x=10;تحسين الفاصلة المنقوطة
الوضع: --minify-whitespace
يدرج الفواصل المنقوطة فقط عند الضرورة.
let a = 1;
let b = 2;
return a + b;let a=1;let b=2;return a+bإزالة مسافات المشغل
الوضع: --minify-whitespace
يزيل المساحات حول المشغلات.
a + b
x = y * z
foo && bar || baza+b
x=y*z
foo&&bar||bazإزالة التعليقات
الوضع: --minify-whitespace
يزيل التعليقات باستثناء تعليقات الترخيص المهمة.
// تم إزالة هذا التعليق
/* وكذلك هذا */
/*! لكن تعليق الترخيص هذا محفوظ */
function test() { /* تعليق مضمن */ }/*! لكن تعليق الترخيص هذا محفوظ */
function test(){}تنسيق الكائنات والمصفوفات
الوضع: --minify-whitespace
يزيل المساحات البيضاء في حرف الكائنات والمصفوفات.
const obj = {
name: "John",
age: 30
};
const arr = [1, 2, 3];const obj={name:"John",age:30};const arr=[1,2,3];تنسيق تدفق التحكم
الوضع: --minify-whitespace
يزيل المساحات البيضاء في هياكل التحكم.
if (condition) {
doSomething();
}
for (let i = 0; i < 10; i++) {
console.log(i);
}if(condition)doSomething();for(let i=0;i<10;i++)console.log(i);تنسيق الدوال
الوضع: --minify-whitespace
يزيل المساحات البيضاء في إعلانات الدوال.
function myFunction(param1, param2) {
return param1 + param2;
}
const arrow = (a, b) => a + b;function myFunction(a,b){return a+b}const arrow=(a,b)=>a+b;تقليل الأقواس
الوضع: نشط دائمًا
يضيف أقواسًا فقط عند الضرورة لأسبقية المشغل.
(a + b) * c
a + (b * c)
((x))(a+b)*c
a+b*c
xتشويه الخصائص
الوضع: --minify-identifiers (مع التكوين)
يعيد تسمية خصائص الكائن إلى أسماء أقصر عند التكوين.
obj.longPropertyNameobj.aطي قيم الحرف القالبية
الوضع: --minify-syntax
يحول القيم التي تم إدراجها غير السلسلة إلى سلاسل ويطويها في الحرف القالبية.
`hello ${123}`
`value: ${true}`
`result: ${null}`
`status: ${undefined}`
`big: ${10n}`"hello 123"
"value: true"
"result: null"
"status: undefined"
"big: 10"طي ثابت طول السلسلة
الوضع: --minify-syntax
يقيم خاصية .length على حروف السلاسل في وقت التجميع.
"hello world".length
"test".length11
4تبسيط استدعاءات المنشئ
الوضع: --minify-syntax
يبسط استدعاءات المنشئ للأنواع المدمجة.
new Object()
new Object(null)
new Object({a: 1})
new Array()
new Array(x, y){}
{}
{a:1}
[]
[x,y]دمج كائن خاصية واحدة
الوضع: --minify-syntax
يدمج الوصول إلى الخاصية للكائنات ذات الخاصية الواحدة.
({fn: () => console.log('hi')}).fn()(() => console.log('hi'))()طي ثابت charCodeAt للسلسلة
الوضع: نشط دائمًا
يقيم charCodeAt() على حروف السلاسل لأحرف ASCII.
"hello".charCodeAt(1)
"A".charCodeAt(0)101
65مساواة Void 0 إلى مساواة null
الوضع: --minify-syntax
يحول فحوصات المساواة الفضفاضة مع void 0 إلى null لأنها مكافئة.
x == void 0
x != void 0x == null
x != nullتحسين مشغل النفي
الوضع: --minify-syntax
ينقل مشغل النفي عبر تعابير الفاصلة.
-(a, b)
-(x, y, z)a,-b
x,y,-zدمج خصائص Import.meta
الوضع: وضع الحزمة
يدمج خصائص import.meta في وقت البناء عندما تكون القيم معروفة.
import.meta.dir
import.meta.file
import.meta.path
import.meta.url"/path/to/directory"
"filename.js"
"/full/path/to/file.js"
"file:///full/path/to/file.js"دمج إعلانات المتغيرات
الوضع: --minify-syntax
يدمج إعلانات المتغيرات المتجاورة من نفس النوع.
let a = 1;
let b = 2;
const c = 3;
const d = 4;let a=1,b=2;
const c=3,d=4;دمج عبارات التعبير
الوضع: --minify-syntax
يدمج عبارات التعبير المتجاورة باستخدام مشغل الفاصلة.
console.log(1);
console.log(2);
console.log(3);console.log(1),console.log(2),console.log(3);دمج عبارات الإرجاع
الوضع: --minify-syntax
يدمج التعابير قبل الإرجاع باستخدام مشغل الفاصلة.
console.log(x);
return y;return console.log(x),y;دمج عبارات الرمي
الوضع: --minify-syntax
يدمج التعابير قبل الرمي باستخدام مشغل الفاصلة.
console.log(x);
throw new Error();throw(console.log(x),new Error());دمج enum عبر الوحدات في TypeScript
الوضع: --minify-syntax (وضع الحزمة)
يدمج قيم enum عبر حدود الوحدات.
// lib.ts
export enum Color { Red, Green, Blue }
// الإدخال (main.ts)
import { Color } from './lib';
const x = Color.Red;const x=0;دمج enum الخاصية المحسوبة
الوضع: --minify-syntax
يدمج قيم enum المستخدمة كخصائص كائن محسوبة.
enum Keys { FOO = 'foo' }
const obj = { [Keys.FOO]: value }const obj={foo:value}رقم السلسلة إلى فهرس رقمي
الوضع: --minify-syntax
يحول الوصول إلى خاصية السلسلة الرقمية إلى فهرس رقمي.
obj["0"]
arr["5"]obj[0]
arr[5]تقصير جسم دالة السهم
الوضع: نشط دائمًا
يستخدم صيغة جسم التعبير عندما تُرجع دالة السهم قيمة فقط.
() => { return x; }
(a) => { return a + 1; }() => x
a => a + 1اختصار خاصية الكائن
الوضع: نشط دائمًا
يستخدم صيغة الاختصار عندما يتطابق اسم الخاصية ومعرف القيمة.
{ x: x, y: y }
{ name: name, age: age }{ x, y }
{ name, age }اختصار الأسلوب
الوضع: نشط دائمًا
يستخدم صيغة اختصار الأسلوب في حرف الكائنات.
{
foo: function() {},
bar: async function() {}
}{
foo() {},
async bar() {}
}إسقاط عبارات debugger
الوضع: --drop=debugger
يزيل عبارات debugger من الكود.
function test() {
debugger;
return x;
}function test(){return x}إسقاط استدعاءات console
الوضع: --drop=console
يزيل جميع استدعاءات أساليب console.* من الكود.
console.log("debug");
console.warn("warning");
x = console.error("error");void 0;
void 0;
x=void 0;إسقاط استدعاءات الدوال المخصصة
الوضع: --drop=<name>
يزيل استدعاءات الدوال أو الأساليب العامة المحددة.
assert(condition);
obj.assert(test);void 0;
void 0;Keep Names
عند تصغير المعرفات، قد ترغب في الحفاظ على أسماء الدوال والفئات الأصلية لأغراض التصحيح. استخدم العلم --keep-names:
bun build ./index.ts --minify --keep-names --outfile=out.jsأو في JavaScript API:
await Bun.build({
entrypoints: ["./index.ts"],
outdir: "./out",
minify: {
identifiers: true,
keepNames: true,
},
});هذا يحافظ على خاصية .name على الدوال والفئات مع الاستمرار في تصغير أسماء المعرفات الفعلية في الكود.
مثال مجمع
استخدام جميع أوضاع التصغير الثلاثة معًا:
const myVariable = 42;
const myFunction = () => {
const isValid = true;
const result = undefined;
return isValid ? myVariable : result;
};
const output = myFunction();// الإخراج مع --minify (49 بايت، تخفيض 69%)
const a=42,b=()=>{const c=!0,d=void 0;return c?a:d},e=b();متى تستخدم التصغير
استخدم --minify لـ:
- حزم الإنتاج
- تقليل تكاليف عرض النطاق الترددي لـ CDN
- تحسين أوقات تحميل الصفحة
استخدم الأوضاع الفردية لـ:
--minify-whitespace: تقليل سريع للحجم بدون تغييرات دلالية--minify-syntax: إخراج أصغر مع الحفاظ على معرفات قابلة للقراءة للتصحيح--minify-identifiers: أقصى تقليل للحجم (ادمج مع--keep-namesلتتبعات أفضل للمكدس)
تجنب التصغير لـ:
- Builds التطوير (أصعب في التصحيح)
- عندما تحتاج إلى رسائل خطأ قابلة للقراءة
- المكتبات حيث قد يقرأ المستهلكون المصدر