RequireJS - คู่มือฉบับย่อ

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

RequireJS ได้รับการพัฒนาโดย David Mark และเวอร์ชันเริ่มต้น v1.0.0 ได้รับการเผยแพร่ในปี 2009 เป็นโอเพ่นซอร์สและเวอร์ชัน 2.3.3 เป็นเวอร์ชันเสถียรล่าสุด

ทำไมต้องใช้ RequireJS?

  • เป็นไลบรารี JavaScript โอเพ่นซอร์สภายใต้ใบอนุญาต MIT

  • ให้โหลดโมดูลแบบอะซิงโครนัส

  • มีความสามารถในการโหลดการอ้างอิงที่ซ้อนกัน

  • หากคุณมีไฟล์ขนาดเล็กจำนวนมากไม่ต้องกังวลกับการติดตามลำดับการอ้างอิง

  • ให้การสนับสนุนปลั๊กอินและโหลดไฟล์ JavaScript มากกว่าหนึ่งไฟล์

คุณสมบัติของ RequireJS

  • จัดการการอ้างอิงระหว่างไฟล์ JavaScript และปรับปรุงความเร็วและคุณภาพของโค้ด

  • มันรวมและย่อโมดูลลงในสคริปต์เดียวเพื่อประสบการณ์ที่ดีที่สุด

  • ช่วยลดความซับซ้อนของโค้ดในแอปพลิเคชันขนาดใหญ่

  • รวบรวมไฟล์ JavaScript ที่แตกต่างกันจากโมดูลต่างๆในขณะคอมไพล์

  • ช่วยให้สามารถดีบักได้ง่ายเนื่องจากโหลดไฟล์จากแท็กสคริปต์ธรรมดา

ในบทนี้เราจะเข้าใจวิธีการตั้งค่าสภาพแวดล้อมสำหรับ RequireJS สำหรับสิ่งนี้คุณต้องดาวน์โหลดไลบรารี RequireJS เวอร์ชันล่าสุด คุณสามารถดาวน์โหลดทั้งรุ่น minifiedหรือรุ่นรายละเอียด

หลังจากดาวน์โหลดเราจะต้องรวมไฟล์ require.js ไฟล์ในโฟลเดอร์ libs ของคุณและโครงสร้างของโครงการของคุณควรเป็นดังที่แสดงด้านล่าง -

projectname/
|--index.html
|--libs/
   |---main.js
   |---require.js
   |---helper/
      |----util.js

เราจำเป็นต้องกำหนดไฟล์ html เป็น index.html โดยที่ RequireJS ถูกโหลดตามที่แสดงด้านล่าง

<html>
   <head>
      <script data-main = "libs/main" src = "libs/require.js"></script>
   </head>
   
   <body>
      <h1> RequireJS Sample Page </h1>
   </body>
</html>

โปรดทราบว่าเท่านั้น require.js ด้วยการเรียก RequireJS จะรวมอยู่ในแท็กสคริปต์เพื่อโหลดสคริปต์

RequireJS ในโหนด

มีสองวิธีในการรับ Node adapter

  • npm - คุณสามารถติดตั้ง requirejs รุ่นล่าสุดจากพรอมต์คำสั่งดังที่แสดงด้านล่าง

npm install requirejs
  • ดาวน์โหลด r.js - คุณสามารถดาวน์โหลดไฟล์ r.jsไฟล์จากหน้าดาวน์โหลดและแหล่งที่มาจากr.js เพจที่เก็บ

RequireJS สามารถเตรียมใช้งานได้โดยส่งผ่านคอนฟิกูเรชันหลักในเทมเพลต HTML ผ่านdata-main attribute RequireJS ใช้เพื่อทราบว่าจะโหลดโมดูลใดในแอปพลิเคชันของคุณ

ตัวอย่างเช่น -

<script data-main = "scripts/main" src = "scripts/require.js"></script>

ในการรวมไฟล์ Require.js คุณต้องเพิ่มแท็กสคริปต์ในไฟล์ html ภายในแท็กสคริปต์ให้เพิ่มไฟล์data-mainเพื่อโหลดโมดูล สิ่งนี้สามารถใช้เป็นจุดเริ่มต้นของแอปพลิเคชันของคุณได้ สคริปต์ / หลักเป็นไฟล์ JavaScript หลักของแอพลิเคชันที่มีการกำหนดค่า RequireJS

ตัวเลือกการกำหนดค่า

ต่อไปนี้เป็นตัวเลือกการกำหนดค่าที่สามารถตั้งค่าได้ในขณะโหลดโมดูลแอปพลิเคชันแรก -

  • baseUrl- เป็นเส้นทางเส้นทางสำหรับโมดูลทั้งหมดที่โหลดผ่าน RequireJS baseUrl ถูกระบุด้วยสตริงที่ขึ้นต้นด้วย "slash (/)" ซึ่งมีโปรโตคอลและลงท้ายด้วยนามสกุล ".js" หากไม่มีการระบุ baseUrl ดังนั้น RequireJS จะใช้เส้นทางแอตทริบิวต์data-mainเป็น baseUrl

  • paths- ระบุการแมปพา ธ สำหรับโมดูลที่สัมพันธ์กับ baseUrl โดยจะเพิ่มนามสกุล. js ไปยังพา ธ โดยอัตโนมัติเมื่อแมปชื่อโมดูล

  • shim - ให้การใช้งานไลบรารีที่ไม่ใช่ AMD กับ RequireJS โดยกำหนดค่าการอ้างอิงและส่งออกค่าส่วนกลาง

  • map - สำหรับโมดูลที่กำหนดแอปพลิเคชันจะใช้โมดูลเวอร์ชันเดียวกันสำหรับวัตถุประสงค์ที่แตกต่างกันโดยการแบ่งปันรหัสเพื่อใช้รหัสเดียวกันสำหรับเงื่อนไขที่แตกต่างกัน

  • config- จัดเตรียมการกำหนดค่าให้กับโมดูลโดยใช้ตัวเลือกconfigและสามารถทำได้โดยใช้ "โมดูล" ที่พึ่งพาพิเศษและเรียกใช้module.config() ฟังก์ชัน

  • urlArgs- อาร์กิวเมนต์สตริงแบบสอบถามใช้เพื่อดึงทรัพยากรทั้งหมดที่โหลดโดยใช้ RequireJS ใช้สำหรับการป้องกันแคชเมื่อมีการกำหนดค่าเบราว์เซอร์หรือเซิร์ฟเวอร์ที่ไม่เหมาะสม

  • waitSeconds- ระบุจำนวนวินาทีที่ต้องรอก่อนที่จะโหลดสคริปต์ ค่าเริ่มต้นคือ "7" วินาทีและ "0" ปิดใช้งานการหมดเวลา

  • packages - มีแพ็คเกจ CommonJS สำหรับกำหนดค่าโมดูลการโหลด

  • context - มีชื่อสำหรับการโหลดบริบทซึ่งอนุญาตให้โหลดโมดูลต่างๆในหน้า

  • deps - เป็นอาร์เรย์ของการอ้างอิงที่จำเป็นเมื่อต้องการระบุเป็นวัตถุ config ก่อนที่จะโหลด RequireJS

  • callback - เรียกใช้ฟังก์ชันหลังจากโหลดการอ้างอิงและจำเป็นเมื่อกำหนด Require เป็นวัตถุ config ก่อนที่จะโหลด RequireJS

  • xhtml - ใช้เพื่อสร้างองค์ประกอบสคริปต์โดยใช้ไฟล์ document.createElementNS()วิธีการเมื่อตัวเลือกนี้ถูกตั้งค่าเป็นจริง

  • scriptType- กำหนดค่าสำหรับแอตทริบิวต์ประเภทสคริปต์ที่ใช้ในเอกสาร ประเภทเริ่มต้นคือ "text / javascript"

  • skipDataMain- มันข้ามสแกนแอตทริบิวต์ข้อมูลหลักในขณะที่โหลดโมดูลถ้าตัวเลือกนี้ถูกกำหนดเป็นจริง

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

การกำหนดโมดูล

โมดูลถูกกำหนดโดยใช้ define()ฟังก์ชัน; ฟังก์ชันเดียวกันนี้ใช้สำหรับโหลดโมดูลด้วย

ชื่อง่าย / คู่ค่า

หากโมดูลเป็นเพียงชุดของคู่ชื่อและค่าคุณสามารถใช้ไวยากรณ์ต่อไปนี้ -

define({
   state: "karnataka",
   city: "bangalore"
});

การกำหนดฟังก์ชัน

โมดูลยังสามารถใช้ฟังก์ชันสำหรับเฟรมเวิร์กได้โดยไม่ต้องพึ่งพา ซึ่งสามารถทำได้โดยใช้ไวยากรณ์ต่อไปนี้ -

define(function () {
   
   //Do setup work here
   return {
      state: "karnataka",
      city: "bangalore"
   }
});

การกำหนดฟังก์ชันด้วยการอ้างอิง

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

define(["./mnc", "./startup"], 
   function(mnc, startup) {
        
      return {
         state: "karnataka",
         city: "bangalore",
      
         addCompany: function() {
            mnc.decrement(this);
            startup.add(this);
         }
      
      }
   }
);

การกำหนดโมดูลเป็นฟังก์ชัน

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

define(["./mnc", "./startup"],
   function(mnc, startup) {
       
      return function(title) {
         return title ? (window.title = title) :
         startup.storeName + ' ' + mnc.name;
      }
      
   }
);

การกำหนดโมดูลด้วยชื่อ

ในบางกรณีคุณอาจต้องใส่ชื่อโมดูลเป็นอาร์กิวเมนต์แรก define(). ซึ่งสามารถทำได้โดยใช้ไวยากรณ์ต่อไปนี้ -

define("js2/title",
   ["js1/mnc", "js1/startup"],
   
   function(mnc, startup) {
      //Define js2/title object in here.
   }
   
);

กำลังโหลดโมดูล

define ()ฟังก์ชั่นที่สามารถใช้ในการโหลดโมดูล (โมดูลสามารถเป็นวัตถุฟังก์ชั่นชั้นเรียนหรือรหัสซึ่งจะดำเนินการหลังจากที่โหลดโมดูลก) คุณสามารถโหลดโมดูลเดียวกันเวอร์ชันต่างๆได้ในหน้าเดียวกัน สามารถวิเคราะห์เวอร์ชันต่างๆในลำดับเดียวกันได้แม้ว่าจะโหลดในลำดับที่ต่างกันก็ตาม

ไวยากรณ์

define(['module1', 'module2'], function (module1, module2) {
   //define the module value by returning a value
   return function () {};
});

คุณสามารถส่งผ่านรายการชื่อโมดูลเมื่อคุณกำหนดโมดูลและสามารถใช้ RequireJS เพื่อดึงข้อมูลโมดูลเหล่านี้ก่อนที่จะเรียกใช้โมดูล โมดูลเหล่านี้สามารถส่งผ่านเป็นพารามิเตอร์ของdefinition function.

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงการใช้ฟังก์ชันdefine ()ขณะโหลดโมดูล สร้างไฟล์ html ด้วยชื่อindex.htmlและวางโค้ดต่อไปนี้ -

<!DOCTYPE html>
<html>
   <head>
      <title>Define() Function</title>
      <script data-main = "main" src = "require.js"></script>
   </head>
   
   <body>
      <h2>RequireJS Define() Function Example</h2>
   </body>
</html>

สร้างไฟล์ jsไฟล์ที่มีชื่อmain.jsและเพิ่มรหัสต่อไปนี้ -

define(function (require) {
   var myteam = require("./team");
   var mylogger = require("./player");
   alert("Player Name : " + myteam.player);
   mylogger.myfunc();
});

ตอนนี้สร้างอีกสอง jsไฟล์ที่มีชื่อteam.jsและplayer.jsและวางรหัสต่อไปนี้ตามลำดับ -

team.js

define({
   player: "Sachin Tendulkar",
   team : "India"
});

player.js

define(function (require) {
   var myteam = require("./team");

   return {
      myfunc: function () {
         document.write("Name: " + myteam.player + ", Country: " + myteam.team);
      }
   };
});

เอาต์พุต

เปิดไฟล์ HTML ในเบราว์เซอร์ คุณจะได้รับผลลัพธ์ดังภาพหน้าจอต่อไปนี้ -

คลิกที่ปุ่ม "ตกลง" คุณจะได้รับผลลัพธ์จากโมดูลอื่น -

ในบทนี้เราจะพูดถึงการเพิ่มประสิทธิภาพใน RequireJS Optimizer ใน RequireJS มีลักษณะดังต่อไปนี้ -

  • รวมไฟล์สคริปต์เข้าด้วยกันด้วยความช่วยเหลือของUglifyJSสำหรับการใช้งานดีฟอลต์หรือClosure Compilerสำหรับการใช้งาน Java

  • รวมไฟล์ CSS เข้าด้วยกัน

เครื่องมือเพิ่มประสิทธิภาพเป็นส่วนประกอบของไฟล์ r.jsอะแดปเตอร์สำหรับNode และ Nashorn ได้รับการพัฒนาเพื่อเป็นส่วนหนึ่งของกระบวนการสร้างไม่ใช่สำหรับกระบวนการพัฒนา

ตัวอย่าง

หลังจากดาวน์โหลดr.jsในโฟลเดอร์โครงการของคุณโครงสร้างของโฟลเดอร์ควรมีลักษณะดังที่ระบุด้านล่าง -

projectfolder/
   |-->index.html
   |-->CSS/
      |--->main.css
      |--->other.css
   |-->libs
      |--->require.js
      |--->main.js
         |--->dependent1.js
         |--->dependent2.js
         |--->dependent3.js

ไฟล์ HTML ของคุณจะมีลักษณะดังที่แสดงด้านล่าง -

<html>
   <head>
      <script data-main = "libs/main" src = "libs/require.js"></script>
   </head>
   
   <body>
      <h1> RequireJS Sample Page </h1>
   </body>
</html>

ไฟล์main.jsของคุณจะมีลักษณะดังที่แสดงด้านล่าง -

require(["dependent1", "dependent2", "dependent3"], function (dependent1, dependent2, 
   dependent3) {
});

ไฟล์main.cssของคุณจะมีลักษณะดังที่แสดงด้านล่าง -

@import url("other.css");

.app {
   background: transparent url(../../img/app.png);
}

การตั้งค่าพื้นฐานของเครื่องมือเพิ่มประสิทธิภาพ

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

ต่อไปนี้เป็นไวยากรณ์สำหรับบรรทัดคำสั่ง -

node r.js -o baseUrl = . paths.jquery = content/path/jquery 
   name = main out = main-built.js

ต่อไปนี้เป็นไวยากรณ์สำหรับการสร้างโปรไฟล์ -

({
   baseUrl: ".",
  
   paths: {
      jquery: "content/path/jquery"
   },
   
   name: "main",
   out: "main-built.js"
})

หลังจากนี้คุณสามารถส่งต่อชื่อโปรไฟล์การสร้างไปยังเครื่องมือเพิ่มประสิทธิภาพในบรรทัดคำสั่งดังที่แสดงด้านล่าง -

node r.js -o build.js

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

การเพิ่มประสิทธิภาพไฟล์ JS เดียว

ในการเพิ่มประสิทธิภาพไฟล์ JS เดียวคุณต้องสร้างไฟล์ JS ที่มีเนื้อหาของการอ้างอิงทั้งหมด ไฟล์ของคุณควรมีลักษณะดังที่ระบุด้านล่าง -

({
   baseUrl: "js/shop",
   paths: {
      "jquery": "jquery",
      "backbone": "backbone",
      "underscore": "underscore"
   },
   
   shim: {
      "backbone": {
         "department": ["underscore", "jquery"],
         "dependent": "Backbone"  
      },
      
      "underscore": {
         exports: "_" 
      }
   },
   
   name: "../main",
   out: "../built/js/main.js"
})

ตอนนี้คุณสามารถสร้างไฟล์main.jsซึ่งมีการอ้างอิงทั้งหมดสำหรับแอพ ไฟล์นี้ใช้ในไฟล์ HTML เพื่อโหลดไฟล์ JS ทั้งหมดด้วยคำขอเดียว โปรดทราบว่าไฟล์ที่สร้างไม่ควรอยู่ในไดเร็กทอรีซอร์สโค้ด ไฟล์ควรอยู่ในสำเนาของโครงการ

การใช้ทรัพยากร CDN

เครื่องมือเพิ่มประสิทธิภาพไม่โหลดสคริปต์โดยใช้ทรัพยากรเครือข่าย / CDN (Content Delivery Network) ในกรณีที่สคริปต์ต้องโหลดโดยใช้ CDN จากนั้นคุณต้องแม็พไฟล์เหล่านี้กับชื่อโมดูลและดาวน์โหลดไฟล์ไปยังพา ธ ไฟล์ในเครื่องของคุณ คุณสามารถใช้คำพิเศษ "ว่าง" ในการกำหนดค่าพา ธ ของโปรไฟล์บิลด์ดังที่แสดงในไวยากรณ์ต่อไปนี้ -

({
   baseUrl: "js",
   name: "mainCDN",
   out: "js/mainCDN-built.js",
   
   paths: {
      jquery: "empty:"
   }
   
})

ไฟล์หลักจะมีลักษณะดังภาพด้านล่าง -

requirejs.config({
   paths: {
      'jquery': 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min'
   }
});

require(['jquery'], function ($) {
});

การเพิ่มประสิทธิภาพไฟล์ CSS เดี่ยว

ไฟล์ CSS ได้รับการปรับให้เหมาะสมโดยใช้พารามิเตอร์ต่อไปนี้โดยตรงในบรรทัดคำสั่งดังที่แสดงด้านล่าง -

node ../../r.js -o cssIn = main.css out = main-built.css

ไฟล์ CSS ยังสามารถปรับให้เหมาะสมในไฟล์บิลด์โดยใช้คุณสมบัติเดียวกันดังที่แสดงด้านล่าง -

...
cssIn:"main.css",
out:"main-built.css"
...

ทั้งสองวิธีการดังกล่าวจะได้รับอนุญาตและจะสร้างไฟล์ที่เรียกว่าprojectfolder css / / mainbuild.css ไฟล์นี้จะมีเนื้อหาของ main.css เส้นทาง url () ได้รับการปรับแต่งอย่างเหมาะสมและความคิดเห็นจะถูกลบออก

การเพิ่มประสิทธิภาพทั้งโครงการ

เครื่องมือเพิ่มประสิทธิภาพใช้โปรไฟล์การสร้างเพื่อเพิ่มประสิทธิภาพ css และ jsไฟล์. ในตัวอย่างต่อไปนี้ไฟล์build.jsถูกสร้างขึ้น

({
   baseUrl: "js/shop",
   appDir: '.',
   paths: {
      "jquery": "jquery",
      "backbone": "backbone",
      "underscore": "underscore"
   },
   
   shim: {
      "backbone": {
         "deps": ["underscore", "jquery"],
         "exports": "Backbone"  
      },
      
      "underscore": {
         exports: "_" 
      }
   },
   
   optimizeCss: "standard.keepLines",
   modules: [
      {
         name: "app"
      }
   ],
   
   dir: "../built"
})

build.jsไฟล์สั่ง RequireJS เพื่อคัดลอกโฟลเดอร์แอป (appDir พารามิเตอร์) เพื่อโฟลเดอร์ออกตัว (พารามิเตอร์ dir) และนำไปใช้เพิ่มประสิทธิภาพทั้งหมดไปยังไฟล์ที่อยู่ในโฟลเดอร์ออก เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างโปรไฟล์ในโฟลเดอร์แอพ -

node r.js -o build.js

RequireJS ใช้ jQuery เป็นตัวอ้างอิงอื่นและลงทะเบียนเป็นjqueryโมดูลที่มีชื่อเป็นตัวพิมพ์เล็กและโดยค่าเริ่มต้นจะลงทะเบียนตัวเองโดยใช้ฟังก์ชันส่วนกลาง$และjQueryในขณะที่ใช้ AMD / RequireJS

กำลังโหลด jQuery

require(['jquery'], function($) {
   //code here
}

คุณสามารถโหลดไลบรารีที่กำหนดเองได้หลายไลบรารีพร้อมกับ jQuery ดังที่แสดงด้านล่าง -

require(['custom_library_path','jquery'], function(load_library,$) {
   //related code of $ and load_library
});

ตารางต่อไปนี้แสดงการใช้ jQuery กับ RequireJS เพื่อระบุการอ้างอิง

ซีเนียร์ ประเภทและคำอธิบาย
1 ใช้ Shim Config

jQuery ใช้การกำหนดค่า shim เพื่อกำหนดการอ้างอิงสำหรับปลั๊กอิน jQuery

2 กำลังโหลด jQuery จาก CDN

jQuery ใช้ CDN เพื่อกำหนดการอ้างอิงสำหรับปลั๊กอิน jQuery

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

โหนดจะโหลดโมดูลจากดิสก์ภายในเครื่องเท่านั้นและตัวเลือกการกำหนดค่าเช่นแผนที่แพ็คเกจเส้นทาง ฯลฯ จะถูกนำไปใช้ก็ต่อเมื่อโหลดโมดูลโดย RequireJS

การติดตั้ง Node

คุณสามารถติดตั้ง Node adapter โดยใช้คำสั่งต่อไปนี้ซึ่งจะติดตั้งไฟล์รีลีสล่าสุด -

npm install requirejs

คุณสามารถติดตั้ง Node ได้ด้วยวิธีต่อไปนี้เช่นกัน -

  • คุณสามารถดาวน์โหลดr.js ได้จากลิงค์นี้และเก็บไว้ในโฟลเดอร์โปรเจ็กต์ของคุณ

  • ขอรับแหล่งที่มาจากr.js พื้นที่เก็บข้อมูลหรือติดตั้งมันผ่านdist.js โหนด

การใช้งาน Node

ในการใช้โหนดคุณต้องมี('requirejs')และย้ายฟังก์ชันที่ต้องการในการกำหนดค่าไปยังไฟล์ main.js ระดับบนสุด

ตัวอย่างเช่น -

var requirejs = require('requirejs');

requirejs.config({
   //load the mode modules to top level JS file 
   //by passing the top level main.js require function to requirejs
   nodeRequire: require
});

requirejs(['name1', 'name2'],
   function (name1, name2) {
      //by using requirejs config, name1 and name2 are loaded
      //node's require loads the module, if they did not find these
   }
);

การสร้างโมดูลโหนดด้วย AMD หรือ RequireJS

คุณสามารถทำให้โมดูลโค้ดทำงานกับ RequireJS และ Node ได้โดยไม่ต้องใช้ผู้ใช้ไลบรารีจากนั้นใช้แพ็คเกจamdefineเพื่อทำงานนี้ให้สำเร็จ

ตัวอย่างเช่น -

if (typeof define !== 'function') {
   var define = require('amdefine')(module);
}

define(function(require) {
   var myval = require('dependency');

   //The returned value from the function can be used 
   //as module which is visible to Node.
   return function () {};
});

เครื่องมือเพิ่มประสิทธิภาพเป็นโมดูลโหนด

โมดูลโหนดใช้เครื่องมือเพิ่มประสิทธิภาพ RequireJS เป็นวิธีการปรับให้เหมาะสมโดยใช้การเรียกใช้ฟังก์ชันแทนการใช้เครื่องมือบรรทัดคำสั่ง

ตัวอย่างเช่น -

var requirejs = require('requirejs');

var config = {
   baseUrl: '../directory/scripts',
   name: 'main',
   out: '../build/main-built.js'
};

requirejs.optimize(config, function (buildResponse) {

   //The text output of the modules specify by using buildResponse 
   //and loads the built file for the contents
   //get the optimized file contents by using config.out 
   var contents = fs.readFileSync(config.out, 'utf8');
}, function(err) {
   //code for optimization err callback
});

Dojo เป็นชุดเครื่องมือ JavaScript ซึ่งใช้สถาปัตยกรรมโมดูลของ AMD ที่มีโมดูลเพิ่มเติมเพื่อเพิ่มฟังก์ชันพิเศษให้กับเว็บแอปพลิเคชันและยังช่วยประหยัดเวลาและขนาดในกระบวนการพัฒนาเว็บแอปพลิเคชัน

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงการใช้ Dojo พร้อมกับ RequireJS สร้างไฟล์ html ด้วยชื่อindex.htmlและวางโค้ดต่อไปนี้ -

<!DOCTYPE html>
<html>
   <head>
      <title>RequireJS Dojo</title>
      <script data-main="app" src="lib/require.js"></script>
   </head>
   
   <body>
      <h2>RequireJS  Dojo</h2>
      <p>
         Hello... ...
      </p>
   </body>
</html>

สร้างไฟล์ jsไฟล์ที่มีชื่อapp.jsและเพิ่มรหัสต่อไปนี้ -

require ({
   //You can configure loading modules from the lib directory
   baseUrl: 'lib',
   
   paths: {
      //mapping of package
      dojo: 'http://sfoster.dojotoolkit.org/dojobox/1.7-branch/dojo'
   }
   
}, [
      //modules which we are using here
      'dojo/dom'
   ], function(dom) { 
   
      //using the 'byId' method from dom module
      var mydojo = dom.byId('dojo_val')
      mydojo.innerHTML = "The text is displaying via dojo/dom";   
   }
);

เอาต์พุต

เปิดไฟล์ HTML ในเบราว์เซอร์ คุณจะได้รับผลลัพธ์ต่อไปนี้ -

รูปแบบโมดูลถูกกำหนดโดย CommonJS ถูกกำหนดโดยไม่ให้ตัวเลือกที่เท่าเทียมกันของเบราว์เซอร์กับสภาพแวดล้อม JavaScript อื่น ๆ ดังนั้นข้อกำหนด CommonJS recomends รูปแบบการขนส่งและตรงกันต้อง คุณสามารถแปลงรูปแบบโมดูล CommonJS แบบเดิมเพื่อทำงานกับ RequireJS ได้อย่างง่ายดาย แต่โมดูลทั้งหมดจะไม่แปลงเป็นรูปแบบใหม่ ข้อยกเว้นบางประการมีดังต่อไปนี้ -

  • โมดูลที่มีรหัสเงื่อนไขเพื่อทำการโทร
  • โมดูลที่มีการอ้างอิงแบบวงกลม

การแปลงด้วยตนเอง

โมดูล CommonJS สามารถแปลงเป็นรูปแบบ RequireJS ได้ด้วยตนเองโดยใช้ไวยากรณ์ต่อไปนี้ -

define(function(require, exports, module) {
   //place CommonJS module content here
});

เครื่องมือแปลง

โมดูล CommonJS สามารถแปลงเป็นรูปแบบ RequireJS โดยใช้เครื่องมือตัวแปลงโปรเจ็กต์ r.jsซึ่งสร้างขึ้นในไฟล์r.js คุณควรระบุเส้นทางของไฟล์ที่จะแปลงและโฟลเดอร์ผลลัพธ์ตามที่แสดงด้านล่าง -

node r.js -convert path/to/commonjs/modules/ path/to/output

การตั้งค่ามูลค่าที่ส่งออก

ระบบบางระบบใน CommonJS อนุญาตให้ตั้งค่าที่ส่งออกโดยกำหนดค่าที่ส่งออกเป็นmodule.exportsแต่ RequireJS สนับสนุนวิธีที่ง่ายกว่าในการส่งคืนค่าจากฟังก์ชันที่ส่งผ่านไปกำหนด ข้อดีของสิ่งนี้คือคุณไม่จำเป็นต้องมีการเอ็กซ์พอร์ตและอาร์กิวเมนต์ของฟังก์ชันโมดูลดังนั้นคุณสามารถปล่อยมันออกจากนิยามโมดูลดังที่แสดงด้านล่าง -

define(function (require) {
   var name = require('name');

   //Define the module as exporting a function
   return function () {
      name.doSomething();
   };
});

ไวยากรณ์ทางเลือก

วิธีทางเลือกในการระบุการอ้างอิงผ่านอาร์กิวเมนต์อาร์เรย์พึ่งพาdefine () แต่ลำดับของชื่อในอาร์เรย์การอ้างอิงควรตรงกับลำดับของอาร์กิวเมนต์ที่ส่งไปยังฟังก์ชันนิยาม define ()ดังที่แสดงด้านล่าง -

define(['name'], function (name) {
   
   return function () {
      name.doSomething();
   };
});

กำลังโหลดโมดูลจากแพ็คเกจ CommonJS

หากต้องการทราบเกี่ยวกับตำแหน่งและโมดูลแอ็ตทริบิวต์แพ็กเกจจะถูกโหลดในแพ็กเกจ CommonJS โดยใช้ RequireJS โดยการตั้งค่าคอนฟิกูเรชัน RequireJS

เครื่องมือเพิ่มประสิทธิภาพ

เครื่องมือเพิ่มประสิทธิภาพมีอยู่ใน RequireJS ซึ่งสามารถรวมคำจำกัดความของโมดูลเข้าด้วยกันเป็นบันเดิลที่เหมาะสมที่สุดสำหรับการจัดส่งเบราว์เซอร์ มันทำงานเป็นเครื่องมือบรรทัดคำสั่งเพื่อให้คุณสามารถใช้เป็นส่วนหนึ่งของการปรับใช้โค้ด

RequireJS มีปลั๊กอินชุดเล็ก ๆ ซึ่งอนุญาตให้โหลดทรัพยากรประเภทต่างๆเป็นการอ้างอิง ต่อไปนี้เป็นรายการปลั๊กอินที่มีอยู่ใน RequireJS -

  • text
  • domReady
  • i18n
  • กำลังโหลด CSS

ข้อความ

ข้อความ plug-in ที่ใช้สำหรับทรัพยากรตามข้อความในการโหลดแบบไม่พร้อมกันซึ่งส่วนใหญ่จะใช้สำหรับการแทรกเนื้อหา HTML ในไฟล์ JavaScript สามารถโหลดได้เมื่อคุณใช้ข้อความ! คำนำหน้าในการเรียกโมดูลที่ต้องการหรือกำหนดและส่งผ่านนามสกุลไฟล์ไปยังปลั๊กอิน เปรียบเทียบกับการโหลดโมดูลปกติปลั๊กอินข้อความจะโหลดโมดูลโดยใช้ XHR และจะไม่เพิ่มโค้ดลงในส่วนหัวเป็นscript แท็ก

ทรัพยากรไฟล์ข้อความสามารถรวมเป็นการอ้างอิงในรหัสเป็น -

require(["mymodule", "text!mymodule.html", "text!mymodule.css"],
   
   function(mymodule, html, css) {
      //the html and css variables will be the text
      //of the mymodule.html file and mymodule.css files respectively
   }
);

domReady

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

require(['domReady'], function(domReady) {
   
   domReady(function() {
      //the domReady function is called when DOM is ready 
      //which is safe to manipulate DOM nodes in this function
   });
});

i18n

สามารถใช้ได้กับหลายภาษาที่ให้ i18nรองรับบันเดิลซึ่งจะโหลดโดยอัตโนมัติเมื่อโมดูลหรือการอ้างอิงระบุ "i18n!" คำนำหน้า หากต้องการใช้สิ่งนี้ให้ดาวน์โหลดและวางไว้ในไดเร็กทอรีเดียวกับที่มีไฟล์ JavaScript หลักของคุณ วางปลั๊กอินนี้ในไดเร็กทอรีชื่อ "nls" เพื่อค้นหาไฟล์โลคัลไลเซชันของคุณ

ตัวอย่างเช่นสมมติว่าเรามีไฟล์ js หนึ่งไฟล์ชื่อcountry.js ที่มีเนื้อหาต่อไปนี้และวางไว้ในไดเร็กทอรีเป็นmydirectory / nls / country.js -

define({
   
   "root": {
      "india": "india",
      "australia": "australia",
      "england": "england"
   }
});

คุณสามารถเพิ่มการแปลเฉพาะลงในไฟล์ได้โดยใช้fr-fr locale และโค้ดด้านบนจะเปลี่ยนเป็น -

define({
   
   "root": {
      "title": "title",
      "header": "header",
      "description": "description"
   },
   
   "es-es": true
});

จากนั้นระบุไฟล์ที่mydirectory / nls / es-es / country.jsโดยมีเนื้อหาดังนี้ -

define({
   
   "root": {
      "title": "título",
      "header": "cabecera",
      "description": "descripción"
   },
   
   "es-es": true
});

คุณสามารถตั้งค่าโลแคลได้โดยส่งไปยังปลั๊กอินด้วยความช่วยเหลือของโมดูล config ในไฟล์main.jsดังที่แสดงด้านล่าง -

requirejs.config({
   
   config: {
      //set the config for the i18n plugin
      
      i18n: {
         locale: 'es-es'
      }
      
   }
});

โหลด CSS โดยใช้ RequireJS

คุณสามารถใช้ปลั๊กอินบางตัวเพื่อโหลดไฟล์ CSS โดยต่อท้ายลิงก์ส่วนหัวเพื่อโหลดไฟล์ CSS

คุณสามารถโหลด CSS ได้โดยใช้ฟังก์ชันของคุณเองดังที่แสดงด้านล่าง -

function myCss(url) {
   var mylink = document.createElement("mylink");
   mylink.type = "text/css";
   mylink.rel = "stylesheet";
   mylink.href = url;
   document.getElementsByTagName("head")[0].appendChild(mylink);
}