ฉันควรใช้ require () และเมื่อใดควรใช้ define ()?


316

ฉันได้เล่นรอบกับ requirejs ในช่วงไม่กี่วันที่ผ่านมา ฉันพยายามเข้าใจความแตกต่างระหว่างการกำหนดและการกำหนด

กำหนดดูเหมือนว่าจะอนุญาตให้มีการแยกโมดูลและอนุญาตให้มีการเรียงลำดับการพึ่งพา แต่มันจะดาวน์โหลดไฟล์ทั้งหมดที่จำเป็นต้องเริ่มด้วย ในขณะที่ต้องการเพียงโหลดสิ่งที่คุณต้องการเมื่อคุณต้องการมัน

สามารถใช้ทั้งสองนี้ร่วมกันได้และใช้เพื่อวัตถุประสงค์อะไร

คำตอบ:


331

เมื่อdefineคุณลงทะเบียนโมดูลใน require.js ที่คุณสามารถขึ้นอยู่กับคำจำกัดความของโมดูลอื่น ๆ หรือต้องการคำสั่ง ในขณะที่requireคุณ "เพิ่ง" โหลด / ใช้โมดูลหรือไฟล์จาวาสคริปต์ที่สามารถโหลดได้โดย require.js สำหรับตัวอย่างได้ดูเอกสารประกอบ

กฎง่ายๆของฉัน:

  • กำหนด: หากคุณต้องการประกาศโมดูลส่วนอื่น ๆ ของแอปพลิเคชันของคุณจะขึ้นอยู่กับ

  • ต้องการ: หากคุณต้องการโหลดและใช้งาน


331

จากซอร์สโค้ด require.js (บรรทัด 1902):

/**
 * The function that handles definitions of modules. Differs from
 * require() in that a string for the module should be the first argument,
 * and the function to execute after dependencies are loaded should
 * return a value to define the module corresponding to the first argument's
 * name.
 */

define()ฟังก์ชั่นยอมรับพารามิเตอร์สองตัวเลือก (สตริงที่เป็นตัวแทน ID โมดูลและอาเรย์ของโมดูลที่จำเป็นต้องใช้) และพารามิเตอร์หนึ่งที่ต้องการ (วิธีโรงงาน)

การคืนค่าของวิธีการจากโรงงานต้องส่งคืนการใช้งานสำหรับโมดูลของคุณ (ในลักษณะเดียวกับที่รูปแบบโมดูลทำ)

require()ฟังก์ชั่นไม่ได้ที่จะกลับมาดำเนินงานของโมดูลใหม่

การใช้define()คุณจะถามอะไรเช่น"ใช้ฟังก์ชั่นที่ฉันผ่านเป็นพารามิเตอร์และกำหนดสิ่งที่จะกลับไปยังหมายเลขที่ฉันผ่าน แต่ก่อนที่จะตรวจสอบว่าการอ้างอิงเหล่านี้จะเต็ม"

การใช้require()ที่คุณพูดสิ่งที่ชอบ"ฟังก์ชั่นที่ผมผ่านมีการอ้างอิงต่อไปนี้ให้ตรวจสอบว่าการอ้างอิงเหล่านี้จะเต็มก่อนที่จะใช้มัน"

require()ฟังก์ชั่นที่คุณใช้โมดูลที่คุณกำหนดในการสั่งซื้อเพื่อให้แน่ใจว่าโมดูลจะมีการกำหนด แต่คุณจะไม่ได้รับการกำหนดโมดูลใหม่มี


2
มีความแตกต่างว่าต้องการใช้ภายในโมดูล define'd หรือภายนอกหรือไม่ หากใช้ภายในโมดูลทำไมไม่ตั้งค่าข้อกำหนดในข้อกำหนดโมดูลแทนที่จะใช้ต้องใช้?
Petri

เหตุใดคำตอบนี้จึงแตกต่างกับสิ่งที่ฉันอ่านที่นี่requirejs.org/docs/api.html#deffunc ??
James Lin

2
@ Petri ดูเหมือนว่าคุณจะต้องการพฤติกรรมรุ่น 2 ของการโหลดโมดูลแบบอะซิงโครนัส "RequireJS 2.0 จะไม่เรียกใช้งานฟังก์ชั่นจากโรงงานของโมดูล (ฟังก์ชั่นที่ส่งไปยังdefine()) จนกว่าจะมีการrequire([])เรียกที่ขอหรือสิ่งที่ขึ้นอยู่กับมัน" github.com/jrburke/requirejs/wiki/…
alxndr

2

"define" วิธีการอำนวยความสะดวกในการกำหนดโมดูลและวิธีการ "ต้องการ" สำหรับการจัดการโหลดอ้างอิง

define ใช้เพื่อกำหนดโมดูลที่มีชื่อหรือที่ไม่มีชื่อตามข้อเสนอโดยใช้ลายเซ็นต่อไปนี้:

define(
module_id /*optional*/, 
[dependencies] /*optional*/, 
definition function /*function for instantiating the module or object*/
);

ต้องการโดยทั่วไปจะใช้ในการโหลดรหัสในไฟล์ JavaScript ระดับบนสุดหรือภายในโมดูลหากคุณต้องการดึงการอ้างอิงแบบไดนามิก

อ้างถึงhttps://addyosmani.com/writing-modular-js/สำหรับข้อมูลเพิ่มเติม


2

กฎทั่วไป:

  1. คุณใช้ define เมื่อคุณต้องการกำหนดโมดูลที่จะนำกลับมาใช้ใหม่

  2. คุณใช้ต้องการเพียงแค่โหลดอ้างอิง

    //sample1.js file : module definition 
    define(function() {
          var sample1 = {};
          //do your stuff
         return sample1;
     });
    
    //sample2.js file : module definition and also has a dependency on jQuery and sample1.js
    define(['jquery', 'sample1'], function($,sample1) {
        var sample2 = {
            getSample1:sample1.getSomeData();
        };
        var selectSomeElement = $('#someElementId');
        //do your stuff....
        return sample2;
    });
    
    //calling in any file (mainly in entry file)
    require(['sample2'], function(sample2) {
        // sample1 will be loaded also
    });
    

หวังว่านี่จะช่วยคุณได้


1

ต้องการ () และ define () ทั้งสองที่ใช้ในการโหลด dependencies มีความแตกต่างที่สำคัญระหว่างทั้งสองวิธี

Guys มันง่ายมาก

Require (): วิธีการใช้เพื่อเรียกใช้ฟังก์ชันการทำงานทันที define (): เมธอดใช้เพื่อกำหนดโมดูลสำหรับใช้ในหลาย ๆ ที่ (ใช้ซ้ำ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.