ฉันกำลังสร้างองค์ประกอบ Bower แรกของฉัน หลังจากเรียกใช้bower initสคริปต์ถามฉันว่า 'แพคเกจนี้เปิดเผยโมดูลประเภทใด?' ด้วยตัวเลือกเหล่านี้:
- เอเอ็มดี
 - ES6
 - Globals
 - ปม
 
ความแตกต่างระหว่างตัวเลือกเหล่านี้คืออะไร?
ฉันกำลังสร้างองค์ประกอบ Bower แรกของฉัน หลังจากเรียกใช้bower initสคริปต์ถามฉันว่า 'แพคเกจนี้เปิดเผยโมดูลประเภทใด?' ด้วยตัวเลือกเหล่านี้:
ความแตกต่างระหว่างตัวเลือกเหล่านี้คืออะไร?
คำตอบ:
หากคุณไม่รู้ก็เป็นไปได้ว่าคำตอบที่ถูกต้องสำหรับคุณ
ไม่ว่าจะด้วยวิธีใดคุณต้องเข้าใจ:
ฟีเจอร์นี้เปิดตัวเมื่อไม่นานมานี้และไม่ได้รับการบันทึก (AFAIK) มันอธิบายหลักmoduleTypeซึ่งระบุถึงสิ่งที่เทคโนโลยีโมดูลแพคเกจจะหมายถึงการบริโภค (ดูด้านบน)
ตอนนี้มันไม่มีผลใด ๆ นอกเหนือจากการตั้งค่าmoduleTypeคุณสมบัติในbower.jsonไฟล์ของแพ็คเกจ
ดูhttps://github.com/bower/bower/pull/934สำหรับคำขอดึงแบบดั้งเดิม
จุดเพิ่มเติมเล็กน้อยเพื่อตอบความคิดเห็น:
moduleTypeคุณสมบัติ - ซึ่งหมายความว่าผู้คนได้รับอนุญาตทางเทคนิคให้ใช้สิ่งที่พวกเขาต้องการตามตัวอักษรรวมถึงangularjsหากพวกเขารู้สึกอยากจะทำเช่นนั้นnon-interoperable/proprietary moduleTypes(คิดว่านักแต่งเพลงเชิงมุม ฯลฯ ) - ซึ่งเป็นที่เข้าใจได้อย่างง่ายดายอีกครั้ง แต่ยังไม่มีอะไรจริงๆป้องกันไม่ให้คนจากการใช้moduleTypeค่าที่พวกเขาต้องการyui moduleTypeดังนั้นจึงมี "ข้อยกเว้น" ที่จะทำสมมติว่าพวกเขาเป็นส่วนหนึ่งของแผนร่วมกันฉันจะทำอย่างไรถ้าฉันจะเขียนแพ็คเกจสำหรับผู้จัดการแพ็คเกจที่ไม่อยู่ในรายการและเผยแพร่บน bower?
ฉันจะเขียนโมดูล es6 และใช้ / patch es6-transpilerเพื่อแสดงผลรูปแบบแพ็คเกจที่ฉันต้องการ จากนั้นฉันก็จะ / และ:
es6เป็นmoduleTypeข้อจำกัดความรับผิดชอบ: ฉันไม่มีประสบการณ์ในชีวิตจริงที่เขียนโมดูลเชิงมุม
angularjsในตัวเองฉันอาจใช้globalsใช่ แต่อ่านอัปเดตของฉัน หวังว่าจะช่วย
                    ฉันใช้bower initเป็นครั้งแรกด้วย
ตัวเลือกควรอ้างอิงถึงวิธีต่างๆในการทำให้เป็นมาตรฐานรหัส JavaScript:
defineเช่น likejrequireNode.jsในกรณีของฉันฉันเขียนโมดูล Node.js dflowแต่ฉันใช้ browserify เพื่อสร้างอ / dflow.jsไฟล์ว่าการส่งออกทั่วโลกdflow var: ดังนั้นผมจึงเลือกGlobals
คำสั่งที่ฉันใช้เพื่อทำให้เบราว์เซอร์ dflowเป็นวัตถุโกลบอลของหน้าต่าง
browserify -s dflow -e index.js -o dist/dflow.js
ฉันเปลี่ยนมันทำให้ฉันชอบที่จะใช้ต้องมีภายในเบราว์เซอร์ดังนั้นตอนนี้ฉันกำลังใช้
browserify -r ./index.js:dflow -o dist/dflow.js
ดังนั้นฉันจึงเปลี่ยนbower.moduleTypeเป็นโหนดในไฟล์bower.jsonของฉัน
แรงจูงใจหลักคือว่าถ้าชื่อโมดูลของฉันมีประตัวอย่างเช่นโครงการของฉันไหลมุมมองฉันต้องcamelizeชื่อระดับโลกในflowView
วิธีการใหม่นี้มีประโยชน์สองประการ:
${npm_package_name}ตัวแปรและเขียนเมื่อสคริปต์ที่ฉันใช้เพื่อเบราว์เซอร์นี่เป็นอีกหัวข้อ แต่คุณควรพิจารณาว่ามันมีประโยชน์อย่างไรกับประโยชน์หลัง: ให้ฉันแบ่งปันnpm.scripts.browserifyคุณลักษณะที่ฉันใช้ในpackage.jsonของฉัน 
"browserify": "browserify -r ./index.js:${npm_package_name} -o dist/${npm_package_name}.js"
define(function(require, exports, module) {   "use strict";    module.exports = {     Collection: require("./collection"),     View: require('./view')   }; });
                    สำหรับการอ้างอิงนี่เป็นสิ่งที่ Bower ระบุเกี่ยวกับประเภทโมดูล:
ประเภทของโมดูลที่กำหนดไว้ใน
mainไฟล์ JavaScript สามารถเป็นหนึ่งหรืออาร์เรย์ของสตริงต่อไปนี้:
globals: โมดูล JavaScript ที่เพิ่มในเนมสเปซส่วนกลาง, การใช้window.namespaceหรือthis.namespaceไวยากรณ์amd: โมดูล JavaScript ที่เข้ากันได้กับ AMD เช่นRequireJSโดยใช้define()ไวยากรณ์node: โมดูล JavaScript เข้ากันได้กับโหนดและCommonJSโดยใช้module.exportsไวยากรณ์es6: โมดูล JavaScript ใช้งานร่วมกับโมดูล ECMAScript 6 , การใช้exportและimportไวยากรณ์yui: โมดูล JavaScript ใช้งานร่วมกับโมดูล YUIได้โดยใช้YUI.add()ไวยากรณ์
ลิงค์ที่เกี่ยวข้อง: https://github.com/bower/spec/blob/master/json.md#moduletype