The Closure Compiler هو أداة لجعل تنزيل JavaScript وتشغيله بشكل أسرع. إنه مترجم حقيقي لـ JavaScript. بدلاً من التجميع من لغة المصدر إلى رمز الجهاز ، فإنه يجمع من JavaScript إلى جافا سكريبت أفضل. إنه يوسع جافا سكريبت ، ويحللها ، ويزيل الكود الميت ويعيد كتابة ما تبقى. كما أنه يتحقق من بناء الجملة والمراجع والأنواع المتغيرة ، ويحذر من عيوب JavaScript الشائعة.
كانت أوضاع التجميع غير ADVANCED
دائمًا فكرة لاحقة وقد قمنا بإهمال تلك الأوضاع. نعتقد أن الأدوات الأخرى تؤدي بشكل مماثل للأوضاع غير ADVANCED
وأن يتم دمجها بشكل أفضل في النظام الإيكولوجي JS الأوسع.
برنامج التحويل البرمجي الإغلاق غير مناسب لـ JavaScript التعسفي. للحصول على الوضع ADVANCED
لإنشاء JavaScript العاملة ، يجب كتابة رمز الإدخال JS مع وضع الإغلاق في الاعتبار.
برنامج التحويل البرمجي الإغلاق هو محسن "عالم كامل". وتتوقع أن ترى مباشرة أو على الأقل تلقي معلومات حول كل استخدام ممكن لكل متغير عالمي أو مصدير وكل اسم خاصية.
ستقوم بإزالة المتغيرات والخصائص بقوة وإعادة تسميتها لجعل رمز الإخراج صغيرًا قدر الإمكان. سيؤدي ذلك إلى مكسورة الإخراج JS ، إذا كانت استخدامات المتغيرات أو الخصائص العالمية مخفية منه.
على الرغم من أنه يمكن للمرء أن يكتب ملفات خارجية مخصصة لإخبار المترجم بترك بعض الأسماء دون تغيير حتى يمكن الوصول إليها بأمان بواسطة رمز ليس جزءًا من التجميع ، إلا أن هذا غالبًا ما يكون مملاً.
تتطلب إعادة تسمية خاصية Closure Compiler للوصول باستمرار إلى خاصية مع obj[p]
أو obj.propName
، ولكن ليس كلاهما.
عند الوصول إلى خاصية ذات أقواس مربعة (على سبيل المثال obj[p]
) أو باستخدام طريقة أخرى غير مباشرة أخرى مثل let {p} = obj;
هذا يخفي الاسم الحرفي للممتلكات التي يتم الرجوع إليها من المترجم. لا يمكن أن يعرف ما إذا كان obj.propName
يشير إلى نفس خاصية obj[p]
. في بعض الحالات ، ستلاحظ هذه المشكلة وتوقف التجميع بخطأ. في حالات أخرى ، سيتم إعادة تسمية propName
إلى شيء أقصر ، دون ملاحظة هذه المشكلة ، مما يؤدي إلى كسر رمز JS.
يدخل برنامج التحويل البرمجي الإغلاق بقوة المتغيرات العالمية وسلاسل الأسماء الخاصة بأسماء العقارات على المتغيرات العالمية (على سبيل المثال myFoo.some.sub.property
-> myFoo$some$sub$property
) ، لجعل التفكير حولها أسهل لاكتشاف الكود غير المستخدم.
إنه يحاول إما التراجع عن القيام بذلك أو التوقف عن طريق الخطأ عند القيام بذلك ، سيولد مخرجات JS المكسورة ، ولكن هناك حالات تفشل فيها في التعرف على المشكلة وتوليد JS المكسور ببساطة دون سابق إنذار. من المرجح أن يحدث هذا في الكود الذي لم يكتب صراحة مع وضع برنامج التحويل البرمجي الإغلاق في الاعتبار.
يفترض برنامج التحويل البرمجي الإغلاق والخارجي الذي يستخدمه افتراضيًا أن البيئة المستهدفة هي نافذة متصفح ويب.
يتم دعم عمال الويب أيضًا ، ولكن من المحتمل أن يفشل المترجم في تحذيرك إذا حاولت استخدام الميزات غير المتاحة فعليًا لعامل الويب.
تمت إضافة بعض ملفات وميزات Externs إلى إغلاق برنامج التحويل البرمجي لدعم بيئة NodeJS ، لكنها ليست مدعومة بنشاط ولم تعمل بشكل جيد للغاية.
JavaScript التي لا تستخدم goog.module()
و goog.require()
من base.js
لإعلان وحدات الاستخدام ليست مدعومة بشكل جيد.
لم يكن بناء جملة import
export
ECMASCRIPT حتى عام 2015. طور مترجم الإغلاق closure-library
وسائلهما الخاصة لإعلان الوحدات النمطية واستخدامها ، وهذا يظل الطريقة الوحيدة المدعومة جيدًا لتحديد الوحدات النمطية.
يقوم المترجم بتنفيذ بعض الفهم لوحدات ECMASCRIPT ، لكن تغيير مشاريع Google لاستخدام بناء الجملة الأحدث لم يقدم أبدًا فائدة تستحق تكلفة التغيير. يستخدم رمز TypeScript من Google وحدات ECMASCRIPT ، ولكن يتم تحويلها إلى بناء جملة goog.module()
قبل أن يراها الإغلاق. لذلك ، فإن دعم وحدات ECMAScript بشكل فعال غير مستخدم داخل Google. هذا يعني أننا من غير المرجح أن نلاحظ أو إصلاح الأخطاء في دعم وحدات ECMASCRIPT.
تمت إضافة دعم لوحدات CommonJS كما تم إضافة الإدخال في الماضي ، ولكن لا يتم استخدامه داخل Google ، ومن المرجح أن تتم إزالته بالكامل في وقت ما في عام 2024.
يتم استخدام برنامج التحويل البرمجي الإغلاق من قبل مشاريع Google إلى:
تقليل حجم رمز تطبيقات JavaScript الكبيرة جدًا
تحقق من رمز JS للحصول على الأخطاء وللتوافق مع أفضل الممارسات الخاصة بالمشروع و/أو المشروع.
حدد الرسائل المرئية للمستخدم بطريقة تجعل من الممكن استبدالها بالإصدارات المترجمة لإنشاء إصدارات موضعية من التطبيق.
Transpile أحدث ميزات JS في نموذج سيتم تشغيله على المتصفحات التي تفتقر إلى الدعم لتلك الميزات.
قم بتقسيم تطبيق الإخراج إلى أجزاء قد يتم تحميلها بشكل فردي حسب الحاجة.
ملاحظة: هذه القطع هي البرامج النصية JavaScript العادية. أنها لا تستخدم بناء جملة import
export
ECMASCRIPT.
لتحقيق هذه الأهداف ، يضع برنامج التحويل البرمجي لإغلاق العديد من القيود المفروضة على مدخلاته:
استخدم goog.module()
و goog.require()
لإعلان الوحدات النمطية واستخدامها.
لا يتم الحفاظ على دعم بناء جملة import
export
المضافة في ES6.
استخدم التعليقات التوضيحية في التعليقات لإعلان معلومات النوع وتوفير المعلومات التي يحتاجها المترجم لتجنب كسر بعض أنماط الكود (على سبيل المثال @nocollapse
و @noinline
).
إما استخدام DOT-Access فقط (EG object.property
) أو استخدم فقط الوصول الديناميكي (EG object[propertyName]
أو Object.keys(object)
) للوصول إلى خصائص نوع كائن معين.
سيخفي خلط هذه بعض استخدامات خاصية من المترجم ، مما يؤدي إلى كسر رمز الإخراج عند إعادة تسمية الخاصية.
بشكل عام ، يتوقع المترجم رؤية تطبيق كامل كجمهور واحد. يجب أن يتم إنشاء واجهات بعناية وبصحة من أجل السماح بالترتيب مع التعليمات البرمجية خارج وحدة التجميع.
يفترض المترجم أنه يمكن أن يرى جميع استخدامات جميع المتغيرات والخصائص وسيقوم بإعادة تسميتها بحرية أو إزالتها إذا ظهرت غير مستخدمة.
استخدم ملفات Externs لإبلاغ المترجم بأي متغيرات أو خصائص يجب عدم إزالتها أو إعادة تسميتها.
هناك ملفات خارجية افتراضية تعلن عن JS و DOM Global APIs القياسية. تكون المزيد من ملفات Externs ضرورية إذا كنت تستخدم واجهات برمجة التطبيقات الأقل شيوعًا أو تتوقع أن تصل بعض رمز JavaScript الخارجي إلى واجهة برمجة التطبيقات في الكود الذي تقوم بتجميعه.
أسهل طريقة لتثبيت المترجم مع NPM أو الغزل:
yarn global add google-closure-compiler
# OR
npm i -g google-closure-compiler
سيقوم مدير الحزمة بربط الثنائي لك ، ويمكنك الوصول إلى المترجم بـ:
google-closure-compiler
هذا يبدأ المترجم في الوضع التفاعلي. يكتب:
var x = 17 + 25 ;
اضغط على Enter
، ثم Ctrl+Z
(على Windows) أو Ctrl+D
(على Mac/Linux) ، ثم Enter
مرة أخرى. سوف يستجيب المترجم مع الإخراج المترجم (باستخدام الوضع SIMPLE
افتراضيًا):
var x = 42 ;
يتوفر إصدار مُجسد مسبقًا للمترجم عبر Maven.
يحتوي برنامج الإغلاق على العديد من الخيارات لقراءة الإدخال من ملف ، وكتابة الإخراج إلى ملف ، والتحقق من التعليمات البرمجية الخاصة بك ، وتشغيل التحسينات. فيما يلي مثال بسيط على ضغط برنامج JS:
google-closure-compiler --js file.js --js_output_file file.out.js
نحصل على أقصى استفادة من المترجم إذا أعطيناه كل رمز المصدر (انظر تجميع البرامج النصية المتعددة) ، مما يسمح لنا باستخدام التحسينات ADVANCED
:
google-closure-compiler -O ADVANCED rollup.js --js_output_file rollup.min.js
ملاحظة: الإخراج أدناه هو مجرد مثال ولا يحديث. يتم تحديث صفحة الأعلام والخيارات wiki خلال كل إصدار.
لرؤية جميع خيارات المترجم ، اكتب:
google-closure-compiler --help
--flag | وصف |
---|---|
--compilation_level (-O) | يحدد مستوى التجميع للاستخدام. الخيارات: BUNDLE ، WHITESPACE_ONLY ، SIMPLE (افتراضي) ، ADVANCED |
--env | يحدد مجموعة من الخارجية المدمجة للتحميل. الخيارات: BROWSER ، CUSTOM . الإعدادات الافتراضية BROWSER . |
--externs | الملف الذي يحتوي على جافا سكريبت الخارجي. يمكنك تحديد متعدد |
--js | اسم ملف JavaScript. يمكنك تحديد متعددة. اسم العلامة اختياري ، لأنه يتم تفسير args على أنها ملفات افتراضيًا. يمكنك أيضًا استخدام أنماط كروي على طراز الحد الأدنى. على سبيل المثال ، استخدم --js='**.js' --js='!**_test.js' _test.js |
--js_output_file | اسم الملف الأساسي. إذا لم يتم تحديدها ، يتم كتابة الإخراج إلى stdout. |
--language_in | يحدد المواصفات اللغوية التي يجب أن تتوافق مع مصادر الإدخال. الخيارات: ECMASCRIPT3 ، ECMASCRIPT5 ، ECMASCRIPT5_STRICT ، ECMASCRIPT_2015 ، ECMASCRIPT_2016 ، ECMASCRIPT_2017 ، ECMASCRIPT_2018 ، ECMASCRIPT_2019 ، STABLE ، ECMASCRIPT_NEXT |
--language_out | يحدد المواصفات اللغوية التي يجب أن تتوافق بها الإخراج. الخيارات: ECMASCRIPT3 ، ECMASCRIPT5 ، ECMASCRIPT5_STRICT ، ECMASCRIPT_2015 ، ECMASCRIPT_2016 ، ECMASCRIPT_2017 ، ECMASCRIPT_2018 ، ECMASCRIPT_2019 ، STABLE |
--warning_level (-W) | يحدد مستوى التحذير للاستخدام. الخيارات: QUIET ، DEFAULT ، VERBOSE |
يمكنك الوصول إلى المترجم في برنامج JS عن طريق استيراد google-closure-compiler
:
import closureCompiler from 'google-closure-compiler' ;
const { compiler } = closureCompiler ;
new compiler ( {
js : 'file-one.js' ,
compilation_level : 'ADVANCED'
} ) ;
ستوفر هذه الحزمة وصولًا برمجيًا إلى Graal Binary الأصلي في معظم الحالات ، وسوف يعود إلى إصدار Java خلاف ذلك.
إذا كان لديك نصوص متعددة ، فيجب عليك تجميعها جميعًا مع أمر ترجمة واحد.
google-closure-compiler in1.js in2.js in3.js --js_output_file out.js
يمكنك أيضًا استخدام كرات الحد الأدنى على طراز الحد الأدنى.
# Recursively include all js files in subdirs
google-closure-compiler ' src/**.js ' --js_output_file out.js
# Recursively include all js files in subdirs, excluding test files.
# Use single-quotes, so that bash doesn't try to expand the '!'
google-closure-compiler ' src/**.js ' ' !**_test.js ' --js_output_file out.js
سيقوم برنامج التحويل البرمجي الإغلاق بتسلسل الملفات بالترتيب الذي تم تمريره في سطر الأوامر.
إذا كنت تستخدم الكرات أو العديد من الملفات ، فقد تبدأ في مواجهة مشاكل في إدارة التبعيات بين البرامج النصية. في هذه الحالة ، يجب عليك استخدام lib/base.js المضمّن التي توفر وظائف لفرض التبعيات بين البرامج النصية (أي goog.module
و goog.require
). سيعيد إغلاق برنامج التحويل البرمجي إعادة طلب المدخلات تلقائيًا.
يتم إصدار الإغلاق المترجم باستخدام lib/base.js الذي يوفر وظائف JavaScript والمتغيرات التي تعمل كحوام بدائية تتيح بعض ميزات المترجم الإغلاق. هذا الملف هو مشتق لـ Base.js المسمى بشكل متطابق في مكتبة الإغلاق التي ستصبح قريبًا. سيتم دعم هذا base.js
من قبل برنامج التحويل البرمجي الإغلاق للمضي قدمًا وقد يتلقى ميزات جديدة. تم تصميمه للاحتفاظ فقط بأجزائها الأساسية المتصورة.
لبناء المترجم بنفسك ، ستحتاج إلى ما يلي:
المتطلب السابق | وصف |
---|---|
Java 11 أو بعد ذلك | تستخدم لتجميع رمز مصدر المترجم. |
Nodejs | تستخدم لإنشاء الموارد التي تستخدمها مجموعة Java |
غيت | تستخدم من قبل Bazel لتنزيل التبعيات. |
بازيليسك | تستخدم لبناء أهداف البرمجيات المختلفة. |
Bazelisk عبارة عن غلاف حول Bazel يقوم بتحميل النسخة المناسبة من Bazel بشكل ديناميكي لمستودع معين. استخدامه يمنع الأخطاء الزائفة التي تنتج عن استخدام الإصدار الخاطئ من Bazel لبناء المترجم ، وكذلك يجعل من السهل استخدام إصدارات البازل المختلفة للمشاريع الأخرى.
Bazelisk متاح من خلال العديد من مديري الحزم. لا تتردد في استخدام أيهما مرتاح أكثر.
تعليمات لتثبيت bazelisk.
$ bazelisk build //:compiler_uberjar_deploy.jar
# OR to build everything
$ bazelisk build //:all
يمكن تنفيذ الاختبارات بطريقة مماثلة. سيقوم الأمر التالي بإجراء جميع الاختبارات في الريبو.
$ bazelisk test //:all
هناك المئات من أهداف الاختبار الفردية ، لذلك سوف يستغرق الأمر بضع دقائق لتشغيلها جميعًا. أثناء التطوير ، من الأفضل عادة تحديد الاختبارات الدقيقة التي تهتم بها.
bazelisk test //: $path_to_test_file
انظر Bazel IDE تكامل.
بمجرد بناء المترجم ، ستكون الجرة المترجمة في bazel-bin/
الدليل. يمكنك الوصول إليها باستخدام مكالمة إلى java -jar ...
أو باستخدام البرنامج النصي Package.json:
# java -jar bazel-bin/compiler_uberjar_deploy.jar [...args]
yarn compile [...args]
src/com/google/javascript/jscomp/CommandLineRunner.java
أو إنشاء نسختك الموسعة من الفصل.ومع ذلك ، اخترت المساهمة ، يرجى الالتزام بمدونة قواعد سلوكنا للحفاظ على مجتمعنا مكانًا صحيًا ومرحبًا.
حقوق الطبع والنشر 2009 مؤلفي برنامج التحويل البرمجي الإغلاق.
مرخصة بموجب ترخيص Apache ، الإصدار 2.0 ("الترخيص") ؛ لا يجوز لك استخدام هذا الملف إلا في الامتثال للترخيص. يمكنك الحصول على نسخة من الترخيص على http://www.apache.org/licenses/license-2.0.
ما لم يكن مطلوبًا بموجب القانون المعمول به أو الموافقة على الكتابة ، يتم توزيع البرامج الموزعة بموجب الترخيص على أساس "كما هي" ، دون ضمانات أو شروط من أي نوع ، إما صريحة أو ضمنية. راجع ترخيص الأذونات والقيود التي تحكم اللغة المحددة بموجب الترخيص.
مسار الكود | src/com/google/javascript/rhino ، test/com/google/javascript/rhino |
عنوان URL | https://developer.mozilla.org/en-us/docs/mozilla/projects/rhino |
إصدار | 1.5R3 ، مع تعديلات ثقيلة |
رخصة | رخصة Netscape العامة وترخيص MPL / GPL المزدوج |
وصف | نسخة جزئية من Mozilla Rhino. Mozilla Rhino هو تطبيق JavaScript لـ JVM. تم استخراج هياكل بيانات شجرة جافا سكريبت وتعديلها بشكل كبير لاستخدامها من قبل برنامج التحويل البرمجي JavaScript من Google. |
التعديلات المحلية | وقد تم إعادة تسمية الحزم. تمت إزالة جميع التعليمات البرمجية غير ذات صلة بشجرة التحليل. تمت إضافة محلل JSDOC ونظام الكتابة الثابت. |
عنوان URL | http://args4j.kohsuke.org/ |
إصدار | 2.33 |
رخصة | معهد ماساتشوستس للتكنولوجيا |
وصف | Args4J هي مكتبة فئة Java صغيرة تجعل من السهل تحليل خيارات/وسائل سطر الأوامر في تطبيق CUI الخاص بك. |
التعديلات المحلية | لا أحد |
عنوان URL | https://github.com/google/guava |
إصدار | 31.0.1 |
رخصة | ترخيص Apache 2.0 |
وصف | مكتبات جافا الأساسية من Google. |
التعديلات المحلية | لا أحد |
عنوان URL | https://github.com/findbugsproject/findbugs |
إصدار | 3.0.1 |
رخصة | ترخيص BSD |
وصف | التعليقات التوضيحية للكشف عن عيب البرمجيات. |
التعديلات المحلية | لا أحد |
عنوان URL | http://junit.org/junit4/ |
إصدار | 4.13 |
رخصة | رخصة عامة مشتركة 1.0 |
وصف | إطار لكتابة وتشغيل الاختبارات الآلية في Java. |
التعديلات المحلية | لا أحد |
عنوان URL | https://github.com/google/protobuf |
إصدار | 3.0.2 |
رخصة | ترخيص BSD جديد |
وصف | دعم المكتبات لمخازن المؤسسات البروتوكول ، ترميز البيانات المنظمة. |
التعديلات المحلية | لا أحد |
عنوان URL | https://github.com/google/re2j |
إصدار | 1.3 |
رخصة | ترخيص BSD جديد |
وصف | الوقت الخطي التعبير العادي مطابقة في جافا. |
التعديلات المحلية | لا أحد |
عنوان URL | https://github.com/google/truth |
إصدار | 1.1 |
رخصة | ترخيص Apache 2.0 |
وصف | إطار التأكيد/الاقتراح لاختبارات وحدة Java |
التعديلات المحلية | لا أحد |
عنوان URL | https://ant.apache.org/bindownload.cgi |
إصدار | 1.10.11 |
رخصة | ترخيص Apache 2.0 |
وصف | Ant هي أداة بناء قائمة على Java. من الناحية النظرية ، يشبه "صنع" دون تجاعيد Make ومع قابلية النقل الكاملة لرمز Java النقي. |
التعديلات المحلية | لا أحد |
عنوان URL | https://github.com/google/gson |
إصدار | 2.9.1 |
رخصة | ترخيص Apache 2.0 |
وصف | مكتبة Java لتحويل JSON إلى كائنات Java والعكس بالعكس |
التعديلات المحلية | لا أحد |
مسار الكود | contrib/nodejs |
عنوان URL | https://github.com/dcodeio/node.js-comples-compiler-externs |
إصدار | E891B4FBCF5F466CC4307B0FA842A7D8163A073A |
رخصة | ترخيص Apache 2.0 |
وصف | اكتب عقود واجهات برمجة تطبيقات NodeJS |
التعديلات المحلية | تغييرات كبيرة لجعلها متوافقة مع NPMCommandlinerunner. |