إنه خيار، لكن في سياق تطوري وعملي، لا يُعد خيارًا عمليًا، ولا أستخدمه شخصيًا لأن Vue يبدو مناسبًا بشكل طبيعي لمثل هذه التطبيقات.
بعض السياق فقط:
خلال الأشهر القليلة الماضية، كنت أعمل على تطوير سمة (Theme) مخصصة للغاية لعميل، حيث تعلمت الكثير حول الآليات الداخلية لـ Discourse، لكن هذا على الأرجح يمثل نسبة صغيرة فقط.
حاليًا، أقوم بإعادة هيكلة مجموعة من الأخطاء التي ارتكبتها في البداية، وأحاول جعل الأمور ودية قدر الإمكان لزملاء المستقبل الذين قد ينتهي بهم الأمر بصيانة عملي. لهذا السبب، قمت ببعض التجارب فيما يتعلق بـ JSX.
اليوم، جربت النهج المذكور في المنشور الأول في الموضوع. لقد قمت بتضمين transform-react-jsx هنا: https://github.com/discourse/discourse/blob/master/lib/discourse_js_processor.rb#L143-L149:
if opts[:module_name] && !@skip_module
filename = opts[:filename] || 'unknown'
"Babel.transform(#{js_source}, { moduleId: '#{opts[:module_name]}', filename: '#{filename}', ast: false, presets: ['es2015'], plugins: [['transform-es2015-modules-amd', {noInterop: true}], 'transform-decorators-legacy', 'transform-react-jsx', exports.WidgetHbsCompiler] }).code"
else
"Babel.transform(#{js_source}, { ast: false, plugins: ['check-es2015-constants', 'transform-es2015-arrow-functions', 'transform-es2015-block-scoped-functions', 'transform-es2015-block-scoping', 'transform-es2015-classes', 'transform-es2015-computed-properties', 'transform-es2015-destructuring', 'transform-es2015-duplicate-keys', 'transform-es2015-for-of', 'transform-es2015-function-name', 'transform-es2015-literals', 'transform-es2015-object-super', 'transform-es2015-parameters', 'transform-es2015-shorthand-properties', 'transform-es2015-spread', 'transform-es2015-sticky-regex', 'transform-es2015-template-literals', 'transform-es2015-typeof-symbol', 'transform-es2015-unicode-regex', 'transform-regenerator', 'transform-decorators-legacy', 'transform-react-jsx',exports.WidgetHbsCompiler] }).code"
end
وتغيير إعداد الـ pragma في vendor/assets/javascripts/babel.js في السطر 26586
var id = state.opts.pragma || "React.createElement";
// إلى
var id = state.opts.pragma || "h";
هذا سمح لي باستخدام الدالة h من virtual-dom بدلاً من React.createElement في الكود الذي تمت معالجته بواسطة Babel. الدالة h جزء من Discourse، وشعرت أن هذا مناسب بشكل طبيعي.
لا أعرف تاريخ تطوير Discourse، وعلى الأرجح كان لديك أسبابك لإضافة ملف babel.js كامل مع مجموعة من الإضافات المفيدة في الكود. من المؤسف أن هذه الإضافات غير متاحة لمطور المستخدم النهائي مثلي. لذا، فإن مقترحي هو:
-
استخدام نوع من ملفات إعدادات Babel، مثل .babelrc أو .babel.yml، أو تحديد حقل إعدادات Babel في about.json كما هو الحال في package.json Configure Babel · Babel. يمكن لهذا الملف المرجعي أن يشير إلى جميع هذه الإضافات في babel.js (أو ربما إضافات أخرى، انظر النقطة 3).
-
في discourse_js_processor.rb#babel_parse https://github.com/discourse/discourse/blob/master/lib/discourse_js_processor.rb#L138، قم بقراءة هذا الملف وقم بدمجه مع الإعدادات الحالية.
-
إذا أراد المطور إضافة إضافة Babel مخصصة، فيمكنه إضافتها إلى مجلد vendor/assets/javascripts/babel/plugins الخاص به (أو مجلد babel/plugins ببساطة)، وسيتم التقاطها من قبل Discourse واستخدامها في عملية الترجمة.
لست خبيرًا في تطوير الواجهة الخلفية (Backend) باستخدام Rails، لذا هذا هو مقترحي العام.
وسؤال آخر، بينما نحن بصدد الحديث، ما مدى صعوبة قيام Discourse بقراءة التبعيات من ملف package.json الخاص بالسمات مثلاً، وتثبيتها عند التشغيل الأول، واستخدامها (تخزينها مؤقتًا أو ما شابه) داخل السمة؟ (إذا تغيرت التبعيات، تحقق من المتغير منها وقم بتثبيتها أو إزالتها، إلخ).
مرة أخرى، أنتم تقومون بعمل رائع وعملكم مذهل. من فضلكم، لا تشعروا بأي ضغط من جانبي، أنا هنا فقط للتعلم وللمشاركة في مناقشة جيدة وتبادل الآراء والأفكار. لا أتوقع منكم تنفيذ طلبيات أو أي شيء آخر.