تتمثل إحدى الميزات في أن هذا من شأنه أن يفرض بنية معيارية للتطوير المستمر لـ three.js.
النمط الشائع في node / browserify يجعل كل ملف يعلن عن تبعياته في الأعلى ، ويعتبر المتغيرات العامة نمطًا مضادًا.
هنا مثال مقتطف:
// src/geometry/BoxGeometry.js
var Geometry = require('./Geometry.js');
var Vector3 = require('../core/Vector3.js');
module.exports = BoxGeometry;
function BoxGeometry() {
// ...
}
BoxGeometry.prototype = Geometry.prototype;
ميزة أخرى هي أن مستهلكي three.js
باستخدام browserify سيكونون قادرين على انتقاء واختيار الأجزاء التي يريدونها. يمكنهم فقط استيراد Scene
، BoxGeometry
، PerspectiveCamera
، و WebGLRenderer
، الحصول على التبعيات لكل هؤلاء تلقائيًا ( Object3D
إلخ) ، ولديك حزمة صغيرة من جافا سكريبت تدعم مجموعة الميزات التي يريدونها فقط.
يمكن القيام بذلك بطريقة لا تفرض تغييرات جذرية. في المستوى الأعلى ، سنقوم بتصدير جميع الفئات التي نعتبرها جزءًا من الحزمة القياسية
// src/three.js
var THREE = { rev: 101 }
module.exports = THREE
THREE.Geometry = require('./geometry/Geometry.js')
THREE.BoxGeometry = require('./geometry/BoxGeometry.js')
// ...
ملاحظة: أنا لا أطلب بالضبط التبعيات في الجزء العلوي في هذا المثال ، لأن هذا الملف سيتطلب بيانات بشكل حصري تقريبًا.
أخيرًا ، سنقوم بتغليف ذلك في تعريف الوحدة النمطية العالمية الذي يكتشف ما إذا كان نظام الوحدة النمطية (العقدة / المتصفح ، AMD) قيد الاستخدام ، وإذا كان الأمر كذلك ، نقوم بتصديره ، أو يتم إلحاقه بالعنصر العام ( window
).
دعنا نراجع:
three.js
باستخدام browserify لانتقاء واختيار الوظيفةسيتطلب هذا استبدال نظام البناء ، لكن النظام الجديد سيكون واضحًا ومباشرًا.
بعض المزايا الأخرى:
@ shi-314 أعتقد أنني مرتبك قليلاً ، أشعر أن You can structure your code
و You can build for production
هي الأشياء التي يمكنك القيام بها بدون التحول المعماري؟ هل تتحدث عن مصدر three.js أو أشياء مبنية باستخدام three.js؟
إحدى الممارسات التي تستخدمها Three.js والتي تجعل من الصعب استخدامها في بيئات Commonjs هي استخدام instanceof
: https://github.com/mrdoob/three.js/blob/master/src/core/Geometry .js # L82
هذا لأنه في أحد التطبيقات ، غالبًا ما ينتهي بك الأمر بإصدارات مختلفة من نفس المكتبة في شجرة المصدر الخاصة بك ، لذا فإن التحقق من المثيل لا يعمل بين الإصدارات المختلفة من نفس المكتبة. سيكون من الجيد التحضير للانتقال إلى نظام وحدة Commonjs لاستبدال تلك الشيكات بميزة التحقق من خلال واجهة نمط Geometry.isGeometry(geom)
.
kumavis أنا أتحدث عن أشياء مبنية في three.js. لنفترض أنك تريد إنشاء مادة خاصة بك باستخدام أدوات التظليل الخاصة بك وما إلى ذلك. في الوقت الحالي ، تحتاج إلى توسيع عنصر الثلاثة العام للبقاء متسقًا مع باقي التعليمات البرمجية الثلاثة:
THREE.MeshMyCoolMaterial = function (...) { ... }
ولكن إذا كان لدينا Browserify مما يمكنك القيام به:
var MeshLambertMaterial = require('./../MeshLambertMaterial');
var MeshMyCoolMaterial = function (...) {...}
لذلك تظل مساحة الاسم الخاصة بك ثابتة ولا تحتاج إلى استخدام THREE.MeshLambertMaterial
و MeshMyCoolMaterial
في شفرتك.
ومع You can build for production
كنت أعني نفس الشيء الذي ذكرته: allows three.js consumers using browserify to pick and choose functionality
.
@ shi-314 شكرا لك ، هذا أكثر وضوحا. هذا يؤثر على الحل العام الذي أقترحه لإزالة التسلسل من الفئات التي يحددها المستهلك:
// given that `data` is a hash of a serialized object
var ObjectClass = THREE[ data.type ]
new ObjectClass.fromJSON( data )
هذا من إعادة بناء التسلسل / إلغاء التسلسل المقترح
https://github.com/mrdoob/three.js/pull/4621
لا ينبغي أن يتأثر الأداء بتغيير مثل هذا.
هذا تغيير كبير جدًا ولكني أؤيده أيضًا.
بعض المزايا الرئيسية الأخرى:
standalone
لإنشاء إصدار UMD من أجلك. لا حاجة للعبث يدويًا بأغلفة UMD.threejs-vecmath
دون القلق بشأن كسر الكود لدى الجميع. وعلى الجانب الآخر ، إذا قمنا بإجراء تصحيح أو إصدار ثانوي في وحدة معينة ، فسيتمكن الأشخاص الذين يستهلكون هذه الوحدات من الحصول على التغييرات تلقائيًا.npm install threejs-shader-bloom
)require()
الوحدات التي لدينا التطبيق يستخدم في الواقع.إلى mrdoob والمؤلفين الآخرين ؛ إذا لم تكن لديك خبرة كبيرة في NPM / Browserify ، فإنني أقترح إنشاء عدة مشاريع صغيرة معها والتعرف على "فلسفتها". إنها مختلفة تمامًا عن هندسة ThreeJS ؛ بدلاً من الأطر الكبيرة ، فهو يشجع على الكثير من الأشياء الصغيرة .
ميزة أخرى لهذا النهج هي أنه يمكن أن يكون هناك نظام بيئي مفتوح المصدر ، وطرف ثالث ، وحدات Three.JS ، خاصة التظليل ، والهندسة ، ومحمل النماذج وما إلى ذلك ، المنشورة من خلال NPM أو Github / Component والتي يمكن للأشخاص الرجوع إليها واستخدامها بسهولة. في الوقت الحالي ، تتم مشاركة الأشياء من خلال استضافة عرض توضيحي يقوم الأشخاص بعد ذلك "بعرض المصدر" عليه. Three.JS تستحق الأفضل!
أعتقد أن إحدى المشكلات التي أواجهها مع Three.JS هي مدى سرعة تعارض التعليمات البرمجية مع الإصدار الحالي من Three.JS. ميزة أخرى للتحول إلى شيء كهذا هي القدرة على تحديد إصدارات معينة من _bits_ من Three.JS ستكون قوية جدًا وسهلة الاستخدام.
+1
+1 لبنية CommonJS / browserify ، سيجعل النواة أكثر خفة وستكون الإضافات مناسبة حتى لو كانت تأتي من أطراف ثالثة
كما أن تجزئة three.js إلى وحدات صغيرة يتطلب الكثير من التكاليف أيضًا. يسمح النظام الحالي بوحدات إضافية بسيطة جدًا لطرف ثالث (شاهد على سبيل المثال ، وحدات THREEx من jetienne). هناك الكثير مما يمكن قوله حول بساطة الإعداد الحالي ، طالما أن أنظمة الوحدات النمطية JS هي مجرد أغلفة حول أنظمة الإنشاء.
طريقة أخرى لتقليل حجم التصميم هو ما يفعله ClojureScript. إنهم يتبعون بعض الاصطلاحات للسماح لمترجم Closure من Google بإجراء تحليل البرنامج بالكامل والتخلص من الشفرة الميتة.
+1 لأناقة البساطة التي لا تُقدَّر ، وغالبًا ما يتم التغاضي عنها
+1
كما أن تجزئة three.js إلى وحدات صغيرة يتطلب الكثير من التكاليف أيضًا. يسمح النظام الحالي بوحدات إضافية بسيطة جدًا لطرف ثالث (شاهد على سبيل المثال ، وحدات THREEx من jetienne).
الفكرة هنا هي أنه لا يزال من الممكن توفير بنية UMD للبيئات التي لا تحتوي على Node. ستعمل المكونات الإضافية مثل THREEx بنفس الطريقة لأولئك الذين يعتمدون على ThreeJS بعلامات <script>
.
سيكون الشيء الصعب هو: كيف يمكننا require()
مكونًا إضافيًا معينًا إذا كنا في بيئة CommonJS؟ ربما يمكن أن يساعدك browserify-shim.
هناك الكثير مما يمكن قوله حول بساطة الإعداد الحالي ، طالما أن أنظمة الوحدات النمطية JS هي مجرد أغلفة حول أنظمة الإنشاء.
يعد نظام الإضافات / الإضافات الحالي الخاص بـ ThreeJS أمرًا مروعًا جدًا للعمل معه ، وبعيدًا عن كونه "بسيطًا" أو سهلًا. تميل معظم مشاريع ThreeJS إلى استخدام شكل من أشكال الإضافات أو الإضافات ، مثل EffectComposer ، أو FirstPersonControls ، أو أداة تحميل النماذج ، أو أحد ملفات JS العديدة الأخرى الموجودة في المجلد examples
. الطريقة الوحيدة الآن للاعتماد على هذه المكونات الإضافية:
vendor
الآن ، تخيل ، باستخدام المتصفح ، يمكنك القيام بشيء مثل هذا:
var FirstPersonControls = require('threejs-controls').FirstPersonControls;
//more granular, only requiring necessary files
var FirstPersonControls = require('threejs-controls/lib/FirstPersonControls');
ستكون هذه المكونات الإضافية require('threejs')
وأي شيء آخر قد يحتاجون إليه (مثل مقتطفات GLSL أو تثليث النص ). إدارة التبعية / الإصدار مخفية عن المستخدم ، وليست هناك حاجة إلى مهام grunt / gulp concat التي تتم صيانتها يدويًا.
سيكون الأمر الصعب: كيف نطلب () مكونًا إضافيًا معينًا إذا كنا في بيئة CommonJS؟
أستخدم CommonJS لمشاريع THREE.js لبعض الوقت الآن. إنها عملية يدوية إلى حد ما ، حيث يتم تحويل أجزاء من كود الأشخاص الآخرين إلى وحدات ولا أعتقد أنه ستكون هناك طريقة سهلة لتجنب ذلك بالنسبة للكود القديم الذي لم يتم تحويله من قبل المؤلفين أو المساهمين.
الشيء المهم هو أن هناك وحدة تقوم بتصدير الكائن "القياسي" بالكامل ، والذي يمكن أن يطلبه أي شيء يرغب في تمديده.
var THREE = require('three');
THREE.EffectComposer = // ... etc, remembering to include copyright notices :)
لقد نجح هذا الأمر جيدًا بالنسبة لي ، خاصةً مع نمو المشروع وبدأت في إضافة التظليل والأشكال الهندسية الخاصة بي إلى وحداتهم الخاصة وما إلى ذلك.
طالما أن هناك حزمة npm "threejs-full" أو "threejs-classic" ، تصبح هذه طريقة قابلة للتطبيق جدًا للعمل مع عناصر Three.js القديمة في بيئة CommonJS لكنني أظن أن هذا مناسب جدًا!
+1
أعتقد أنه بمجرد توفر وحدات threejs المجزأة في البرنامج المساعد npm
سيحب المطورون الانتقال إلى بيئة CommonJS.
في 5 حزيران (يونيو) 2014 ، الساعة 9:19 مساءً ، كتب "Charlotte Gore" [email protected] :
سيكون الأمر الصعب: كيف نطلب () مكونًا إضافيًا معينًا إذا كنا
في بيئة CommonJS؟أستخدم CommonJS لمشاريع THREE.js لبعض الوقت الآن. انها قليلا
لعملية يدوية ، تحويل أجزاء من كود الآخرين إلى وحدات
ولا أعتقد أنه ستكون هناك طريقة سهلة لتجنب ذلك بالنسبة إلى التعليمات البرمجية القديمة
التي لم يتم تحويلها من قبل المؤلفين أو المساهمين.الشيء المهم هو أن هناك وحدة تقوم بتصدير "المعيار" بالكامل
ثلاثة كائن ، والتي يمكن أن يطلبها أي شيء يرغب في التمديد
هو - هي.var THREE = تتطلب ('ثلاثة') ؛
THREE.EffectComposer = // ... إلخ ، تذكر تضمين إشعارات حقوق النشر :)لقد نجح هذا جيدًا بالنسبة لي ، خاصةً مع نمو المشروع وأنا
ابدأ في إضافة التظليل والأشكال الهندسية الخاصة بي إلى الوحدات النمطية الخاصة بهم وما إلى ذلك.طالما أن هناك حزمة npm "threejs-full" أو "threejs-classic"
تصبح هذه طريقة قابلة للتطبيق للعمل مع عناصر Three.js القديمة في ملف
بيئة CommonJS لكنني أظن أن هذا مكان مناسب جدًا!-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/mrdoob/three.js/issues/4776#issuecomment -45236911.
يمكن أيضًا أن تجعل التظليل معياريًا أيضًا ، على سبيل المثال باستخدام glslify . حتى الأشياء مثل إنشاء برمجية وسيطة Express التي تنشئ تظليلًا عند الطلب تصبح أسهل بعد ذلك.
قبل بضعة أشهر ، قمت بنقل frame.js إلى required.js وفهمت أخيرًا كيف تعمل عناصر AMD هذه.
ما زلت بحاجة إلى تعلم كيفية "ترجمة" هذا. ما هي الأداة / سير العمل لتوليد three.min.js
من قائمة الوحدات؟
أنا أفضل gulp.js كنظام بناء مع البرنامج المساعد gulp-browserify . من السهل حقًا فهم الرمز ويبدو أنظف من النخر في رأيي. تحقق من ذلك: http://travismaynard.com/writing/no-need-to-grunt-take-a-gulp-of-fresh-air : wink:
بعض الأفكار: (بناءً على خبرتي المحدودة مع node، npm، browserify بالطبع)
ومع ذلك ، بعد المناقشة حول هذا الموضوع ، لست متأكدًا مما إذا كان لدى الجميع نفس الفهم الخاص بـ browserify (browserify ، و commonjs ، و needjs ، و amd ، و umd مرتبطة إلى حد ما على الرغم من أنها قد لا تكون بالضرورة نفس الشيء).
الآن إذا كنت تستطيع اتباع سلسلة أفكاري قليلاً.
هناك حيث يأتي Browserify في الصورة. حسنًا ، من الناحية الفنية ، يمكن للمرء استخدام يتطلب JS في المتصفح. لكنك ترغب في تجميع ملفات js معًا دون إجراء عدد كبير جدًا من مكالمات الشبكة (على عكس نظام الملفات الذي يتطلب () الطلبات السريعة). هناك حيث يقوم Browserify ببعض الأشياء الرائعة مثل التحليل الثابت لمعرفة الوحدات التي يجب استيرادها وإنشاء بنية أكثر تحسينًا لتطبيقك. (هناك قيود بالطبع ، ربما لا تتطلب التحليل ("bla" + متغير)) يمكنها حتى تبديل الأجزاء التي تتطلب طبقة محاكاة للأشياء التابعة لـ node.js. نعم ، إنه ينشئ بنية js يمكنني الآن تضمينها في متصفحي.
فيما يلي بعض الأشياء التي يمكن أن يقوم بها المتصفح https://github.com/substack/node-browserify#usage
يبدو أن كل شيء رائع حتى الآن ... ولكن هناك بعض النقاط التي اعتقدت أنها تستحق الدراسة ، ننتقل إلى "بنية المتصفح"
لذلك إذا رأينا هذا التنوع وتحميل الوحدة المريح (الركوب بشكل أساسي على النظام البيئي npm) جنبًا إلى جنب مع الإنشاءات المخصصة أمرًا رائعًا ، فقد يكون من المفيد إجراء تغيير في النموذج ورمز إعادة البناء وتغيير نظام البناء الحالي لدينا.
mrdoob يتم سرد بعض الأدوات حول browserify هنا: https://github.com/substack/node-browserify/wiki/browserify-tools.
بخصوص three.min.js
، فلن تستخدم الكود المصغر في مشروعك. كل ما تفعله هو var three = require('three')
في project.js
ثم تشغيل browserify project.js > bundle.js && uglifyjs bundle.js > bundle.min.js
. ملاحظة: لا يزال بإمكانك شحن رمز مصغر لـ <script src="min.js">
.
أنا حاليًا ألتف بثلاثة ملفات
if ('undefined' === typeof(window))
var window = global && global.window ? global.window : this
var self = window
و
module.exports = THREE
ثم ألتف التمديدات مع
module.exports = function(THREE) { /* extension-code here */ }
لذلك يمكنني أن أطلبه من هذا القبيل:
var three = require('./wrapped-three.js')
require('./three-extension')(three)
لذلك هذا ليس هو الأمثل ، لكنني شخصياً يمكنني التعايش معه وأعتقد أنه ليس سيئًا للغاية - على الرغم من أن اقتراح kumavis سيكون ميزة ضخمة.
ولكن ربما يكون من المنطقي أن نتفرع ثلاثة وأن نضع كل الأشياء في وحدات منفصلة فقط لنرى كيف ستنجح.
راجع أيضًا http://modules.gl/ الذي يعتمد بشكل كبير على browserify (على الرغم من أنه يمكنك استخدام كل وحدة بمفردها دون browserify).
mrdoob @ shi-314 تم إدراج gulp-browserify في القائمة السوداء لصالح مجرد استخدام browserify مباشرة (أي عبر تدفق مصدر الفينيل).
أدوات مثل grunt / gulp / إلخ في حالة تغير مستمر ، وستجد الكثير من الآراء المختلفة. في النهاية ، لا يهم ما تختاره ، أو ما إذا كنت تفعل ذلك فقط باستخدام برنامج نصي مخصص. الأسئلة الأكثر أهمية هي: كيف سيستهلك المستخدمون ThreeJS ، وما مقدار التوافق مع الإصدارات السابقة الذي تريد الحفاظ عليه؟
بعد المزيد من التفكير ، أعتقد أنه سيكون من الصعب حقًا جعل كل شيء نمطيًا بدون إعادة هيكلة إطار العمل وبنيته بالكامل. فيما يلي بعض المشاكل:
../../../math/Vector2
إلخ.three-scene
عن three-lights
إلخ. ثم يمكنك إصدار كل حزمة على حدة. يبدو هذا النوع من التجزئة غير واقعي بالنسبة لإطار كبير مثل ThreeJS ، وسيكون بمثابة ألم في المؤخرة للمحافظة عليه.require('three/src/math/Vector2')
اقتراحي؟ نحن نعتبر أمرين للمضي قدمًا:
أود أن أرى كل شيء مقسمًا إلى وحدات ، لكنني لست متأكدًا من نهج واقعي بالنسبة لـ ThreeJS. ربما يجب على شخص ما إجراء بعض التجارب في مفترق طرق ليرى مدى جدوى الأشياء.
شكرا على التفسيرات يا رفاق!
ما أخشاه هو تعقيد الأمور للأشخاص الذين بدأوا للتو. قد لا يكون إجبارهم على تعلم عناصر المتصفح / الوحدات النمطية هذه فكرة جيدة ...
يجب أن أتفق مع mrdoob هنا. أنا وكثير من الزملاء ليسوا مبرمجي ويب (بدلاً من VFX / الرسوم المتحركة TDs). لقد كان اختيار WebGL و Three عملاً كافياً بالتأكيد كما هو الحال في أعلى عبء العمل الحالي (وفي بعض الحالات كان على البعض منا تعلم js على الفور). الكثير مما قرأته في هذا الموضوع ، في بعض الأحيان ، يجعلني أرتجف عندما أفكر في مقدار العمل الإضافي الذي يمكن إضافته إلى لوحي إذا انتقل ثلاثة إلى هذا الهيكل. قد أكون مخطئا ولكن هذا بالتأكيد هو ما يقرأ لي.
مع إنشاء UMD مترجم مسبقًا ( browserify --umd
) في الريبو ، لا يوجد تغيير في سير العمل للمطورين الحاليين.
mrdoob فكرة نظام إدارة التبعية هي البساطة. قد تكون قراءة العشرات من المنشورات حول الخيارات وأنظمة الإنشاء أمرًا مربكًا ، لكن النظام الحالي في النهاية ليس مستدامًا. في أي وقت ، يعتمد ملف واحد على ملف آخر ، وهذا هو مطاردة - والبحث عن أي مطور جديد يجب أن يقوم به للعثور على مرجع. باستخدام browserify ، تكون التبعية صريحة وهناك مسار للملف.
repsac يجب أن يجعل نظام التبعية ثلاثًا أكثر سهولة في الوصول لمستخدمي اللغات الأخرى لأنه يتجنب النطاق العالمي وكوابيس ترتيب التحميل ويتبع نموذجًا مشابهًا للغات الشائعة الأخرى. var foo = require('./foo');
مشابه (بشكل فضفاض) لـ C # using foo;
أو Java import foo;
أود أن أرى كل شيء مقسمًا إلى وحدات ، لكنني لست متأكدًا من نهج واقعي بالنسبة لـ ThreeJS. ربما يجب على شخص ما إجراء بعض التجارب في مفترق طرق ليرى مدى جدوى الأشياء
أعتقد أن هذا هو الطريق الصحيح ، حقًا. أنجز العمل ، أظهر كيف يعمل.
وسيكون استهلاك واجهة برمجة التطبيقات أمرًا رائعًا
ugly: require('three/src/math/Vector2')
كتجربة ، قمت للتو بتحويل "البدء" من المستندات الثلاثة إلى هذا النهج المعياري الجديد. يمكنني أن أتخيل وجود الكثير من المراجع ما لم يكن الناس صارمين جدًا بشأن تقسيم الكود إلى وحدات صغيرة.
تتمثل الميزة الرئيسية لفعل ذلك في أن حجم البنية الناتج سيكون جزءًا صغيرًا من حجم Three.js الكامل لأنك ستقوم فقط بتضمين الأشياء المشار إليها على وجه التحديد هنا ثم الأشياء التي تعتمد عليها تلك الأشياء.
أعتقد أن الرجوع إلى جميع التبعيات التي تحتاجها (وتثبيتها جميعًا بشكل فردي) قد يكون فظيعًا جدًا في الممارسة العملية.
إذا كنت تستهدف الأجهزة المحمولة بشكل صريح ، فسيكون هذا النهج شديد الدقة مثاليًا ولكن في الواقع أعتقد أننا سنحتاج إلى حزم تقوم بتصدير ثلاثة واجهات برمجة تطبيقات بالكامل والتي ستعمل كالمعتاد ، ثم الحزم الأصغر التي تغلف كل هندسة المكافآت ، وكلها العارضين ، كل الرياضيات ، كل المواد وما إلى ذلك ، ثم نزولاً إلى مستوى الوحدة الفردية بحيث يمكن للمطورين أن يقرروا بأنفسهم.
ونعم ، يعد الترميز للويب أمرًا مزعجًا.
على أي حال ، مع التجربة ...
تثبيت التبعيات لدينا ..
npm install three-scene three-perspective-camera three-webgl-renderer three-cube-geometry three-mesh-basic-material three-mesh three-raf
اكتب الكود الخاص بنا ...
// import our dependencies..
var Scene = require('three-scene'),
Camera = require('three-perspective-camera'),
Renderer = require('three-webgl-renderer'),
CubeGeometry = require('three-cube-geometry'),
MeshBasicMaterial = require('three-mesh-basic-material'),
Mesh = require('three-mesh'),
requestAnimationFrame = require('three-raf');
// set up our scene...
var scene = new Scene();
var camera = new Camera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
var renderer = new Renderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// create the cube...
var geometry = new CubeGeometry(1, 1, 1);
var material = new MeshBasicMaterial({color: 0x00ff00});
var cube = new Mesh(geometry, material);
scene.add(cube);
// position the camera...
camera.position.z = 5;
// animate the cube..
var render = function () {
requestAnimationFrame(render);
cube.rotation.x += 0.1;
cube.rotation.y += 0.1;
renderer.render(scene, camera);
};
// begin!
render();
ثم قم ببناء ملفنا
browserify entry.js -o scripts/hello-world.js
ثم قم بتضمينه في صفحتنا
<script src="/scripts/hello-world.js" type="text/javascript"></script>
أعتقد أن الرجوع إلى جميع التبعيات التي تحتاجها (وتثبيتها جميعًا بشكل فردي) قد يكون فظيعًا جدًا في الممارسة العملية.
لا يحتاج المستخدم النهائي بالضرورة إلى استخدام browserify في مشروعه حتى يتمكن Three من استخدام browserify لإدارة قاعدة الكود الخاصة به. يمكن كشف ثلاثة مثل THREE
كما هو الآن ... قم بتضمين ملف البناء وتشغيله.
repsacmrdoob التغييرات ستكون المتوافقة مع السابقة، بحيث يمكن للمستخدمين الحالي لا تحتاج إلى تغيير أي شيء إذا لم ترغب في ذلك. تهدف هذه الاقتراحات إلى تحسين قابلية الصيانة طويلة المدى وطول العمر لقاعدة الشفرة المترامية الأطراف والمتجانسة الخاصة بـ ThreeJS. قد تبدو أشياء مثل التبعية وإدارة الإصدار بمثابة صداع للمبتدئين ، لكنها رائعة لأولئك الذين يطورون الأدوات والأطر والمكونات الإضافية ومواقع الويب واسعة النطاق أعلى ThreeJS.
على سبيل المثال ، يمكن أن يظل رمز المستخدم النهائي كما هو ، ولا يلزم تغيير examples
على الإطلاق:
<script src="three.min.js"></script>
<script>
var renderer = new THREE.WebGLRenderer();
</script>
بالنسبة للمطورين الأكثر طموحًا الذين يبحثون عن بنية معيارية ، _أو_ لأولئك الذين يتطلعون إلى تطوير حلول طويلة الأجل على رأس ThreeJS (أي والاستفادة من إدارة الإصدار / التبعية) ، قد يبدو الأمر مثل هذا:
npm install three-vecmath --save
ثم في الكود:
var Vector2 = require('three-vecmath').Vector2;
//.. do something with Vector2
علاوة على ذلك ، يسمح هذا للأشخاص باستخدام أشياء مثل الرياضيات المتجهة لـ ThreeJS ، وتحويلات الألوان ، والتثليث ، وما إلى ذلك خارج نطاق ThreeJS.
على الرغم من أنني أعتقد أن الفوضى المطلوبة () هي فكرة سيئة ومقايضة سيئة ، إلا أنها ستكون فكرة أسوأ أن يتم تعريض المستخدمين لنوعين مختلفين من كود js. نكهة نظام وحدة أبسط (لكن من الدرجة الثانية).
erno أعتقد أنك فاتتك النقطة ، three.js
سيتم تنظيمه بواسطة هيكل وحدة داخليًا ، لكن هذا يُستخدم لإنتاج ملف بناء لا يختلف عن الإعداد الحالي.
المكسب الأساسي هو تحسين تجربة تطوير three.js
والحفاظ عليه.
kumavis - لم يفوتerno ذلك في الواقع ، لكنني فهمت (*) أنه يشير إلى أنه إذا تم استخدام three.js
أحيانًا عبر طلب وأحيانًا لا يمكن أن يكون الأمر محيرًا. على سبيل المثال ، ينظر شخص ما إلى كل من المصدر الثالث ثم بعض أمثلة الجهات الخارجية ويواجه اختلافات في كيفية عمل كل شيء وعمله.
(*) تحدثنا عن هذا على موقع irc في وقت سابق اليوم.
أعتقد أن هذا نوع من النقاط الصحيحة ولكني لست متأكدًا مما إذا كان / كيف يعمل في النهاية - ما إذا كانت مشكلة في استخدامات الوحدة والبناء حقًا. ولكن يبدو بالتأكيد أنه يستحق التفكير ، وبدا عمومًا أنه من الجيد بالنسبة لي أن الأمر العام قد تم النظر فيه بعناية هنا ، شكرًا على المعلومات والآراء حتى الآن من جانبي.
antont أرى. اقترح الأشخاص مجموعة متنوعة من الأساليب المختلفة هنا ، كنت أفترض أننا سنوفر بشكل أساسي وثائق للاستخدام على المستوى الأعلى (سحب كل شيء من THREE
) ، لكن قد ينشئ الآخرون أمثلة لا تتبع هذا وقد يؤدي إلى بعض الالتباس. وهذا مصدر قلق صحيح.
أعتقد أنني كنت في حيرة من أمري بسبب اللغة.
والآخر هو نكهة نظام الوحدة النمطية الأبسط (لكن من الدرجة الثانية).
هذا يشير فقط إلى ملف البناء ، أليس كذلك؟
حسب فهمي ، نعم. لا أستطيع أن أتخيل ما هو غير ذلك ولكن يمكن أن يفوتك شيء رغم ذلك.
antont، kumavis: لقد تحدثت المقترحات هنا عن الكشف عن رمز النمط المطلوب () للمستخدمين النهائيين أيضًا ، انظر على سبيل المثال. أحدث تعليق لـ mattdesl.
"للمطورين الأكثر طموحًا الذين يبحثون عن بنية معيارية ، أو لأولئك الذين يتطلعون إلى تطوير حلول طويلة الأجل على رأس ThreeJS (أي والاستفادة من إدارة الإصدار / التبعية) [...]"
إحدى الطرق للحصول على تصميمات محسّنة هي في الواقع أن يكون لديك برنامج نصي يكتشف تبعياتك تلقائيًا وينتج الوحدات المطلوبة.
الآن bower & browserify لا يتطلب الأمر ، لكنهما ليسا الحلول الوحيدة. لا أعرف ما إذا كانت هناك مشاريع أخرى مفتوحة المصدر جاهزة تقوم بذلك (ربما مثل تبعيات المنظمات غير الحكومية) لكنني كتبت مثل هذه الأدوات قبل ذلك أعتقد أنه سيكون هناك طرق أخرى لحل هذه الآلام.
قد يكون مترجم إغلاق جوجل مثل هذه الأداة؟
من جانب المستخدم ، هل يمكن أن يكون هذا مفيدًا؟
http://marcinwieprzkowicz.github.io/three.js-builder/
هذا مثير للاهتمام erichlof :) أتساءل عما إذا كان marcinwieprzkowicz قد أنشأ هذا يدويًا ... https://github.com/marcinwieprzkowicz/three.js-builder/blob/gh-pages/threejs-src/r66/modules.json
إحدى الممارسات التي تستخدمها Three.js والتي تجعل من الصعب استخدامها في بيئات Commonjs هي استخدام مثال: https://github.com/mrdoob/three.js/blob/master/src/core/Geometry.js#L82
هذا لأنه في أحد التطبيقات ، غالبًا ما ينتهي بك الأمر بإصدارات مختلفة من نفس المكتبة في شجرة المصدر الخاصة بك ، لذا فإن التحقق من المثيل لا يعمل بين الإصدارات المختلفة من نفس المكتبة. سيكون من الجيد التحضير للانتقال إلى نظام وحدة Commonjs لاستبدال تلك الشيكات بفحص الميزات خلف واجهة نمط Geometry.isGeometry (geom).
في git / three.js / src:
grep -r instanceof . | wc -l
164
في git / three.js / أمثلة:
grep -r instanceof . | wc -l
216
لذلك يوجد إجمالي 380 استخدامًا instanceof
في ثلاثة ملفات. ما هو أفضل تطبيق كبديل؟
لقد أضفت مؤخرًا خاصية type
والتي يمكن استخدامها لاستبدال معظم هؤلاء.
لقد أضفت مؤخرًا خاصية النوع التي يمكن استخدامها لاستبدال معظم هؤلاء.
لطيف - جيد! سوف تعد العلاقات العامة.
للحصول على مثال حول كيفية التعامل مع ذلك في مكتبة JS كبيرة وشائعة أخرى ، ألق نظرة على https://github.com/facebook/react . تم تصميم قاعدة الكود باستخدام نظام الوحدة النمطية القائم على نمط العقدة (الذي يطبقه المتصفح) ولكنه مصمم للإصدار باستخدام grunt. هذا الحل مرن لـ 3 حالات استخدام.
require
. تم توثيق فوائد إدارة التبعية بشكل جيد.لقد أجريت بعض البحث ...
بالأمس قمت باختراق برنامج نصي (غبي نوعًا ما) يقوم بتحويل رمز المصدر Three.js لاستخدام عبارات CommonJS require()
للإعلان عن التبعيات بين الملفات. فقط لنرى ما سيحدث ... هذا:
var THREE = require('../Three.js');
require('../math/Color.js');
require('../math/Frustum.js');
require('../math/Matrix4.js');
require('../math/Vector3.js');
require('./webgl/WebGLExtensions.js');
require('./webgl/plugins/ShadowMapPlugin.js');
require('./webgl/plugins/SpritePlugin.js');
require('./webgl/plugins/LensFlarePlugin.js');
require('../core/BufferGeometry.js');
require('./WebGLRenderTargetCube.js');
require('../materials/MeshFaceMaterial.js');
require('../objects/Mesh.js');
require('../objects/PointCloud.js');
require('../objects/Line.js');
require('../cameras/Camera.js');
require('../objects/SkinnedMesh.js');
require('../scenes/Scene.js');
require('../objects/Group.js');
require('../lights/Light.js');
require('../objects/Sprite.js');
require('../objects/LensFlare.js');
require('../math/Matrix3.js');
require('../core/Geometry.js');
require('../extras/objects/ImmediateRenderObject.js');
require('../materials/MeshDepthMaterial.js');
require('../materials/MeshNormalMaterial.js');
require('../materials/MeshBasicMaterial.js');
require('../materials/MeshLambertMaterial.js');
require('../materials/MeshPhongMaterial.js');
require('../materials/LineBasicMaterial.js');
require('../materials/LineDashedMaterial.js');
require('../materials/PointCloudMaterial.js');
require('./shaders/ShaderLib.js');
require('./shaders/UniformsUtils.js');
require('../scenes/FogExp2.js');
require('./webgl/WebGLProgram.js');
require('../materials/ShaderMaterial.js');
require('../scenes/Fog.js');
require('../lights/SpotLight.js');
require('../lights/DirectionalLight.js');
require('../textures/CubeTexture.js');
require('../lights/AmbientLight.js');
require('../lights/PointLight.js');
require('../lights/HemisphereLight.js');
require('../math/Math.js');
require('../textures/DataTexture.js');
require('../textures/CompressedTexture.js');
سنحتاج إلى بعض عمليات إعادة البناء الرئيسية ، ربما تقسيم WebGLRenderer (وما شابه) إلى وحدات متعددة (يبلغ طول الملف أكثر من 6000 سطر).
THREE.ShaderChunk
في وقت التجميع ثم إلى THREE.ShaderLib
في وقت التشغيل (الانضمام إلى مصفوفات أخرى THREE.ShaderChunk
s) وهو أمر صعب إلى حد ما مع المتصفح فقط. أفترض أنه سيتطلب تحويلاً في المتصفح يقوم بالشيء نفسه.يستخدم React.js لغة عامة للبحث عن الوحدات النمطية الخاصة بهم دون الحاجة إلى الرجوع إليها من خلال مسار الملف. ربما يمكننا فعل الشيء نفسه وتحديد القواعد المخصصة التي تتيح لنا ملفات GLSL require
تحويلها إلى صيغة JS.
rasteiner ، قد تكون سعيدًا جدًا بمعرفة المزيد عن https://github.com/stackgl/glslify ، فهو يأتي من عائلة http://stack.gl المتنامية
لقد كانت لدي خبرة لا بأس بها مع الوحدات النمطية ونهج "unixy" في الشهرين الماضيين وأعتقد الآن أن الوقت قد فات ، وإعادة هيكلة threejs للوحدات النمطية أو npm سيكون هدفًا غير واقعي.
إليك ما أفعله حاليًا لمعالجة مشكلة النمطية / قابلية إعادة الاستخدام:
تميل مشاريعي الجديدة إلى استخدام "ثلاثة" في npm فقط للتشغيل. سيكون من الرائع جدًا أن تقوم شركة ThreeJS بنشر البنية رسميًا إلى npm باستخدام علامات الإصدار التي تتوافق مع أرقام الإصدار.
ملاحظة: للمهتمين بجلب مظلات قابلة لإعادة الاستخدام / معيارية لسير عملهم:
https://gist.github.com/mattdesl/b04c90306ee0d2a412ab
مرسل من الايفون الخاص بي
في 20 تشرين الثاني (نوفمبر) 2014 ، الساعة 7:42 صباحًا ، كتب aaron [email protected] :
rasteiner ، قد تكون سعيدًا جدًا بمعرفة المزيد عن https://github.com/stackgl/glslify ، فهو يأتي من عائلة http://stack.gl المتنامية
-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub.
في حالة مساعدة الآخرين الذين قد يبحثون عن كيفية استخدام Three.js مع المتصفح ، وتعثروا في هذا الموضوع ، فإن الطريقة التي أعددتها بها بنفسي هي استخدام browserify-shim .
بعد قسم README في _ "سوف تقوم أحيانًا أ) بعرض المتغيرات العامة عبر global" _ ، قمت بتضمين علامة نصية منفصلة لـ Three.js وقمت بتكوينها لفضح المتغير العام الثلاثة.
وبعد ذلك ، كان الجزء الذي كان عليّ أن أتدرب عليه بنفسي هو كيفية تضمين إضافات مثل ColladaLoader و OrbitControls وما إلى ذلك.
من package.json:
"browser": {
"three": "bower_components/threejs/build/three.js"
},
"browserify-shim": "browserify-shim-config.js",
"browserify": {
"transform": [ "browserify-shim" ]
}
browserify-shim-config.js:
module.exports = {
"three": { exports: "global:THREE" },
"./vendor/threejs-extras/ColladaLoader.js": { depends: {"three": null}, exports: "global:THREE.ColladaLoader" },
"./vendor/threejs-extras/OrbitControls.js": { depends: {"three": null}, exports: "global:THREE.OrbitControls" }
};
ثم في البرنامج النصي الخاص بي ، main.js:
require('../vendor/threejs-extras/ColladaLoader.js');
require('../vendor/threejs-extras/OrbitControls.js');
var loader = new THREE.ColladaLoader(),
controls = new THREE.OrbitControls(camera);
...
يتطلب Browserify إعادة بناء البرنامج النصي بأكمله عند تعديله حتى بالبايت. أستخدم المستعرض مرة واحدة لحزم مشروع يتطلب THREE.js ، ثم يستغرق الأمر أكثر من ثانيتين لبناء حد وحظر حمل الكبد في كل مرة أقوم فيها بإجراء تغيير. هذا محبط للغاية.
عادة ما تستخدم المراقبة أثناء التطوير مع تحميل الكبد. هذا الشخص يبني الحزمة بشكل تدريجي.
watchify لا يعمل بالنسبة لي. عندما أقوم بتغيير ملف وحفظه ، راقب و beefy تحميل الكبد يقدم الإصدار الأقدم / المخبأ. ليس لدي فكرة لماذا يحدث هذا. لحسن الحظ ، يعمل المتصفح بشكل جيد بالفعل.
ChiChou Pass في --noparse=three
للتصفح. يأخذ هذا خطوة حزمة المتصفح من 1000 مللي ثانية إلى 500 مللي ثانية على جهازي ، وهو أمر لائق بما يكفي لإحساس فوري بالتعليقات.
rasteiner ، أود أن أشكرك مرة أخرى على البحث غير الرسمي الذي أجريته في تبعيات three.js. في حين أن هذه القائمة الضخمة من الأقسام هي رمز قبيح المظهر ، فإن هذا القبح موجود بالفعل كما هو ، غير مرئي. تكمن قوة Browserify في أنها تتطلب منا تهوية ملابسنا المتسخة ومتابعة أنظمة أقل تشابكًا.
هناك الكثير من الأماكن في Three.js حيث نأخذ شيئًا ما ونفهم نوعه ونؤدي مهامًا مختلفة بناءً على هذا النوع. في معظم هذه الحالات ، يمكن نقل هذا الرمز المعتمد على النوع إلى النوع نفسه ، ولن نضطر إلى فهم جميع الأنواع الممكنة التي نعمل عليها.
فيما يلي مثال مختصر من WebGLRenderer :
if ( texture instanceof THREE.DataTexture ) {
// ...
} else if ( texture instanceof THREE.CompressedTexture ) {
// ...
} else { // regular Texture (image, video, canvas)
// ...
}
يجب أن يكون أكثر من النموذج
texture.processTexImage( _gl, mipmaps, otherData )
دع النوع يحدد كيفية التعامل مع نفسه. يسمح هذا أيضًا لمستهلك المكتبة باستخدام أنواع نسيج جديدة لم نفكر فيها. يجب أن يقلل هذا الهيكل من الاعتماد المتبادل.
أعتقد أن الانتقال إلى بنية المتصفح هو بالتأكيد السبيل للذهاب. سيجعل بناء UMD استهلاك THREE.js أسهل. سيسمح لنا أيضًا بتقسيم WebGLRenderer إلى ملفات متعددة ، لأنه يبدو الآن متآلفًا ومخيفًا إلى حد ما.
لقد بدأت فرعًا حيث أعمل حاليًا على نقله هنا: https://github.com/coballast/three.js/tree/browserify-build-system
واسمحوا لي أن أعرف ما هو رأيك.
إليك تغييرات coballast .
يبدو أنك تتبع نهج التحويل الآلي مع ملفك browserifyify.js
، والذي أعتقد أنه الطريقة الصحيحة للذهاب.
الشيء الوحيد الذي لم نناقشه جميعًا كثيرًا حتى الآن هو أفضل طريقة لنقل هذه المكتبة الكبيرة المتغيرة باستمرار إلى المتصفح. يمكنك إجراء التغييرات ثم فتح بيان عام ، لكنه سيصبح قديمًا على الفور. هذا ما هو مقنع حول النهج الآلي.
اذا قدرنا:
browserifyify.js
)... ثم يمكننا تحويل هذا إلى تحويل بضغطة زر والذي سيستمر في العمل في المستقبل المنظور. تمكن هذه البساطة من تحقيق هذا المفهوم الحالم عن تحول معماري أساسي إلى مثل هذا المشروع الكبير عندما تفوز الحجج الأيديولوجية.
coballast لتحقيق هذه الغاية ، سأزيل التغييرات على src / Three.js إذا كانت تعمل بنفس الطريقة.
ملاحظة: ليس فقط العودة ، ولكن قم بإزالة هذه التغييرات من تاريخ الفرع عبر فرع جديد أو دفع القوة
coballast أتساءل عما إذا كان من المنطقي أكثر أن تكون أداة التحويل ليست three.js
، ولكن أداة خارجية تشير إلى three.js
Development dir ، وتقوم بتحويل المصدر الملفات ، ويضيف نصًا برمجيًا للبناء ، ويدير الاختبارات.
kumavis أوافق على ترك دليل src بمفرده. أعتقد أن الشيء الذي يجب فعله هو جعل الأداة المساعدة تكتب دليلًا مكررًا برمز Commonjs ، ويمكننا اختبار وتشغيل إصدار المتصفح من هناك للتأكد من أن جميع الأمثلة تعمل قبل أن نحاول القيام بأي شيء رئيسي.
هناك أيضًا فرصة مثيرة للاهتمام هنا لكتابة بعض عناصر التحليل الثابت التي ستتحقق تلقائيًا وتفرض أسلوبًا متسقًا عبر قاعدة التعليمات البرمجية بأكملها.
coballast يبدو رائعًا.
هناك ثروة من الأدوات المتاحة لإعادة كتابة التعليمات البرمجية آليًا ، على سبيل المثال escodegen . بحاجة للتأكد من أننا نحافظ على التعليقات ، وما إلى ذلك.
تريد أن تبدأ الريبو threejs التحويل فائدة؟
coballast الذي قيل ، من
kumavis النظر في الأمر. انا حقا اريد ان يحدث هذا هذا واحد فقط من مشروعين أعمل عليهما في الوقت الحالي.
kumavismrdoob يبدو أن بعض المناقشات هنا تدور حول فكرة تقسيم ثلاث إلى وحدات منفصلة متعددة يمكن تثبيتها على الأرجح عبر npm ثم تجميعها باستخدام browserify. أنا لست ضد الفكرة تمامًا ، لكنني أعتقد أنه يجب أن تكون قضية منفصلة. الشيء الوحيد الذي أدافع عنه في هذه المرحلة هو استخدام browserify لإدارة قاعدة كود THREE داخليًا. قم بنقلها ، واجعلها تعمل بنفس الطريقة التي تعمل بها دائمًا للمستخدمين ، ثم قم بتقييم ما هو منطقي.
سأكون فضوليًا لمعرفة ما هو ناتج هذه الأداة المساعدة ^ ^
coballast قم بربط الريبو لنا لتتبعه ، حتى لو كان فارغًا فقط في هذه المرحلة. يمكننا البناء من هناك.
https://github.com/coballast/threejs-browserify-conversion-utility
الرمز في حالة من الفوضى ، سيتم تنظيفه قريبًا.
ها نحن ذا! :صاروخ:
لدي الآن الأداة المساعدة في حالة حيث تقوم بإنشاء المتصفح srcify وسوف نبنيها دون مشاكل. سوف أقوم بتحديث الريبو بتعليمات حول كيفية القيام بذلك بنفسك. في هذه المرحلة ، لا تعمل الأمثلة. هناك العديد من المشكلات التي يجب التعامل معها لإصلاح ذلك. سأضيفهم إلى الريبو إذا أراد أي شخص أن يشمر عن سواعده ويساعد.
coballast ، نعم ، يرجى تقديم المشكلات باسم TODOs ، وسأشارك أنا أو غيرنا قدر المستطاع.
ظهرت مشاكل خطيرة. انظر # 6241
إليك تحليلي لما يجب أن يحدث حتى يعمل هذا: https://github.com/coballast/threejs-browserify-conversion-utility/issues/9#issuecomment -83147463
browserify هو على الأقل زائدة عن الحاجة للنقل (احتفالي) بسبب تصميمه. هذا يجعلها تستخدم تكلفة تضخمية (خطة بيانات أي شخص؟) وبطيئة.
العلاج البسيط لذلك هو فصل المستند عن رمز المكتبة والذي قد يستلزم ملفين للعميل وليس ملفًا واحدًا. هذه ممارسة شائعة لشبيبة جانب العميل.
إذا كان برنامج المتصفح خاطئًا في البداية ويحتاج إلى إصلاح نفسه ، فأنا بالكاد أستطيع أن أرى سبب وجوب التفكير في تحسين أي شيء على الإطلاق ، ناهيك عن شيء مثل threejs.
spaesani لأنه يجب تنزيل بيانات threejs على أي حال. إذا قمنا بتقسيم threejs إلى وحدات أصغر وسمحنا لنظام الإنشاء الآلي باختيار ما يحتاجه لتطبيق واحد ، فإن معظم تطبيقات threejs الموجودة ستكون أخف وزناً.
إذا كنت لا تزال تريد فصل "المستند عن رمز المكتبة" لسبب ما ، فلا يزال بإمكانك القيام بذلك واستخدام إصدار تم إنشاؤه مسبقًا كما نفعل الآن. يمكنك حتى تقسيم تطبيق browserify المدمج إلى وحدات منفصلة عن طريق استخدام علامتي --standalone و --exclude .
Browserify هو مجرد طريقة لاستخدام واجهة برمجة تطبيقات (CommonJS) لتعريف الوحدة التي أثبتت جدواها في المستعرض. سيؤدي ذلك إلى تبسيط تطوير المكونات الإضافية threejs إلى حد كبير وتعزيز وضوح الكود وبالتالي الإنتاجية ، وسيسمح لنا بالاندماج في نظام بيئي أكبر (npm) حيث يتم الحفاظ على الكود بطبيعته بواسطة المزيد من الأشخاص مع الحفاظ على النزاهة من خلال نظام الإصدار (فكر في الأمر) the stackgl family) ، ولن يجبر الأشخاص على الدخول إلى CommonJS إذا كانوا لا يريدون ذلك.
بالطبع هناك سلبيات ، لكنها ليست تلك التي ذكرتها.
يمكن تخزين three.js و three.min.js مؤقتًا للحفظ في النقل (البيانات) بواسطة وكيل أو حل الجوال الشائع أو متصفح التخزين المؤقت.
في اللحظة التي تختار فيها رمز threejs وتجميعه مع رمز خاص بالوثيقة ، لا يكون التخزين المؤقت ممكنًا.
إذا كان browserify يسمح لأحد
sp
On Mar 28, 2015 1:06 PM, Roman Steiner notifications@github.com wrote:@spaesani Because the data for threejs has to be downloaded anyway. If we split threejs into smaller modules and let an automated build system cherry pick what it needs for a single app, actually most threejs apps out there would be lighter.
If for some reason you still want to separate "document from library code", you could still do this and use a pre-built version like we do now. You could even split your browserify-built app into separate modules by using the --standalone flag.
Browserify is just a way to use a battle proven module definition API (CommonJS) on the browser. It would greatly simplify the development of threejs plugins and enhance code clarity and therefore productivity, it would allow us to integrate into a bigger ecosystem (npm) where the code is inherently maintained by more people while still maintaining integrity through the versioning system, and it wouldn't even force people into CommonJS if they don't want it.
Of course there are downsides, but they're not the ones you've mentioned.
—Reply to this email directly or view it on GitHub.
spaesani إنه (browserify) يحسن الأشياء للبشر. تعد سعادتي النفسية وسلامتي أكثر أهمية من مدى سهولة تحميل الآلة للأشياء وتنفيذها.
سيتم تحسين الكثير من مشكلات تحميل شبكة الهاتف المحمول إلى حد ما من خلال أشياء مثل http / 2. من الأفضل حل مشاكل مثل هذه عن طريق تعديل الطبقات الأقل في مكدس التجريد. لا ينبغي أن تمنعنا مشكلات الأداء من اتباع أفضل ممارسات هندسة البرمجيات مثل نمطية / فصل الاهتمامات وما إلى ذلك.
لقد وجدت هذه المشكلة لأن فريقي بدأ مؤخرًا في استخدام jspm. نحن قادرون على استيراد threejs (أعتقد أن السبب في ذلك هو أن الملف الرئيسي قد تم تصفحه). كنت أتطلع لمعرفة ما إذا كان أي شخص قد قام بتحويل threejs إلى وحدات es6 ، ويرجع ذلك أساسًا إلى ميزة الإنشاء الخاصة بـ jspm (تجميع جميع التبعيات في ملف واحد ، ولكن فقط جمع التبعيات المستخدمة).
في حين أنه من الرائع أن يحتفظ mrdoob بحجم threejs أقل من 100 كيلو بايت ، إلا أنني أجد أن معظم مشاريعي لا تستخدم الكثير من قاعدة التعليمات البرمجية (أشعر أن معظمها ، لكنني لم أحاول معرفة ذلك). CubeCamera ، OrthographicCamera ، CanvasRenderer ، أضواء مختلفة ، لوادر ، منحنيات ، هندسية ، مساعدون ، إلخ. بالإضافة إلى ذلك ، أجد أن معظم مشاريعي تتضمن بعض الأمثلة على البرامج النصية.
كان أملي أنه سيكون من الممكن الحصول على موقع واحد لجميع هذه الوحدات (تلك المجمعة عادةً مع threejs بالإضافة إلى تلك الموجودة في الأمثلة) ، واستيراد العناصر التي أحتاجها ببساطة ، ثم عندما أقوم بتجميع المشروع ، ينتج عنه في ملف أصغر بكثير من threejs الأصلية ، على الرغم من احتوائه على العديد من الأجزاء التي لم يتم تضمينها في الأصل.
أردت أيضًا أن أضيف أنه إذا تم إنشاء threejs باستخدام وحدات المتصفح ، فستضيف مقدارًا صغيرًا من حجم الملف (ولكن لا يمكن مقارنته بالحجم 403 كيلوبايت الحالي في r70) ، ولكنه سيزيل أيضًا استخدام المتغير العام THREE من الكود ، وبالتالي السماح للمتغيرات مثل THREE.Geometry أن يتم تصغيرها عن طريق الإغلاق.
لقد أجريت اختبارًا سريعًا لإجراء عملية بحث واستبدال للتخلص من الكائن الثلاثة (لذلك قام جميع الأطفال بتلويث مساحة الاسم) ولف الملف بأكمله في IIFE ، ثم قمت بتشغيل كل شيء من خلال إغلاق google. الملف الناتج (غير مضغوط) كان 238 كيلو بايت ، أقل من 777 كيلو بايت.
في حين أن النتائج ستختلف ، أعتقد أن الأمر يستحق بالتأكيد التأكد من حدوث ذلك.
شكرا لإخبارك - العديد من النقاط الجيدة هناك ، ومألوفة لنا أيضا. نحن أيضًا لا نستخدم أبدًا العديد من العارضين في مشروع واحد ولكننا نفعل نوعًا من الأشياء lib من الأمثلة.
لم يدركوا ذلك بشأن التصغير - هذا فرق كبير جدًا.
من المؤكد أن الوحدات النمطية es6 بدت واعدة - لقد كان من الجيد أيضًا سماع أن هناك مسارًا من نمط الوحدة النمطية AMD / CommonJS / هذا واستخدام lib أيضًا.
colin لست متأكدًا من أنني أتابعك حول كيفية تحديد المتصفح
يساعد على سعادتك النفسية: نيس.
هل هو في التوثيق؟
browserify هي بقرة نقود ناقلة ...
الثلاثاء ، 31 مارس 2015 ، 10:11 مساءً -04: 00 من Colin Ballast notifications@github.com :
spaesani إنه (browserify) يحسن الأشياء للبشر. سعادتي النفسية الخاصة: تعد الصحة والرفاهية أكثر أهمية من مدى سهولة تحميل الآلة وتنفيذها.
سيتم تحسين الكثير من مشكلات تحميل شبكة الهاتف المحمول إلى حد ما من خلال أشياء مثل http / 2. من الأفضل حل مشاكل مثل هذه عن طريق تعديل الطبقات الأقل في مكدس التجريد. لا ينبغي أن تمنعنا مشكلات الأداء من اتباع أفضل ممارسات هندسة البرمجيات مثل نمطية / فصل الاهتمامات وما إلى ذلك.
-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub.
الآن ، إذا كان المستعرض سيحدد تلقائيًا التبعيات بدون بيان يتطلب ... مهلا انتظر ...
spaesani أنا في الواقع أفضل التبعيات الصريحة - تساعدك على فهم كيفية
browserify هي بقرة نقود ناقلة ...
spaesani browserify overhead متناهية الصغر. سيساعد الأشخاص في الواقع على إنشاء المزيد من البنيات البسيطة.
تحديث الحالة:
لدي فرع به بعض التعليمات البرمجية المتاحة في المتصفح:
https://github.com/coballast/three.js/tree/browserify
يرجى أن تضع في اعتبارك أن هذا الكثير من العمل قيد التنفيذ. تم إنشاء هذا الرمز تلقائيًا وسيبدو فظيعًا لفترة من الوقت نتيجة لذلك. ما زلت أحاول إصلاح بعض مشاكل البناء. راجع coballast / threejs-browserify-conversion-Utility # 10 إذا كنت تعتقد أنه يمكنك إصلاحه. كان يبني لبعض الوقت ، لكن ليس الآن.
لقد عملت أنا و
آسف على الرد الطويل. TLDR: jspm / es6 يعمل ، لكن لديه بعض الغموض: 1) تصدير الكائنات قبل تعريفها ؛ 2) تصدير كائنات تحتوي على فئة واحدة ، بدلاً من مجرد تصدير فئة واحدة ؛ 3) IIFE باستخدام التبعيات الدائرية ؛ 4) هيكل الملف.
لقد لعبت مع فرع المتصفح الخاص بك في jspm ( @ spinchristopher أعلاه أنا) ولدي بعض الملاحظات ، على الرغم من ذلك أولاً: ألن يكون من الجيد فتح المشكلات في تلك الشوكة ، لذا فإن هذا الموضوع ليس مليئًا بها وهم ليسوا كذلك مختلطين معا؟
على الرغم من أنه يعمل ، إلا أنه لا ينتج بالفعل النتيجة الصحيحة. (باستخدام العرض التوضيحي البسيط عند البدء). ينشئ اللوحة القماشية وتعبئتها باللون الأسود (إلا إذا قمت بتعيين اللون الواضح على شفاف) ، ولكن لا يتم عرض المكعب في الواقع. ومع ذلك ، لا أتوقع أن يعمل في هذه المرحلة ، لأن هذا لا يزال مبكرًا جدًا في العملية.
واجهت 3 قضايا رئيسية:
واحد. كان هذا هو الأكثر إزعاجًا ، وأنا بصراحة لست متأكدًا من كيفية الحصول على أي شيء لتجميعه مع هذا الخطأ المحدد ، لأنه لا ينبغي أن يعمل على الإطلاق. يبدأ العديد من الملفات على هذا النحو (هذا جيد لأن تعريفات الوظائف يتم رفعها إلى الوقت الحالي ، ويتم تشغيلها بشكل أساسي قبل سطر module.exports ، على الرغم من ظهوره أولاً):
module.exports.Foo = Foo;
function Foo() {}
تأتي المشكلة في العديد من الملفات التي تشبه هذا (أول ملف رأيته كان math / Math.js). يتم رفع تهيئة الكائن (وهذا هو سبب عدم وجود خطأ غير محدد) ولكن يظل التعريف في مكانه (لذا فإن التصدير غير محدد).
module.exports.Foo = Foo;
var Foo = {};
الحل الوحيد الذي وجدته هنا هو نقل سطر الصادرات إلى النهاية ، أو إعادة كتابته على هذا النحو (مفضل):
var Foo = module.exports.Foo = {};
اثنين. البيانات المصدرة. عند التعامل مع الملفات المعيارية ، فإن المعيار هو أن كل ملف يصدر كائنًا واحدًا. في حين أن معظم الملفات تكون بهذه الطريقة (على الرغم من أن بعضها يصدر أكثر) ، فإنها لا تصدر المُنشئ الفردي ، بل تقوم بتصدير كائن يحتوي على هذا المُنشئ (على سبيل المثال: module.exports.Foo = Foo;
بدلاً من module.exports = Foo;
. الأخير هي طريقة عمل جميع أمثلة browserify). وبالتالي ، عند استخدام يتطلب ، يجب أن تخطو مستوى أعمق ( var Vector3 = require('../math/Vector3').Vector3;
). بالإضافة إلى كونها غير ضرورية ، لا توجد طريقة للقيام بذلك عند الاستيراد إلى es6. ( import Vector3 from '../math/Vector3'; var vector = new Vector3.Vector3();
). على الرغم من وجود تصدير معين في es6 ، إلا أنه يتم تطبيقه عند استخدام الوحدات النمطية للمتصفح ، وسيظل هناك نفس التكرار ( import { Vector3 } from '../math/Vector3';
). هناك عدد قليل من الملفات التي تجمع ببساطة كائنات أخرى (من الواضح أنها Three.js) ، ولكن يجب الاحتفاظ بها عند الحد الأدنى ، ويجب استخدامها فقط في عملية الإنشاء ، وليس كوسيلة للاستيلاء على الكثير من الأشياء في الإنتاج .
ثلاثة. هذا له علاقة بالتبعية الدائرية. يمكن لـ System.js (أداة تحميل الوحدات المستخدمة بواسطة jspm) التعامل مع التبعيات الدائرية بشكل جيد ، ولكن هناك مشكلة واحدة. في العديد من الأماكن ، تقرأ الشفرة شيئًا مشابهًا لما يلي. تكمن المشكلة في أنه على الرغم من تمرير Vector3 باعتباره تبعية ، إلا أنه لم يتم تحميله بالكامل في هذا الوقت (نظرًا لأن Vector3 يتضمن أيضًا هذا الملف ، فلا يمكن حل كل منهما حتى يتم حل الآخر) ولا يمكن إنشاؤه. لقد أضفت إصلاحًا سيئًا للغاية (كما هو موضح أدناه) ، على الرغم من أنني لست متأكدًا من كيفية إصلاح ذلك بشكل أفضل. يبدو أن هذه مشكلة معمارية قد لا يكون لها حل بسيط. يحدث عدة مرات. يبدو أنه تحسين لمنع إنشاء Vector3 جديد في كل مرة يتم استدعاء الوظيفة. إذا كان هناك بالفعل نجاح كبير في الأداء لا يمكن إصلاحه عن طريق تحسين Vector3 ، فربما تضيف وظيفة إلى Vector3 لإرجاع Vector3 غير المستخدم والذي تم إصداره لاحقًا؟
Foo.prototype.bar = function() {
var vector = new Vector3();
return function() {
// some data which reuses vector repeatedly.
};
}();
المأزق:
Foo.prototype.bar = function() {
var vector;
return function() {
if(!vector) vector = new Vector3();
// some data which reuses vector repeatedly.
};
}();
أخيرًا ، أردت إضافة القليل عن تنظيم الملفات. من الواضح أن هذا شيء يجب معالجته بعد إنشاء المجموعة الحالية بشكل صحيح ، لكنني أردت طرحها الآن. أثناء عمل بنية الملف الحالية ، تكون أجزاء منه غريبة إلى حد ما أو حتى محرجة. يبدو أن المجموعات الرئيسية (الكاميرات والمواد والأشكال الهندسية وما إلى ذلك) جيدة ، على الرغم من أنني سأجري بعض التغييرات ، كما هو موضح أدناه. أود أيضًا أن أنقل الكرات الأرضية في ThreeGlobals إلى الشيء الذي يعتبرون عالميًا من أجله. IE: FrontSide و BackSide و DoubleSide كلها تنتمي إلى Material (جنبًا إلى جنب مع NoShading و FlatShading و SmoothShading. في الواقع ، يبدو أن معظمهم يفعلون ...).
جاءت ارتباكاتي الأساسية مع الجوهر والإضافات. يجب أن يكون core / Geometry.js في مجلد الأشكال الهندسية ، تمامًا مثل المواد الموجودة في مجلد المواد. لكن لا يوجد مجلد هندسي ، إنه موجود في إضافات. بالمناسبة ، تحتوي الإضافات أيضًا على جوهر وهندسة ، لكن الهندسة الأساسية ليست في هذا المجلد. توجد مجموعة كبيرة من المساعدين ، لكن ألا ينبغي أن يكون كل مساعد مع الشيء الذي يساعده؟ يمكن تهيئة عمليات الإنشاء بسهولة لأخذ الملفات التي تريدها فقط ، لذلك لا يوجد عذر لوضع الملفات غير المهمة في مكان آخر.
لدي حاليًا سطر في الكود الخاص بي يقرأ import BoxGeometry from 'threejs/extras/geometries/BoxGeometry';
و var geometry = new BoxGeometry.BoxGeometry( 1, 1, 1 );
لقد اعتدت استخدام `` THREE.BoxGeometry () الجديدة '' لقد استغرق الأمر بعض الوقت للعثور على الملف. عند استخدامه بشكل نمطي ، يكون موقع الملف بنفس أهمية شيء مثل توقيعات الوظيفة.
التغييرات العامة التي قد أجريها على بنية الملف. تنطبق هذه في العديد من الأماكن ، لكنني أقدم مثالاً فقط. (كملاحظة ، لطالما فضلت نموذجًا لتسمية الملف بعد الفئة الفردية التي يصدرها ، ووضع الملف في مجلد يحمل نفس الاسم. ستدرج أي سلالات مباشرة بشكل عام في هذا المجلد ، ولكن مرة أخرى ، في مجلد بنفس الاسم لأنفسهم. ومع ذلك ، إذا لم يعجب المرء هذا النمط ، فسيتم تطبيق نفس الهيكل أدناه ، فقط بإخراج هذا المستوى الإضافي. أيضًا ، يمكن تعديل أي أداة تحميل ملفات بسهولة [عادةً ما يتم توفير الخطافات مباشرة ، في الواقع] إلى أتمتة الطبقات وتبسيط عبارات الطلب].) (أفضل أيضًا جميع ملفات الأحرف الصغيرة ، مع الشرطة السفلية عند الضرورة.)
Three.js - This is _only_ used in the build process, so it should actually be with the build files, but run as if it is in this location.
geometry/geometry.js - Currently at core/Geometry.js
geometry/face3/face3.js - from core/Face3.js
geometry/box_geometry/box_geometry.js - Currently at extras/geometries/BoxGeometry.js
geometry/circle_geometry/circle_geometry.js - Similar to above.
geometry/utils/utils.js - from extras/GeometryUtils.js
camera/camera.js
camera/cube_camera/cube_camera.js
camera/perspective_camera/perspective_camera.js
camera/helper/helper.js - or camera/camera_helper/camera_helper.js
scene/scene.js
scene/fog/fog.js
scene/fog_exp2/fog_exp2.js
من المحتمل أيضًا إعادة تسمية الرياضيات إلى utils (قد تحتوي كل فئة أيضًا على أدوات مساعدة ، مثل الهندسة أعلاه) بحيث يمكن أن تحتوي على أكثر من مجرد الرياضيات (العديد من الأشياء من الجوهر).
HMUDesign @ spinchristopher شكرا على التحليل الرائع! من الأفضل وضع هذا النوع من المشكلات في coballast / threejs-browserify-convert-Utility repo في المستقبل.
حسنًا ، دعني أقرأ تعليقك الآن بشكل صحيح.
بطريقة ما فاتني الرابط إلى ذلك الريبو أعلاه. سأقوم بتحريك مشاكلي بسعادة
إلى ذلك الريبو غدًا ، ثم التقسيم عند الضرورة (لاحظت ذلك على الأقل
بعضها موجود بالفعل)
في 9 أبريل 2015 ، الساعة 12:09 صباحًا ، كتب "kumavis" notifications@github.com :
HMUDesign https://github.com/HMUDesign spinchristopher
https://github.com/spinchristopher شكرا على التحليل الرائع! أفضل
لوضع هذا النوع من القضايا في
coballast / threejs-browserify-convert-Utility-repo في المستقبل.حسنًا ، دعني أقرأ تعليقك الآن بشكل صحيح.
-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/mrdoob/three.js/issues/4776#issuecomment -91132413.
نعم ، وأنا أفعل ذلك لاستخدام مكتبات النوع الخاصة بي (* ملفات Util هي ملفات
في المرة الوحيدة التي لا أملك فيها تصديرًا افتراضيًا ، على الرغم من أنني سأضيف أحيانًا ملف
خبير بالإضافة إلى الافتراضي) ، ومع ذلك فإن بناء الجملة هذا يعمل فقط عندما تكون
تصدير عدة متغيرات مسماة. محمل لوحدات شبيبة المشتركة يعامل
modules.exports كتصدير افتراضي ، والذي لا يمكن إتلافه في ملف
استيراد = (
في 9 أبريل 2015 ، الساعة 12:12 صباحًا ، كتب "kumavis" notifications@github.com :
في es6 ، يمكنك استيراد الخصائص من كائنات التصدير عبر
تدمير.استيراد {Vector3} من "../math/Vector3" ؛
ومع ذلك ، أوافق على تفضيل تصدير واحد لكل وحدة.
-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/mrdoob/three.js/issues/4776#issuecomment -91132982.
HMUDesign شكرًا مرة أخرى على https://github.com/coballast/threejs-browserify-conversion-utility/issues/17
+1 لـ browserify.
أيضًا +1 لنقل أدوات التظليل إلى ملفات منفصلة باستخدام glslify.
أيضًا +1 لاعتماد بعض ميزات ES6 - مثل الفئات والوحدات النمطية. ستسمح لنا حزمة البناء الجديدة بالتجميع مرة أخرى إلى ES5 إذا لزم الأمر. انظر المثال:
import Object3D from '../core/Object3D';
import Geometry from '../core/Geometry';
import MeshBasicMaterial from '../materials/MeshBasicMaterial';
class Mesh extends Object3D {
constructor(
geometry = new Geometry(),
material = new MeshBasicMaterial({color: Math.random() * 0xffffff}
) {
super();
this.geometry = geometry;
this.material = material;
this.updateMorphTargets();
}
}
export default Mesh;
lmcd بينما نحن فيه ، يمكننا استخدام وحدات es6 واستخدام babeljs لتجميع كل شيء.
coballast ، سأكون مهتمًا browserify
وجعل بعض هذه الأشياء تحدث
lmcd لن أزعج نفسي. سأقوم بتطوير أدوات آلية لنقل عناصر es5 إلى es6 تلقائيًا. إنه أمر منطقي ، نظرًا لوجود كمية هائلة من كود es5 بالخارج ، ومتطلبات العمل لتحريكه يدويًا أمر فلكي.
coballast كنت أفكر أكثر في تشغيل بطاقة 5to6
: https://github.com/thomasloh/5to6
lmcd oo تجد لطيفة
لكن tbh ، يبدو أنه سيكون من الأسهل إعادة كتابة three.js من البداية: P.
lmcd أنا سعيد جدًا لأنك وجدت ذلك. لقد كانت واحدة من تلك الأشياء التي كنت سأفعلها بدافع الضرورة ، لكن بدت لي بوضوح أنها ليست ممتعة.
mrdoob ما هي أفكارك الحالية حول هذه القضية؟
anvaka في الوقت الحالي ، أركز حاليًا على إعادة هيكلة WebGLRenderer
. ليس لدي المزيد من النطاق الترددي العقلي 😅
لقد صادفت مؤخرًا بعض المشاريع التي كانت تستخدم وحدات es6 بسعادة مع بابل polyfill الذي تم ذكره هنا بالفعل أيضًا. لا أستطيع أن أتذكر أو أجد ما كان عليه الآن ، بدا جيدًا بالنسبة لي على أي حال.
يبدو أيضًا أن es6 قد اكتملت الآن على جبهة المعايير: "أخيرًا ، تمت الموافقة رسميًا على ECMA-262 Edition 6 ونشرها كمعيار في 17 يونيو 2015" وفقًا لـ https://developer.mozilla.org/en-US/docs / Web / JavaScript / New_in_JavaScript / ECMAScript_6_support_in_Mozilla
مجرد ملاحظة أنه فيما يتعلق بالأدوات واستقرار مواصفات الوحدة ، فإن الوضع يبدو جيدًا على هذه الجبهة.
لقد صادفت مؤخرًا بعض المشاريع التي كانت تستخدم وحدات es6 بسعادة مع بابل polyfill الذي تم ذكره هنا بالفعل أيضًا. لا أستطيع أن أتذكر أو أجد ما كان عليه الآن ، بدا جيدًا بالنسبة لي على أي حال.
إنه أيضًا 47 كيلوبايت من js الإضافية ويقرأ وينقل جافا سكريبت المضمن إلى es5 في المتصفح ، لذا فهو ليس رائعًا لوقت بدء التشغيل.
ليس هناك ما يمنع أي شخص يستخدم three.js من استخدام es6 في كودهم الخاص ؛ ومع ذلك ، فإن استخدامه في المكتبة من شأنه أن يؤدي إلى توافق المتصفح ومشكلات في الأداء في جميع المجالات.
آه - الوقوف مصححًا هنا ، شكرًا على المعلومات. أعتقد أن المستعرض وما زال يعمل في عملية البناء أفضل الآن في ذلك الوقت.
آه - الوقوف مصححًا هنا ، شكرًا على المعلومات. أعتقد أن المستعرض وما زال يعمل في عملية البناء أفضل الآن في ذلك الوقت.
واحدة من المشاكل الرئيسية مع es6 هو كسر تغييرات بناء الجملة مع es5؛ على سبيل المثال ، سهم fat => غير صالح es5 وسيؤدي إلى فشل المحلل اللغوي لجافا سكريبت وإفشال محاولة تجميع الكود. نأمل أن يتوصل شخص ما إلى طريقة للتغلب على هذا ، لكنهم لم يفعلوا ذلك بعد.
كنت أفكر في الواقع فقط في نظام الوحدة وبيان الاستيراد وما إلى ذلك.
إنه أيضًا 47 كيلوبايت من js الإضافية ويقرأ وينقل جافا سكريبت المضمن إلى es5 في المتصفح ، لذا فهو ليس رائعًا لوقت بدء التشغيل.
على سبيل المثال ، فإن fat arrow => غير صالح es5 وسيؤدي إلى فشل المحلل اللغوي لجافا سكريبت وإفشال محاولة تجميع الكود
يمكن تحويل كود es6 إلى es5 أثناء _build_ بدون عقوبة وقت التشغيل. إنها مجرد مسألة إضافة خطوة بابل إلى خط أنابيب البناء.
على سبيل المثال ، يمكن تحويل وظيفة السهم إلى es5 أثناء الإنشاء بدون تعويض أو عقوبة وقت التشغيل. سيقوم Babel بنقل هذا المقتطف es6
function MyObj() {
this.step = 1;
this.increment = function ( arr ) {
return arr.map( v => v + this.step );
}
}
في هذه النسخة المحمولة:
function MyObj() {
this.step = 1;
this.increment = function (arr) {
var _this = this;
return arr.map(function (v) {
return v + _this.step;
});
};
}
ميزة أخرى ، مثل فئات es6 ، ستنشئ polyfill صغيرًا (يمكنك أن ترى في babel repl http://babeljs.io/repl/).
mrdoob يفهم. هل ستدعم فكرة تقسيم three.js إلى وحدات أصغر مستضافة على npm؟
سيبقى مستودع Three.js الرئيسي دون تغيير: لن يضطر المستهلكون إلى بناء أي شيء. سيتمكن المستخدمون الأكثر خبرة من اختيار البتات المطلوبة من ثلاثة ملفات.
هذا يبدو جيدا. لا أعرف التفاصيل رغم ذلك.
يمكن تحويل كود es6 إلى es5 أثناء الإنشاء بدون عقوبة وقت التشغيل. إنها مجرد مسألة إضافة خطوة بابل إلى خط أنابيب البناء.
على سبيل المثال ، يمكن تحويل وظيفة السهم إلى es5 أثناء الإنشاء بدون تعويض أو عقوبة وقت التشغيل. سيقوم Babel بنقل هذا المقتطف es6
لا يزال تحويل ES6 يأتي مع عقوبة تشغيل كبيرة: http://www.incaseofstairs.com/2015/06/es6-feature-performance/ خاصة بالنسبة لمكتبة عالية الأداء.
الوحدات النمطية / npm / browserfy وما إلى ذلك ربما تكون فكرة جيدة
+1 على النمذجة المناسبة باستخدام وحدات ES6
+1 على النمذجة المناسبة باستخدام أي نظام وحدة عاقل (commonjs ، amd ، es6)
أعتقد أن Commonjs و AMD هما الخياران المفضلان لأنهما لا يستلزمان التحويل
ومع ذلك ، فإنها تتطلب خطوة بناء ، والتي تعادل
خطوة transpile.
استخدام ES6 ، إلى جانب كونه الإصدار التالي من اللغة ، سيسمح بامتداد
استخدام الميزات التالية كما هو مطلوب ، ولكن لا يكسر الكود الأصلي الحالي.
هل من الحكمة حقًا مفاعل قاعدة الشفرة في نظام موجود بالفعل
ليس الأحدث؟
في 20 تموز (يوليو) 2015 ، الساعة 12:05 ظهرًا ، كتب "kumavis" notifications@github.com :
+1 على النمذجة المناسبة باستخدام أي نظام وحدة عاقل (commonjs ، amd ،
es6)
أعتقد أن Commonjs و AMD هما الخياران المفضلان b / c هم لا يفعلون ذلك
تستلزم النقل-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/mrdoob/three.js/issues/4776#issuecomment -122990605.
ومع ذلك ، فإنها تتطلب خطوة بناء ، والتي تعادل
خطوة transpile.
البناء والترحيل ليسا متكافئين من حيث التعقيد الذي يقدمانه.
هل من الحكمة حقًا مفاعل قاعدة الشفرة في نظام موجود بالفعل
ليس الأحدث؟
Commonjs بسيط ويعمل بشكل رائع. أنا لا تباع على فكرة أن "الأحدث" === "أفضل".
يسمح استخدام ES6 [...] باستخدام الميزات التالية حسب الرغبة
لذلك هذا يستحق النظر. هل نريد ميزات es6؟ إذا بدأنا في تحويل es6 ، فسيبدأ الأشخاص في PR'ing es6. كما اقترح benaadams ، هناك تأثيرات غير بديهية على الأداء عند استخدام ميزات es6.
علاوة على ذلك ، لا نحتاج إلى دمج مشكلات "نظام الوحدات" و "ميزات es6". يمكنك تحويل es6 واستخدام Commonjs. ويمكنك تقديمهما بشكل منفصل.
+1 لـ browserify / commonjs - من السهل التجميع باستخدام المتصفح بطريقة تمكن الأشخاص من الاستمرار في استخدام المكتبة بالطريقة التقليدية إذا أرادوا ذلك - وهذا هو الغرض من UMD ، حيث تتطلب AMD (مثل request.js) ، يتطلب CommonJS (مثل node + browserify) ونافذة عمومية (لعلامات البرنامج النصي) اعتمادًا على البيئة التي نعمل فيها.
انتقل PIXI.js للتو إلى بنية معيارية باستخدام browserify وتم إعداد المكتبة بطريقة مشابهة جدًا - كل شيء مرتبط بكائن PIXI عالمي. إعدادهم يشبه إلى حد كبير وصف المنشور الثاني.
لا يتعامل المتصفح أو Commonjs مع الاحتياجات المحددة لمحرك ثلاثي الأبعاد ، وهذا لا يعني أنه لا يمكن استخدامها ، ولكن يجب اعتبارها قطعة واحدة من أحجية أكبر:
تحتاج المكونات إلى تصدير معلومات التعريف حول خصائص مثيلاتها ، لذلك يمكن أن يكون هناك أداة تحميل للكائنات العشوائية واتصالات بيانات الذاكرة المشتركة. مع مثل هذه البنية ، سيكون من المنطقي أيضًا تحميل رمز مكون خارج النواة عند الاستخدام لأول مرة. تم تبادل الأفكار حول هذه الموضوعات في # 6464 و # 6557.
+1
+1
كحل هجين ، من الممكن أيضًا إضافة المتطلبات كتعليقات. أعلم أن browserfy موجود بالفعل في العديد من الأنظمة البيئية ، لكنني أردت فقط ترك هذا هنا باعتباره سريعًا لتنفيذ المتغير :) لأنك لن تضطر إلى تغيير أي شيء. تحتاج فقط إلى إضافة تعليق أعلى كل ملف.
بصفتك مطورًا ، يمكنك بسهولة إنشاء ملفات min.js الخاصة بك باستخدام معلومات @requires
ومكوِّن gulp الإضافي.
مرحبًا بالجميع ، لقد كان لدي مؤخرًا حاجة مماثلة لتحميل الموارد التعسفية مع التبعيات الخاصة بهم بطريقة نظيفة ومنظمة ، وقد توصلت إلى حل كتابة المكونات الإضافية تتطلب js لكل نوع من أنواع الموارد. وبهذه الطريقة ، أترك حل تبعية يتطلب .js الاهتمام بتنزيل الموارد وتخزينها مؤقتًا بشكل صحيح .... في نفس الوقت ، ينشئ هذا الأسلوب "حزم" موارد قابلة لإعادة الاستخدام يمكنني استخدامها في العديد من مشاريعي.
إذا كنت مهتمًا ، يمكنك العثور على المشروع هنا: https://github.com/wavesoft/three-bundles
(مثال على استخدام هذه المكتبة سيكون متاحًا قريبًا)
أخطط في المستقبل لتضمين مرحلة تحسين في هذه المكونات الإضافية للسماح لمحسِّن need.js بتجميع الموارد في تنسيق أكثر إحكاما.
بالنظر إلى هذه المحادثة https://twitter.com/defunctzombie/status/682279526454329344 ، لا يبدو أنه سيتم تنفيذ وحدات es6 في المستقبل القريب. شيء يجب مراعاته.
قمت بعمل بعض النماذج الأولية باستخدام وحدات Commonjs و browserify.
وتشمل حزمة بلدي browserified النهائية كل ملف واحد لل src
مجلد والنتائج في 962K
حجم الملف (بالمقارنة مع النسخة الأصلية unbrowserified 885K
).
البناء المستهدف لـ cloth
المثال هو:
580K
(~ 44٪ أصغر)431K
(~ 8٪ أصغر)فيما يلي تفاصيل حجم الحزمة: http://output.jsbin.com/yogoxawozu. يأخذ العارضون 40٪ من الحزمة ، و 10٪ منها مأخوذة بواسطة مكتبة shaders.
أعتقد أنه يمكننا تقليل حجم الحزمة من خلال:
instance of
- تتطلب الإشارة بوضوح إلى الوحدات النمطية حتى عندما لا يتم استخدامها. أرى أن بعض الفئات لديها بالفعل type
- يمكننا استخدام هذا في جميع أنحاء المكتبة.glslify
عدة مرات ، ويمكن أن يساعد بالتأكيد. من الناحية المثالية ، يجب أن يعتمد كل مكون يتطلب أدوات تظليل بشكل صريح على تظليل.يمكنك التحقق من النتائج والتحقق من الرمز:
git clone --depth 1 --branch commonjs https://github.com/anvaka/three.js.git
cd three.js
npm i
# build backward compatible three.js library from commonjs modules.
# The output will be save into `build/three.min.js`. I'm using `.min.js` just
# to quickly verify examples. The actual file is not minified.
npm run build
# build cloth example
# the output is saved into ./examples/cjs/webgl_animation_cloth.bundle.js
npm run demo
لا يبدو أنه سيتم تنفيذ وحدات es6 في المستقبل القريب. شيء يجب مراعاته.
هذا صحيح ، ولكن من المهم أيضًا إدراك أن دعم وحدة CommonJS لن يتم تطبيقه أبدًا في المتصفحات ، لذلك يكون الاختيار بين
تتبنى مكتبات مثل D3 وحدات ES6 لأنها تستطيع بالفعل فعل كل ما يمكن أن تفعله وحدات CommonJS (باستثناء التشغيل محليًا في Node.js ، والذي لا يمثل مصدر قلق لمكتبة مثل Three.js) ، وينتج عن ذلك إنشاءات أصغر.
لقد أجريت بعض التجارب على https://github.com/rollup/three-jsnext ، وعلى الرغم من أنه ليس جاهزًا للإنتاج (أحتاج إلى قضاء المزيد من الوقت في نقل الأمثلة وما إلى ذلك!) فإن تصميم UMD الذي ينشئه هو في الواقع _ صغير_ من البناء الحالي.
أوافق على الملاحظة حول وحدات es6 مقابل الأنظمة الأخرى. أم
ليسوا معيار es ، هم معيار المجتمع. وعلى الرغم من أنهم
لا يمكن تشغيله "أصليًا" في العقدة ، يمكن أن يبدو أصليًا باستخدام خطافات Babel.
سوف أتابع مع الريبو الخاص بك قريبا.
أيضًا ، حقيقة أنه أصغر كان شيئًا ترعرعت فيه سابقًا
هذه المحادثة. "THREE.Geometry" تصبح "هندسة" والتي يمكن أن تكون كذلك
تصغير إلى "أ" على سبيل المثال.
أيضًا ، الحل لمثيل الشيكات هو إزالتها جميعًا
سويا. لا ينبغي أن تكون وحدة واحدة تتسول بشكل مختلف اعتمادًا على ماذا
تم إعطاؤه ، ولكن بدلاً من ذلك ، تأجيل إلى الشيء الذي تم توفيره للقيام بما يحتاج إليه
لكى يفعل. ثم لا توجد عمليات تحقق من مثيل أو نوع.
في 1 كانون الثاني (يناير) 2016 ، الساعة 8:23 مساءً ، كتب "Rich Harris" notifications@github.com :
لا يبدو أنه سيتم تنفيذ وحدات es6 قريبًا
مستقبل. شيء يجب مراعاته.هذا صحيح ، ولكن من المهم أيضًا إدراك وحدة CommonJS
لن يتم تنفيذ الدعم أبدًا في المتصفحات ، لذا فالاختيار بين
- تواصل مع بنية غير معيارية وبناء مخصص
النظام ، الذي خدم شركة Three.js جيدًا حتى الآن ولكنه يعمل كعامل كبح للنمو
على المدى البعيد- باستخدام وحدات CommonJS ، والتي تنطوي على بعض الخداع حول الدورية
التبعيات والنتائج في بناء أكبر ، أو- باستخدام وحدات ES6 ، والتي تتناسب تمامًا مع قاعدة بيانات مثل Three.js
التي لها تبعيات دورية ، والتي تؤدي إلى الأصغر والأكثر
بناء ممكن. في النهاية ، ستدعمهم المتصفحات في الأصل ،
والتغييرات المطلوبة لاستيعاب أي مراوغات غير متوقعة في اللودر
من المرجح أن تكون المواصفات تافهة مقارنة بالجهد المبذول في
الترقية من قاعدة بيانات CommonJS.تعتمد مكتبات مثل D3 وحدات ES6 لأنها تستطيع فعل ذلك بالفعل
كل ما يمكن لوحدات CommonJS القيام به (باستثناء التشغيل الأصلي في Node.js ، والذي
لا يمثل مصدر قلق حقًا لمكتبة مثل Three.js) ، وينتج عنه حجم أصغر
يبني.لقد أجريت بعض التجارب في
https://github.com/rollup/three-jsnext ، وعلى الرغم من أنه ليس إنتاجًا
جاهز (أحتاج لقضاء المزيد من الوقت في نقل الأمثلة وما إلى ذلك!) بناء UMD
هو في الواقع _أصغر_ من البناء الحالي.-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/mrdoob/three.js/issues/4776#issuecomment -168363092.
هل سيظل CommonJS ينتج عنه بنية أكبر مع قاعدة بيانات لا تحتوي على تبعيات دورية؟
cecilemuller نعم - راجع https://github.com/nolanlawson/rollup-comparison. باستخدام وحدات CommonJS ، تدفع تكلفة لكل وحدة (يجب تغليف كل وحدة في وظيفة ، وتحتاج إلى إعادة تعريف الواردات التي يتم مشاركتها عبر الحزمة ، لذلك يتم فرض عقوبات عليك مقابل قاعدة بيانات أكثر نمطية) ، وهي تكلفة لكل حزمة (يحتاج إلى محاكاة بيئة Node.js) ، وتكاليف أخرى مثل أسماء خصائص الكائن التي لا يمكن تصغيرها والتي ستكون أسماء متغيرة قابلة للتصغير في وحدات ES6. تسمح لك وحدات ES6 بالحزم مع صفر حرفيًا.
على الرغم من أنه سيكون هناك بعض النفقات العامة في التحويل ثم إلى es5. في الوقت الحاضر،
أستخدم حزمة الويب مع بابل والتي تضيف القليل جدًا. هناك تكلفة لكل وحدة
كما أنه ملفوف أيضًا في وظيفة s. يتم الإعلان عن التبعيات في النهائي
الكود عن طريق استدعاء دالة تتطلب مثل مع فهرس عدد صحيح ، لذلك يحصل
تم تصغيره إلى شيء مثل "var a = f (5)" مما كان في الأصل "import
الهندسة من ". / علم الهندسة" ؛ '
يضيف استخدام المولدات أيضًا أكثر قليلاً ، لكنني لا أتخيل هيكل
سوف يتغير الرمز كثيرًا في أي وقت قريب.
في 2 كانون الثاني (يناير) 2016 ، الساعة 5:53 صباحًا ، كتب "Rich Harris" notifications@github.com :
cecilemuller https://github.com/cecilemuller نعم - انظر
https://github.com/nolanlawson/rollup-comparison. مع وحدات CommonJS
أنت تدفع تكلفة كل وحدة (يجب تغليف كل وحدة في وظيفة ،
ويحتاج إلى إعادة إعلان الواردات المشتركة عبر الحزمة ، لذلك
تتم معاقبتك على قاعدة بيانات أكثر نمطية) ، وهي تكلفة لكل حزمة (تحتاجها
لمحاكاة بيئة Node.js) ، والتكاليف الأخرى مثل
أسماء خصائص الكائن التي من شأنها أن تكون أسماء متغيرات قابلة للتصغير في ES6
وحدات. تسمح لك وحدات ES6 بالحزم مع صفر حرفيًا.-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/mrdoob/three.js/issues/4776#issuecomment -168394376.
على الرغم من أنه سيكون هناك بعض النفقات العامة في التحويل ثم إلى es5
إذا كنت تستخدم فقط بناء جملة import
و export
لوصف العلاقة بين الوحدات ، فلا داعي لتحويل الشفرة نفسها إلى Babel أو أي شيء مشابه. فقط عندما تبدأ في إضافة ميزات ES6 أخرى (مثل الفئات ونطاق الكتلة ووظائف الأسهم وما إلى ذلك) يصبح التحويل أمرًا ضروريًا ، لذلك لا يوجد أي تكلفة إضافية لاستخدام import
و export
. D3 و PouchDB هما مثالان للمكتبات التي تستخدم import
و export
لكنهما بخلاف Babel-less ES5 ، و three-jsnext يتم بنفس الطريقة.
حسنًا ، كان لدينا جميعًا نفس الفكرة. سيكون من الرائع أن يكون لديك قصة مثل اللوداش.
أقترح إنشاء حزمة _three-foo_ لكل مكون _foo_ (على سبيل المثال three-vector2) يمكن تشكيلها ، بدون أي تغيير تقريبًا في الكود ، لذلك يمكن استيرادها في هذا الريبو دون أي تأثير.
يجب أن يلعب الأشخاص الذين ينشرون على npm أداءً جيدًا وأن يتعاونوا مع mrdoob نظرًا لأنه مبتكر هذا البرنامج الرائع ، لذلك إذا كان يريد تركيز جميع الحزم مرة أخرى مثل _babel_ author (أعني جميع الحزم الأساسية في نفس المجلد) ، يجب أن يمنحه الناشر التحكم في مساحة الاسم npm المأخوذة.
سأحاول القيام بذلك ، للحزم التي أحتاجها. دعونا نرى ما سيحدث.
لا يوجد سوى مجتمع كبير واحد :)
لم ألاحظ أي شخص يقترح فصل المكتبة تمامًا مثل
لوداش. Lodash هي مجموعة من المرافق تحت اسم شائع ؛ أنت سيارة أجرة
خذ قطعة واحدة منه واستخدمها. Threejs ليست كذلك ؛ إنه شامل
مكتبة ، معظمها عديم الفائدة دون الباقي. هناك قطع قليلة
التي يمكن فصلها ، مثل أنواع المواد المحددة الخاصة بنا
مولدات الهندسة ، ولكن هذه ستكون بالضرورة قريبة جدًا
مرتبطة بالجوهر ، ومن المحتمل أن تحتاج إلى مطابقة النسخة المطابقة. النظر
الحجم ، فإنه سيخلق صداعًا في الصيانة مع عدم وجود مكاسب قابلة للقياس.
هل ينبغي أن يوافق السيد دوب على انقسام من هذا النوع ، مع ذلك ، لا أعتقد ذلك
مناسب لأي شخص ما عدا المشرف الرسمي للمطالبة بـ threejs- *
الحزم.
بغض النظر عما سبق ، أعتقد أنه من الحكمة جعله يعمل بشكل معياري
البيئة قبل أي شيء آخر. كان هناك العديد من المشاريع مع هذا
الهدف ، ولكن يبدو أن الجميع قد تعثرت.
في 6 آذار (مارس) 2016 الساعة 11:39 صباحًا ، كتب "Gianluca Casati" notifications@github.com :
حسنًا ، كان لدينا جميعًا نفس الفكرة. سيكون من الرائع أن يكون لديك قصة مثل
لوداش.أقترح إنشاء حزمة _three-foo_ لكل مكون _foo_ (لـ
المثيل three-vector2) التي يمكن تشكيلها ، مع عدم وجود تغيير تقريبًا في
الكود ، لذلك يمكن استيراده في هذا الريبو دون أي تأثير.يجب أن يلعب الأشخاص الذين ينشرون على npm أداءً جيدًا وأن يتعاونوا معmrdoob
https://github.com/mrdoob لأنه مبتكر هذه القطعة الرائعة
من البرامج ، لذلك إذا أراد تركيز جميع الحزم مرة أخرى مثل
_babel_ ، يجب على الناشر منحه التحكم في مساحة الاسم npm المأخوذة.سأحاول القيام بذلك ، للحزم التي أحتاجها. دعونا نرى ما سيحدث.
لا يوجد سوى مجتمع كبير واحد :)
-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/mrdoob/three.js/issues/4776#issuecomment -192970867.
mattdesl : على سبيل المثال ، تستخدم تقنية إلى المكون ثلاثي التأثيرات الذي لم أقم بفحصه ،
HMUDesign : السجل المقدس.
لقد جربتها ، وبدأت من TrackballControls التي تعتمد على Vector2 و Vector3 و Quaternion وما إلى ذلك.
هناك أقسام دائرية (على سبيل المثال ، تعتمد Matrix4 على Vector3 والعكس صحيح). لا يمكن القيام بذلك إذا تم تشغيل lib (أي threejs) متجانسة.
إنه لأمر مؤسف أن نمط الوحدة بكل فوائده لا يمكن تطبيقه بسهولة على مشاريع مهمة مثل هذه.
أحاول أيضًا مع مشاريع أخرى مثل svg.js و vvvvjs وحتى x3dom ، لكن المؤلفين ليسوا مقتنعين تمامًا بهذا الاختيار الجذري فلا يمكن القيام به.
آسف على البريد العشوائي ، لكنني أردت أن أحاول بشكل استباقي: بالمناسبة بدأت مع الريبو ثلاثي المسارات.
fibo ES6 نمط الوحدة النمطية يجب ألا يواجه مشاكل مع تبعيات الدائرة afaik. ألا يتم إعداد الارتباطات قبل تنفيذ الوحدة ، تمامًا مثل الرفع في JS العادي؟
أنا متأكد من أنك رأيت هذا: https://github.com/kamicane/three-commonjsify لقد حلها بشكل مشترك.
drcmda مثير للاهتمام حقًا ،
+1 للانتقال إلى بنية معيارية.
+1
+1
drcmda على حق. تحتوي الوحدات النمطية ES6 على خطوة تهيئة وخطوة تنفيذ تسمح بالمراجع الدائرية. ومع ذلك ، بمجرد أن يكون لديك تبعيات دائرية مباشرة من سياق تنفيذ الوحدة النمطية (في المنطقة العامة للوحدة النمطية) ، فإن أول واحد يتم تحميله أثناء وقت التشغيل سيواجه قيمًا غير محددة لتبعياته. طالما يتم استخدام المراجع في سياق مختلف حيث يكون ترتيب تنفيذ وقت التشغيل مهمًا ، فإن التبعيات الدائرية ليست مشكلة.
أقترح التفكير أيضًا في حزمة الويب بدلاً من المتصفح.
gionkunz لدينا مراجع دائرية في خطوة التهيئة قبل الميلاد للنمط حيث يوجد إغلاق لإنشاء متغيرات التسويد
تم إطلاق الإصدار التجريبي من Webpack 2 للتو (https://twitter.com/TheLarkInn/status/747955723003322368/photo/1) ، لذلك يمكن أن تستفيد وحدات es6 أيضًا من اهتزاز الشجرة عند تجميعها.
تضمين التغريدة
هل كان هناك بيان رسمي في الآونة الأخيرة؟ مثل الكثيرين ، تخلينا عن ES5 وغيرات الغراء منذ وقت طويل ، ومن السيئ تمامًا مدى خروج ثلاثة عن الخط في نظام بناء حديث. ربما نستخدم 10٪ مما يمكن أن تفعله ، لكنها أكبر تبعية نقوم بشحنها.
ربما يكون هذا هو المشروع الأكثر تفضيلاً بالنسبة لي شخصيًا على Github - أتمنى بصدق إعادة النظر في الأولويات.
حسنًا ، أود معرفة المزيد من التفاصيل حول دعم المتصفح. أي المتصفحات تفعل وما لا تفعل. للمتصفحات التي لا تفعل ذلك ، ما هي الحلول وما هي عقوبات الأداء.
في الواقع ، أصبح دعم المستعرض ليس مشكلة (ربما أقل من ذلك حتى الآن). تأخذ أنظمة البناء كود ES6 هذا وتقوم بترجمته إلى es5 (في بعض الأحيان تشغل مساحة أقل من ES5 الأصلي). تنتهي أنواع معينة من الأشياء المنقولة إلى أن تكون كبيرة (بشكل أساسي: المولدات والوظائف غير المتزامنة) ، ولكن إذا تجنبت ذلك ، فلن تحصل على هذه العقوبة.
كما ذكر drcmda ، سيظل نظام البناء ينتج مخرجات متجانسة (وسيكون من السهل جدًا تخصيص ما هو مضمن في هذا الإخراج بالضبط) ، ولكن يمكن أيضًا تضمين الوحدات الفردية في مشاريعنا الخاصة ، وبالتالي فقط باستخدام الأجزاء التي نحن نحتاج. للاستفادة الكاملة من
ذلك ، يجب تعديل التبعيات البينية ، ولكن يمكن أن يحدث ذلك بمرور الوقت. أعتقد أن الميزات الرئيسية التي نريدها هي جعلها معيارية مع الاستيراد / التصدير. من وجهة نظرك ، سيمكن ذلك من استخدام الفئات على النماذج الأولية (لا يزالون يستخدمون نماذج أولية تحت الغطاء ، لذلك لا يزال بإمكانك
العبث بها عند الضرورة).
هناك عدد قليل من أنظمة البناء. سيكون تصويتي هو حزمة الويب (التي تستخدم بابل للترجمة). باستخدام babel ، يمكنك تحديد اللوادر المخصصة ، لذا يمكن تقليل نظام التقطيع الذي طورته للتظليل إلى كود glsl الفعلي بامتداد #include (أقوم بالفعل بعمل المظلات الخاصة بي بهذه الطريقة ، وسأكون سعيدًا بالمساهمة في المشروع). يحصل هذا على نفس مزايا نظامك (لا يوجد تكرار للرمز) ، ولكنه سهل الاستخدام للغاية.
أرغب في أن أكون جزءًا من مشروع الوحدات النمطية ، لكنني أعلم أن هذا لن ينجح بأي شكل من الأشكال دون دعمك (ومساعدتك المحتملة). يعرف الكثير منا كيفية استخدام المكتبة ، لكن لا أحد منا يعرف كيف يعمل داخليًا بالقدر الذي تعرفه أنت.
تنتهي أنواع معينة من الأشياء المنقولة إلى أن تكون كبيرة (بشكل أساسي: المولدات والوظائف غير المتزامنة) ، ولكن إذا تجنبت ذلك ، فلن تحصل على هذه العقوبة.
ما هو حجمها؟
أيضا ، أنت لم تتحدث عن عقوبة الأداء. أليست هذه مشكلة إذن؟
بقدر ما أستطيع أن أرى ، لا تزال واردات ES6 غير مدعومة من قبل أي متصفح ، لذلك فإن إعادة بناء الوحدة هذه ستكون أساسًا لأنظمة البناء ، أليس كذلك؟
لا تنسَ الفوائد التي تحصل عليها باستخدام أدوات مثل rollupjs ، فسيؤدي ذلك تلقائيًا إلى استبعاد جميع عمليات التصدير التي لا يستخدمها المستخدم. (وهو الافتراضي مع JSPM)
حزمة babel-polyfil ، وهي ضرورية فقط إذا كنت تستخدم
المولدات (التي ربما لا تكون منطقية حتى في هذا المشروع) أو غير متزامنة
وظائف (والتي لا أعتقد حقًا أنها ستتغير كثيرًا في المشروع
أيضًا) ، يضيف حوالي 50 كيلو بايت إلى التصميم النهائي. لكن مرة أخرى ، هذا اختياري.
فيما يتعلق بالأداء ، يعتمد الأمر حقًا على الميزات التي أنت عليها بالضبط
استخدام. على سبيل المثال ، تكون وظائف الأسهم أبطأ قليلاً ، بسبب
الارتباط الأساسي ، تكون الفئات أبطأ قليلاً في الإنشاء ، على الرغم من أن
وقت إنشاء مثيل هو نفسه. https://kpdecker.github.io/six-speed/
لا تدعم المتصفحات عمليات استيراد / تصدير ES6 ، ولكن منذ ذلك الحين
من خلال نظام البناء ، فهذه ليست مشكلة. سيكون ناتج المنتج
قابلة للاستخدام تمامًا كما هي حاليًا (حتى لو كانت متوافقة مع الإصدارات السابقة) ، ولكن
من شأنه أن يسمح بدمجها في أنظمة البناء الخاصة بنا ، وجعل
المكونات الداخلية التي يعاد استخدامها بالنسبة لنا.
شيء آخر يجب ملاحظته هو حجم البناء النهائي. حاليًا ، أشياء مثل الهندسة ،
المواد ، مش ، وما إلى ذلك هي جزء من مساحة الاسم الثلاثة. عند تصغيره ،
الإشارات إلى THREE
الشفرة. مع نظام معياري ، سيحصل كل ملف من هذه الملفات على شيء مثل
عندئذٍ يكون لدى var Geometry = require('./geometry');
إشارات إلى ملف
متغير Geometry
لاحقًا. ثم في minifaciton Geometry
و require
تم تبديل كلاهما إلى أحرف مفردة ، يتم استبدال "./ الهندسة" بـ
الرقم ، مما أدى إلى قدر كبير من التوفير. منديل الرياضيات: المصغر
بناء 511794 بايت ويحتوي على 2942 إشارة إلى
THREE\.[A-Z][a-zA-Z]+
. استبدال كل هذه بحرف واحد
يؤدي إلى تقليل حجم الملف بنسبة 10٪ تقريبًا (حتى 464،782). (ملف gziped
الأحجام هي 117،278 و 110،460 على التوالي ، بنسبة 6٪ تخفيض). البناء
من المحتمل أن يتم ضبطها لتقليل هذا بشكل أكبر.
التراكمية (التي حذفت التعليمات البرمجية غير المستخدمة من البناء النهائي) هي الخيار الافتراضي
مع jspm ، سيكون الإعداد الافتراضي مع webpack2 (وأعتقد أنه يمكن استخدامه
مع حزمة الويب). إذا تمت كتابة الأشياء بشكل نمطي ، فلا أعتقد أن هذا سيكون كذلك
مفيد ، رغم ذلك. على أي حال ، طالما أن الشفرة يمكن تحويلها باستخدام
بابل ، يمكن استخدامه في أي نظام بناء (محمل glsl الذي ذكرته
من قبل للعمل مع حزمة الويب).
في الخميس ، 7 يوليو 2016 ، الساعة 1:28 مساءً ، كتب السيد doob notifications@github.com :
تنتهي أنواع معينة من الأشياء المنقولة إلى أن تكون كبيرة (بشكل أساسي:
المولدات والوظائف غير المتزامنة) ، ولكن إذا تجنبت ذلك ، فلن يكون لديك
تلك العقوبة.ما هو حجمها؟
-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/mrdoob/three.js/issues/4776#issuecomment -231197171 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe/AA71cqAqmgxsUjpvamnI_xyL2wpzeWrdks5qTWGBgaJpZM4B4aA7
.
لست متأكدًا مما إذا كان هذا مفيدًا للغاية ، ولكن هذا هو موضوع المناقشة الخاص بـ D3 بخصوص نفس المشكلة: https://github.com/d3/d3/issues/2220. اعتمدت D3 4.0 استيراد / تصدير ES6 لإدارة الوحدات النمطية ، ولكنها لا تزال مكتوبة في ES5 (https://github.com/d3/d3/issues/2220#issuecomment-111655235).
مثيرة جداjpweeks!
إذن ... مع نهج الاستيراد / التصدير هذا ... كيف ستبدو أشياء مثل object instanceof THREE.Mesh
؟
تضمين التغريدة
import/export
هي الطريقة التي يتم بها الإعلان عن الوحدات النمطية المطلوبة. لن يؤثر / يغير الكود المحدد في الوحدات على الإطلاق:
src / كائنات / Mesh.js
// Mesh class, stays the same as today (except the export part)
var Mesh = function ( geometry, material ) {
// ...
}
export default Mesh
src / Three.js
// Library entry point, exports all files using som bundling tech
// In a "THREE" namespace for browsers
// As import three from 'three' in node
import Mesh from './objects/Mesh'
export {Mesh} // All three objects, such as Geometry, Material etc..
Application.js
// In node
import {Mesh} from 'three'
var mesh = new Mesh(geo, mat)
console.log(mesh instanceof Mesh) // true
Client.js
// In a browser
var mesh = new THREE.Mesh(geo, mat)
console.log(mesh instanceof THREE.Mesh) // true
هذا مفيد للغاية GGAlanSmithee! شكرا!
أنا شخص مرئي ، لذا فإن أمثلة الشفرات الزائفة تقنعني أكثر من مجرد أجزاء كبيرة من النص 😅
حسنًا ، لذلك سيتطلب الأمر القليل من إعادة البناء ...
هل يعرف أحد ما إذا كان مترجم الإغلاق يخطط لدعم هذا؟
حسنًا ، لذلك سيتطلب الأمر القليل من إعادة البناء ...
حصلت عليك! منذ أن أصبح هذا الموضوع مفعمًا بالحيوية خلال اليومين الماضيين ، كنت أعمل أكثر قليلاً على three-jsnext . إنه مشروع يأخذ قاعدة الكود Three.js الحالية ويحولها إلى وحدات ES تلقائيًا. مجرد الجدل مع اثنين من التبعيات الدورية الصعبة (خاصة حول KeyframeTrack
) ، ولكن يجب أن يكون لديك شيء لمشاركته بشكل حقيقي قريبًا. بقدر ما أستطيع أن أقول ، تستمر جميع الأمثلة في العمل ، والبناء المصغر أصغر من الإصدار الحالي (باستخدام Rollup لإنشاء ملف UMD) ، لذا فهذه كلها أخبار جيدة.
حسنًا ، لقد فتحت طلب سحب لهذا: # 9310
تضمين التغريدة
لدينا مكتبة قيد الإنتاج تم تنظيمها بشكل أو بآخر مثل ثلاثة. يعمل في المتصفحات والبيئات المعيارية. قاعدة الشفرة هي ES6 لكن المتصفحات ليست مصدر قلقك على الإطلاق.
يمكنك شحن هذا على npm _as_ ، حيث تم تضمين جميع الوحدات + متراصة مستعرض لمساحة الاسم العالمية مجمعة (three.js). كل من يحتاج إلى استخدام أجزاء فردية منه يستخدم أدوات لإنشاء الحزم.
ضع في اعتبارك هيكلًا مثل هذا:
/src
classA.js
classB.js
classC.js
/index.js
/browser.js
يقوم index.js ببساطة بإعادة تصدير جميع الوحدات والوظائف في ملف واحد:
export ClassA from './src/classA';
export ClassB from './src/classB';
export ClassC from './src/classC';
لذلك يمكن للمستخدم النهائي تثبيت npm lib واستخدامه فقط دون أي مزيد من اللغط:
// all exports from index.js will be under: mylib.ClassA, etc.
import * as mylib from 'libname':
// selected exports from index.js
import { ClassA, ClassC } from 'libname';
// or, specific modules
import ClassB from 'libname/src/classB'
سيكون browser.js الجزء الوحيد المترجم من الحزمة. عادةً ما يتم نقلها إلى ES5 عبر Babel وتصديرها إلى مساحة أسماء عالمية بحيث يمكن استخدامها كنص. يمكن لـ Rollup و Webpack وما إلى ذلك إنشاء هذا بسهولة.
mrdoob كانت رحلة رائعة 🚀
التعليق الأكثر فائدة
حصلت عليك! منذ أن أصبح هذا الموضوع مفعمًا بالحيوية خلال اليومين الماضيين ، كنت أعمل أكثر قليلاً على three-jsnext . إنه مشروع يأخذ قاعدة الكود Three.js الحالية ويحولها إلى وحدات ES تلقائيًا. مجرد الجدل مع اثنين من التبعيات الدورية الصعبة (خاصة حول
KeyframeTrack
) ، ولكن يجب أن يكون لديك شيء لمشاركته بشكل حقيقي قريبًا. بقدر ما أستطيع أن أقول ، تستمر جميع الأمثلة في العمل ، والبناء المصغر أصغر من الإصدار الحالي (باستخدام Rollup لإنشاء ملف UMD) ، لذا فهذه كلها أخبار جيدة.