Skip to content

تتضمن Bun مصغر JavaScript و TypeScript سريع يمكنه تقليل أحجام الحزم بنسبة 80% أو أكثر (اعتمادًا على قاعدة الكود) وجعل كود الإخراج يعمل بشكل أسرع. ينفذ المصغر عشرات التحسينات بما في ذلك طي الثوابت وإزالة الكود الميت وتحويلات الصيغة. على عكس المصغرات الأخرى، يجعل مصغر Bun أمر bun build يعمل بشكل أسرع نظرًا لوجود كود أقل للطباعة.

استخدام CLI

تمكين كل التصغير

استخدم العلم --minify لتمكين جميع أوضاع التصغير:

bash
bun build ./index.ts --minify --outfile=out.js

العلم --minify يمكّن تلقائيًا:

  • تصغير المساحات البيضاء
  • تصغير الصيغة
  • تصغير المعرفات

وضع الإنتاج

العلم --production يمكّن التصغير تلقائيًا:

bash
bun build ./index.ts --production --outfile=out.js

العلم --production أيضًا:

  • يضبط process.env.NODE_ENV على production
  • يمكّن استيراد وتحويل JSX لوضع الإنتاج

تحكم دقيق

يمكنك تمكين أوضاع تصغير محددة بشكل فردي:

bash
# إزالة المساحات البيضاء فقط
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.js

JavaScript API

عند استخدام حزمة Bun برمجيًا، قم بتكوين التصغير من خلال خيار minify:

ts
await Bun.build({
  entrypoints: ["./index.ts"],
  outdir: "./out",
  minify: true, // تمكين كل أوضاع التصغير
});

للتحكم الدقيق، مرر كائنًا:

ts
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

يحول الحروف البوليانية إلى تعبيرات أقصر.

ts
true
false
js
!0
!1

تحسينات الجبر البولياني

الوضع: --minify-syntax

يبسط التعبيرات البوليانية باستخدام القواعد المنطقية.

ts
!!x
x === true
x && true
x || false
!true
!false
js
x
x
x
x
!1
!0

تقصير undefined

الوضع: --minify-syntax

يستبدل undefined بمكافئ أقصر.

ts
undefined
let x = undefined;
js
void 0
let x=void 0;

تحسين مساواة undefined

الوضع: --minify-syntax

يحسن فحوصات المساواة الفضفاضة مع undefined.

ts
x == undefined
x != undefined
js
x == null
x != null

تقصير Infinity

الوضع: --minify-syntax

يحول Infinity إلى تعبيرات رياضية.

ts
Infinity
-Infinity
js
1/0
-1/0

تحسينات typeof

الوضع: --minify-syntax

يحسن مقارنات typeof ويقيم تعبيرات typeof الثابتة.

ts
typeof x === 'undefined'
typeof x !== 'undefined'
typeof require
typeof null
typeof true
typeof 123
typeof "str"
typeof 123n
js
typeof x>'u'
typeof x<'u'
"function"
"object"
"boolean"
"number"
"string"
"bigint"

تنسيق الأرقام

الوضع: --minify-syntax

ينسق الأرقام في التمثيل الأكثر إحكامًا.

ts
10000
100000
1000000
1.0
-42.0
js
1e4
1e5
1e6
1
-42

طي الثوابت الحسابية

الوضع: --minify-syntax

يقيم العمليات الحسابية في وقت التجميع.

ts
1 + 2
10 - 5
3 * 4
10 / 2
10 % 3
2 ** 3
js
3
5
12
5
1
8

طي الثوابت الثنائية

الوضع: --minify-syntax

يقيم العمليات الثنائية في وقت التجميع.

ts
5 & 3
5 | 3
5 ^ 3
8 << 2
32 >> 2
~5
js
1
7
6
32
8
-6

دمج السلاسل

الوضع: --minify-syntax

يجمع حروف السلاسل في وقت التجميع.

ts
"a" + "b"
"x" + 123
"foo" + "bar" + "baz"
js
"ab"
"x123"
"foobarbaz"

فهرسة السلاسل

الوضع: --minify-syntax

يقيم الوصول إلى أحرف السلاسل في وقت التجميع.

ts
"foo"[2]
"hello"[0]
js
"o"
"h"

طي الحرف القالبية

الوضع: --minify-syntax

يقيم الحروف القالبية بتعابير ثابتة.

ts
`a${123}b`
`result: ${5 + 10}`
js
"a123b"
"result: 15"

تحويل الحرف القالبية إلى سلسلة

الوضع: --minify-syntax

يحول الحروف القالبية البسيطة إلى سلاسل عادية.

ts
`Hello World`
`Line 1
Line 2`
js
"Hello World"
"Line 1\nLine 2"

تحسين علامات اقتباس السلاسل

الوضع: --minify-syntax

يختار حرف علامة الاقتباس الأمثل لتقليل الهروب.

ts
"It's a string"
'He said "hello"'
`Simple string`
js
"It's a string"
'He said "hello"'
"Simple string"

دمج نشر المصفوفة

الوضع: --minify-syntax

يدمج عمليات نشر المصفوفة مع المصفوفات الثابتة.

ts
[1, ...[2, 3], 4]
[...[a, b]]
js
[1,2,3,4]
[a,b]

فهرسة المصفوفة

الوضع: --minify-syntax

يقيم الوصول إلى المصفوفة الثابتة في وقت التجميع.

ts
[x][0]
['a', 'b', 'c'][1]
['a', , 'c'][1]
js
x
'b'
void 0

تحسين الوصول إلى الخاصية

الوضع: --minify-syntax

يحول تدوين الأقواس إلى تدوين النقطة عندما يكون ذلك ممكنًا.

ts
obj["property"]
obj["validName"]
obj["123"]
obj["invalid-name"]
js
obj.property
obj.validName
obj["123"]
obj["invalid-name"]

طي المقارنة

الوضع: --minify-syntax

يقيم المقارنات الثابتة في وقت التجميع.

ts
3 < 5
5 > 3
3 <= 3
5 >= 6
"a" < "b"
js
!0
!0
!0
!1
!0

طي العمليات المنطقية

الوضع: --minify-syntax

يبسط العمليات المنطقية بقيم ثابتة.

ts
true && x
false && x
true || x
false || x
js
x
!1
!0
x

طي الاندماج nullish

الوضع: --minify-syntax

يقيم الاندماج nullish بقيم معروفة.

ts
null ?? x
undefined ?? x
42 ?? x
js
x
x
42

تبسيط تعبير الفاصلة

الوضع: --minify-syntax

يزيل التعابير الخالية من الآثار الجانبية من تسلسلات الفواصل.

ts
(0, x)
(123, "str", x)
js
x
x

طي الشرط الثلاثي

الوضع: --minify-syntax

يقيم التعابير الشرطية بشروط ثابتة.

ts
true ? a : b
false ? a : b
x ? true : false
x ? false : true
js
a
b
x ? !0 : !1
x ? !1 : !0

طي التعبير الأحادي

الوضع: --minify-syntax

يبسط العمليات الأحادية.

ts
+123
+"123"
-(-x)
~~x
!!x
js
123
123
123
123
x
~~x
!!x
x

إزالة النفي المزدوج

الوضع: --minify-syntax

يزيل النفي المزدوج غير الضروري.

ts
!!x
!!!x
js
x
!x

تحسين عبارة if

الوضع: --minify-syntax

يحسن عبارات if بشروط ثابتة.

ts
if (true) x;
if (false) x;
if (x) { a; }
if (x) {} else y;
js
x;
// تم الإزالة
if(x)a;
if(!x)y;

إزالة الكود الميت

الوضع: --minify-syntax

يزيل الكود الذي لا يمكن الوصول إليه والكود بدون آثار جانبية.

ts
if (false) {
  unreachable();
}
function foo() {
  return x;
  deadCode();
}
js
function foo(){return x}

إزالة الفروع التي لا يمكن الوصول إليها

الوضع: --minify-syntax

يزيل الفروع التي لا يمكن تنفيذها أبدًا.

ts
while (false) {
  neverRuns();
}
js
// تم الإزالة بالكامل

إزالة الكتل الفارغة

الوضع: --minify-syntax

يزيل الكتل الفارغة والأقواس غير الضرورية.

ts
{ }
if (x) { }
js
;
// تم الإزالة

فك كتل العبارة الواحدة

الوضع: --minify-syntax

يزيل الأقواس غير الضرورية حول العبارات الواحدة.

ts
if (condition) {
  doSomething();
}
js
if(condition)doSomething();

دمج قيم enum في TypeScript

الوضع: --minify-syntax

يدمج قيم enum في TypeScript في وقت التجميع.

ts
enum Color { Red, Green, Blue }
const x = Color.Red;
js
const x=0;

دعم تعليقات Pure

الوضع: نشط دائمًا

يحترم تعليقات /*@__PURE__*/ لهز الشجرة.

ts
const x = /*@__PURE__*/ expensive();
// إذا لم يتم استخدام x...
js
// تم الإزالة بالكامل

إعادة تسمية المعرفات

الوضع: --minify-identifiers

يعيد تسمية المتغيرات المحلية إلى أسماء أقصر بناءً على تكرار الاستخدام.

ts
function calculateSum(firstNumber, secondNumber) {
  const result = firstNumber + secondNumber;
  return result;
}
js
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

يزيل جميع المساحات البيضاء غير الضرورية.

ts
function add(a, b) {
    return a + b;
}
let x = 10;
js
function add(a,b){return a+b;}let x=10;

تحسين الفاصلة المنقوطة

الوضع: --minify-whitespace

يدرج الفواصل المنقوطة فقط عند الضرورة.

ts
let a = 1;
let b = 2;
return a + b;
js
let a=1;let b=2;return a+b

إزالة مسافات المشغل

الوضع: --minify-whitespace

يزيل المساحات حول المشغلات.

ts
a + b
x = y * z
foo && bar || baz
js
a+b
x=y*z
foo&&bar||baz

إزالة التعليقات

الوضع: --minify-whitespace

يزيل التعليقات باستثناء تعليقات الترخيص المهمة.

ts
// تم إزالة هذا التعليق
/* وكذلك هذا */
/*! لكن تعليق الترخيص هذا محفوظ */
function test() { /* تعليق مضمن */ }
js
/*! لكن تعليق الترخيص هذا محفوظ */
function test(){}

تنسيق الكائنات والمصفوفات

الوضع: --minify-whitespace

يزيل المساحات البيضاء في حرف الكائنات والمصفوفات.

ts
const obj = {
    name: "John",
    age: 30
};
const arr = [1, 2, 3];
js
const obj={name:"John",age:30};const arr=[1,2,3];

تنسيق تدفق التحكم

الوضع: --minify-whitespace

يزيل المساحات البيضاء في هياكل التحكم.

ts
if (condition) {
    doSomething();
}
for (let i = 0; i < 10; i++) {
    console.log(i);
}
js
if(condition)doSomething();for(let i=0;i<10;i++)console.log(i);

تنسيق الدوال

الوضع: --minify-whitespace

يزيل المساحات البيضاء في إعلانات الدوال.

ts
function myFunction(param1, param2) {
    return param1 + param2;
}
const arrow = (a, b) => a + b;
js
function myFunction(a,b){return a+b}const arrow=(a,b)=>a+b;

تقليل الأقواس

الوضع: نشط دائمًا

يضيف أقواسًا فقط عند الضرورة لأسبقية المشغل.

ts
(a + b) * c
a + (b * c)
((x))
js
(a+b)*c
a+b*c
x

تشويه الخصائص

الوضع: --minify-identifiers (مع التكوين)

يعيد تسمية خصائص الكائن إلى أسماء أقصر عند التكوين.

ts
obj.longPropertyName
js
obj.a

طي قيم الحرف القالبية

الوضع: --minify-syntax

يحول القيم التي تم إدراجها غير السلسلة إلى سلاسل ويطويها في الحرف القالبية.

ts
`hello ${123}`
`value: ${true}`
`result: ${null}`
`status: ${undefined}`
`big: ${10n}`
js
"hello 123"
"value: true"
"result: null"
"status: undefined"
"big: 10"

طي ثابت طول السلسلة

الوضع: --minify-syntax

يقيم خاصية .length على حروف السلاسل في وقت التجميع.

ts
"hello world".length
"test".length
js
11
4

تبسيط استدعاءات المنشئ

الوضع: --minify-syntax

يبسط استدعاءات المنشئ للأنواع المدمجة.

ts
new Object()
new Object(null)
new Object({a: 1})
new Array()
new Array(x, y)
js
{}
{}
{a:1}
[]
[x,y]

دمج كائن خاصية واحدة

الوضع: --minify-syntax

يدمج الوصول إلى الخاصية للكائنات ذات الخاصية الواحدة.

ts
({fn: () => console.log('hi')}).fn()
js
(() => console.log('hi'))()

طي ثابت charCodeAt للسلسلة

الوضع: نشط دائمًا

يقيم charCodeAt() على حروف السلاسل لأحرف ASCII.

ts
"hello".charCodeAt(1)
"A".charCodeAt(0)
js
101
65

مساواة Void 0 إلى مساواة null

الوضع: --minify-syntax

يحول فحوصات المساواة الفضفاضة مع void 0 إلى null لأنها مكافئة.

ts
x == void 0
x != void 0
js
x == null
x != null

تحسين مشغل النفي

الوضع: --minify-syntax

ينقل مشغل النفي عبر تعابير الفاصلة.

ts
-(a, b)
-(x, y, z)
js
a,-b
x,y,-z

دمج خصائص Import.meta

الوضع: وضع الحزمة

يدمج خصائص import.meta في وقت البناء عندما تكون القيم معروفة.

ts
import.meta.dir
import.meta.file
import.meta.path
import.meta.url
js
"/path/to/directory"
"filename.js"
"/full/path/to/file.js"
"file:///full/path/to/file.js"

دمج إعلانات المتغيرات

الوضع: --minify-syntax

يدمج إعلانات المتغيرات المتجاورة من نفس النوع.

ts
let a = 1;
let b = 2;
const c = 3;
const d = 4;
js
let a=1,b=2;
const c=3,d=4;

دمج عبارات التعبير

الوضع: --minify-syntax

يدمج عبارات التعبير المتجاورة باستخدام مشغل الفاصلة.

ts
console.log(1);
console.log(2);
console.log(3);
js
console.log(1),console.log(2),console.log(3);

دمج عبارات الإرجاع

الوضع: --minify-syntax

يدمج التعابير قبل الإرجاع باستخدام مشغل الفاصلة.

ts
console.log(x);
return y;
js
return console.log(x),y;

دمج عبارات الرمي

الوضع: --minify-syntax

يدمج التعابير قبل الرمي باستخدام مشغل الفاصلة.

ts
console.log(x);
throw new Error();
js
throw(console.log(x),new Error());

دمج enum عبر الوحدات في TypeScript

الوضع: --minify-syntax (وضع الحزمة)

يدمج قيم enum عبر حدود الوحدات.

ts
// lib.ts
export enum Color { Red, Green, Blue }

// الإدخال (main.ts)
import { Color } from './lib';
const x = Color.Red;
js
const x=0;

دمج enum الخاصية المحسوبة

الوضع: --minify-syntax

يدمج قيم enum المستخدمة كخصائص كائن محسوبة.

ts
enum Keys { FOO = 'foo' }
const obj = { [Keys.FOO]: value }
js
const obj={foo:value}

رقم السلسلة إلى فهرس رقمي

الوضع: --minify-syntax

يحول الوصول إلى خاصية السلسلة الرقمية إلى فهرس رقمي.

ts
obj["0"]
arr["5"]
js
obj[0]
arr[5]

تقصير جسم دالة السهم

الوضع: نشط دائمًا

يستخدم صيغة جسم التعبير عندما تُرجع دالة السهم قيمة فقط.

ts
() => { return x; }
(a) => { return a + 1; }
js
() => x
a => a + 1

اختصار خاصية الكائن

الوضع: نشط دائمًا

يستخدم صيغة الاختصار عندما يتطابق اسم الخاصية ومعرف القيمة.

ts
{ x: x, y: y }
{ name: name, age: age }
js
{ x, y }
{ name, age }

اختصار الأسلوب

الوضع: نشط دائمًا

يستخدم صيغة اختصار الأسلوب في حرف الكائنات.

ts
{
  foo: function() {},
  bar: async function() {}
}
js
{
  foo() {},
  async bar() {}
}

إسقاط عبارات debugger

الوضع: --drop=debugger

يزيل عبارات debugger من الكود.

ts
function test() {
  debugger;
  return x;
}
js
function test(){return x}

إسقاط استدعاءات console

الوضع: --drop=console

يزيل جميع استدعاءات أساليب console.* من الكود.

ts
console.log("debug");
console.warn("warning");
x = console.error("error");
js
void 0;
void 0;
x=void 0;

إسقاط استدعاءات الدوال المخصصة

الوضع: --drop=<name>

يزيل استدعاءات الدوال أو الأساليب العامة المحددة.

ts
assert(condition);
obj.assert(test);
js
void 0;
void 0;

Keep Names

عند تصغير المعرفات، قد ترغب في الحفاظ على أسماء الدوال والفئات الأصلية لأغراض التصحيح. استخدم العلم --keep-names:

bash
bun build ./index.ts --minify --keep-names --outfile=out.js

أو في JavaScript API:

ts
await Bun.build({
  entrypoints: ["./index.ts"],
  outdir: "./out",
  minify: {
    identifiers: true,
    keepNames: true,
  },
});

هذا يحافظ على خاصية .name على الدوال والفئات مع الاستمرار في تصغير أسماء المعرفات الفعلية في الكود.

مثال مجمع

استخدام جميع أوضاع التصغير الثلاثة معًا:

ts
const myVariable = 42;

const myFunction = () => {
  const isValid = true;
  const result = undefined;
  return isValid ? myVariable : result;
};

const output = myFunction();
js
// الإخراج مع --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 التطوير (أصعب في التصحيح)
  • عندما تحتاج إلى رسائل خطأ قابلة للقراءة
  • المكتبات حيث قد يقرأ المستهلكون المصدر

Bun بواسطة www.bunjs.com.cn تحرير