一、为什么要用require.js?
最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了。后">
首頁 web前端 js教程 Javascript模組化程式設計(三)require.js的用法及功能介紹_基礎知識

Javascript模組化程式設計(三)require.js的用法及功能介紹_基礎知識

May 16, 2016 pm 05:43 PM
require 模組化程式設計

這個系列的第一部分和第二部分,介紹了Javascript模組原型和理論概念,今天介紹如何將它們用於實戰。
我採用的是一個非常流行的函式庫require.js。
Javascript模組化程式設計(三)require.js的用法及功能介紹_基礎知識 
一、為什麼要用require.js?
最早的時候,所有Javascript程式碼都寫在一個檔案裡面,只要載入這一個檔案就夠了。後來,程式碼越來越多,一個文件不夠了,必須分成多個文件,依序載入。下面的網頁程式碼,相信很多人都看過。

複製程式碼 程式碼如下:


  
  
  

這段程式碼依序載入多個js檔案。
這樣的寫法有很大的缺點。首先,載入的時候,瀏覽器會停止網頁渲染,載入檔案越多,網頁失去回應的時間就會越長;其次,由於js檔案之間存在依賴關係,因此必須嚴格保證載入順序(例如上例的1.js要在2.js的前面),依賴性最大的模組一定要放到最後加載,當依賴關係很複雜的時候,程式碼的編寫和維護都會變得困難。
require.js的誕生,就是為了解決這兩個問題
Javascript模組化程式設計(三)require.js的用法及功能介紹_基礎知識 
(1)實作js檔案的非同步加載,避免網頁失去回應;
(2)管理模組之間的依賴性,便於程式碼的編寫與維護。
二、require.js的載入
使用require.js的第一步,是先去官方網站下載最新版本。
下載後,假定把它放在js子目錄下面,就可以載入了。
複製程式碼 程式碼如下:

  

有人可能會想到,載入這個文件,也可能造成網頁失去回應。解決方法有兩個,一個是把它放在網頁底部加載,另一個是寫成下面這樣:
複製程式碼 程式碼如下:

  

async屬性顯示這個檔案需要非同步載入,避免網頁失去回應。 IE不支援這個屬性,只支援defer,所以把defer也寫上。

載入require.js以後,下一步就要載入我們自己的程式碼了。假定我們自己的程式碼檔案是main.js,也放在js目錄下面。那麼,只要寫成下面這樣就行了:
複製程式碼 程式碼如下:


data-main屬性的作用是,指定網頁程式的主模組。在上例中,就是js目錄下面的main.js,這個檔案會第一個被require.js載入。由於require.js預設的檔案後綴名是js,所以可以把main.js簡寫成main。

三、主模組的寫法 上一節的main.js,我稱它為"主模組",意思是整個網頁的入口程式碼。它有點像C語言的main()函數,所有程式碼都從這裡開始運作。
下面就來看,怎麼寫main.js。
如果我們的程式碼不依賴任何其他模組,那麼可以直接寫入javascript程式碼。
  // main.js

複製程式碼 程式碼如下:

程式碼成功!
但這樣的話,就沒必要使用require.js了。真正常見的情況是,主模組依賴其他模組,這時就要使用AMD規範定義的的require()函數。
  // main.js
複製程式碼 程式碼如下:

    // some code here
  });
接受兩個函數接受兩個函數來接受兩個函數>個參數。第一個參數是數組,表示所依賴的模組,上例就是['moduleA', 'moduleB', 'moduleC'],即主模組依賴這三個模組;第二個參數是回調函數,當前面指定的模組都載入成功後,它將被呼叫。載入的模組會以參數形式傳入該函數,從而在回呼函數內部就可以使用這些模組。

require()非同步載入moduleA,moduleB和moduleC,瀏覽器不會失去回應;它指定的回呼函數,只有前面的模組都載入成功後,才會運行,解決了依賴性的問題。


下面,我們來看一個實際的例子。
假定主模塊依賴jquery、underscore和backbone這三個模塊,main.js就可以這樣寫:




複製代碼
代碼如下:   require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){      〜 );

require.js會先載入jQuery、underscore和backbone,然後再執行回呼函數。主模組的程式碼就寫在回調函數中。

四、模組的載入
上一節最後的範例中,主模組的依賴模組是['jquery', 'underscore', 'backbone']。預設情況下,require.js假定這三個模組與main.js在同一個目錄,檔案名稱分別為jquery.js,underscore.js和backbone.js,然後自動載入。

使用require.config()方法,我們可以對模組的載入行為進行自訂。 require.config()就寫在主模組(main.js)的頭部。參數就是一個對象,這個對象的paths屬性指定各個模組的載入路徑。


複製程式碼
程式碼如下:   require.config(>   🎜>      "jquery": "jquery.min",
      "underscore": 「unders   }
  });


上面的程式碼給了三個模組的檔名,路徑預設與main.js在同一個目錄(js子目錄)。如果這些模組在其他目錄,例如js/lib目錄,則有兩種寫入方法。一種是逐一指定路徑。




複製程式碼


程式碼如下:
  require.config(>   🎜>      "jquery": "lib/jquery.min",       "underscore": "lib/underscore.L. 🎜>    } });

另一個則是直接改變基底目錄(baseUrl)。




複製程式碼



複製程式碼
程式碼如下:   require.config(>
  .  "backbone": "backbone.min"
    }
  });


如果某個模組在另一台主機上,也可以直接指定它的網址,例如:




複製程式碼


require.js要求,每個模組是一個單獨的js檔案。這樣的話,如果載入多個模組,就會發出多次HTTP請求,會影響網頁的載入速度。因此,require.js提供了一個最佳化工具,當模組部署完畢以後,可以用這個工具將多個模組合併在一個檔案中,減少HTTP請求數。
五、AMD模組的寫法
require.js載入的模組,採用AMD規格。也就是說,模組必須按照AMD的規定來寫。
具體來說,就是模組必須採用特定的define()函數來定義。如果一個模組不依賴其他模組,那麼可以直接定義在define()函數之中。

假定現在有一個math.js文件,它定義了一個math模組。那麼,math.js就要這樣寫:
  // math.js
複製程式碼 程式碼:
複製程式碼


程式碼:


  define(function (){
    var add = function (x,y){
       return {
      add: add
};
  });


加載方法如下:
  // main.js 複製代碼
程式碼如下:


  require(['math'], function (math){
   》 (math.add(1)); ;


如果這個模組也依賴其他模組,那麼define()函數的第一個參數,必須是數組,指明該模組的依賴性。 程式碼如下:


  ine(['myLib), function(Lib), function(Lib))(['myLib), function(Lib)) {
    function foo(){
      myLib.doSomething();
  》 }     };
  });

當require()函式載入上面這個模組的時候,就會先載入myLib.js檔。

六、載入非規範的模組 理論上,require.js載入的模組,必須是依照AMD規範、用define()函數定義的模組。但實際上,雖然已經有一部分流行的函式庫(例如jQuery)符合AMD規範,但更多的函式庫並不符合。
那麼,require.js是否能夠載入非規範的模組呢? 回答是可以的。
這樣的模組在用require()載入之前,要先用require.config()方法,定義它們的一些特徵。
舉例來說,underscore和backbone這兩個函式庫,都沒有採用AMD規範來寫。如果要載入它們的話,必須先定義它們的特徵。

複製程式碼 程式碼如下:
  require.config(>

  🎜>      'underscore':{
        exports: '_'         deps: ['underscore', 'jquery'],
        exports: 'Backbports '
      }
    }
  });


require.config());

require.config()接受一個配置) shim屬性,專門用來配置不相容的模組。具體來說,每個模組要定義(1)exports值(輸出的變數名稱),表示這個模組外部呼叫時的名稱;(2)deps數組,表示該模組的依賴性。
例如,jQuery的插件可以這樣定義:
複製程式碼 程式碼如下:


程式碼如下:


shim: {
    'jquery.scroll': {
      deps: ['jquery'],
fn  外; }
  }

七、require.js插件
require.js也提供一系列插件,實現一些特定的功能。 domready插件,可以讓回呼函數在頁面DOM結構載入完成後再執行。 複製程式碼

程式碼如下:


  require(['>
  require(['3dom)!' ){     // called once the DOM is ready   });
text和image插件,則是允許require.js載入文字和圖片檔。
複製程式碼 程式碼如下:

  indefine([ ',
    'image!cat.jpg'
    ],
    function(review,cat){     }
  );


類似的插件還有json和mdown,用於載入json檔案和markdown檔案。
(完)
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1659
14
CakePHP 教程
1415
52
Laravel 教程
1310
25
PHP教程
1258
29
C# 教程
1232
24
vue3+vite:src使用require動態匯入圖片報錯怎麼解決 vue3+vite:src使用require動態匯入圖片報錯怎麼解決 May 21, 2023 pm 03:16 PM

vue3+vite:src使用require動態導入圖片報錯和解決方法vue3+vite動態的導入多張圖片vue3如果使用的是typescript開發,就會出現require引入圖片報錯,requireisnotdefined不能像使用vue2這樣imgUrl:require(' …/assets/test.png')導入,是因為typescript不支援require所以用import導入,下面介紹如何解決:使用awaitimport

require的用法有哪些 require的用法有哪些 Nov 27, 2023 am 10:03 AM

require用法:1、引入模組:在許多程式語言中,require用於引入外部模組或庫,以便在程式中使用它們提供的功能。例如,在Ruby中,可以使用require來載入第三方函式庫或模組;2、導入類別或方法:在一些程式語言中,require用來匯入特定的類別或方法,以便在目前檔案中使用它們;3、執行特定任務:在一些程式語言或框架中,require用於執行特定的任務或功能。

如何解決Python的程式碼中的函數嵌套過多錯誤? 如何解決Python的程式碼中的函數嵌套過多錯誤? Jun 25, 2023 pm 12:35 PM

Python是一門非常強大的程式語言,許多程式設計師都選擇Python作為主要的程式語言。但是,程式碼中過多的函數嵌套會導致程式難以維護和理解。本文將探討如何解決Python的程式碼中的函數嵌套過多錯誤。函數巢狀淺談函數巢狀是指在一個函數的主體中定義另外一個函數的過程。函數巢狀可以使程式的結構更加清晰,程式碼也更易於閱讀和維護。但是,函數巢狀過多會導致程式碼結構過於複雜

Golang函數的函數式程式設計和模組化程式設計的比較分析 Golang函數的函數式程式設計和模組化程式設計的比較分析 May 16, 2023 am 08:14 AM

隨著Golang在近年來的發展,它已經成為了逐漸被大眾所認可的程式語言之一。其中,Golang在函數式程式設計和模組化程式設計方面也有著它強大的優勢。在本文中,我們將深入分析Golang函數式程式設計和模組化程式設計的優劣與應用場景。 Golang函數式程式設計函數式程式設計是一種比較新近的程式設計範式,它主要強調函數是程式語言的一等公民,可以像其他值一樣被傳遞和操作。函數式程式設計的一個顯

PHP中require關鍵字的作用與使用方式詳解 PHP中require關鍵字的作用與使用方式詳解 Jun 28, 2023 pm 11:31 PM

PHP中require關鍵字的作用與使用方法詳解在PHP開發中,require是非常常用的關鍵字。它的作用是將指定的檔案包含進來,以供目前腳本使用。本文將詳細講解require關鍵字的作用與使用方法。一、require關鍵字的作用require關鍵字可以將一個檔案的內容包含到目前腳本中。它通常用於包含一些必要的外部文件,例如庫文件、配置文件等。使用req

解決php標題中的fatal error: require(): Failed opening required 'data/tdk.php' (include_path='.;C:\php\pear')的步驟 解決php標題中的fatal error: require(): Failed opening required 'data/tdk.php' (include_path='.;C:\php\pear')的步驟 Nov 27, 2023 pm 12:51 PM

解決PHP標題中的fatalerror:require():Failedopeningrequired'data/tdk.php'(include_path='.;C:phppear')的步驟在使用PHP開發網站或應用程式時,我們經常會遇到各種錯誤。其中一個常見的錯誤是"fatalerror:require():Failed

解決php標題中的fatal error: require(): Failed opening required 'data/tdk.php'的步驟 解決php標題中的fatal error: require(): Failed opening required 'data/tdk.php'的步驟 Nov 27, 2023 am 10:41 AM

解決PHP標題中的FatalError:require():Failedopeningrequired'data/tdk.php'的步驟在開發和維護PHP網站時,我們經常會遇到各種錯誤和異常。其中一個常見的錯誤是"FatalError:require():Failedopeningrequired'data/tdk.php'"。

PHP中的模組化設計 PHP中的模組化設計 May 28, 2023 am 09:31 AM

近年來,隨著網路科技的快速發展,PHP作為一種高效、強大、靈活的網頁程式語言,被越來越多的開發者採用。然而,PHP作為一種伺服器端語言,在處理大型專案時,程式碼的維護和管理是一個巨大的挑戰。為了解決這個問題,PHP開發者開始採用模組化設計的想法來建立複雜的應用程式。本文將詳細介紹PHP中的模組化設計,包括模組化設計的優點、實現模組化設計的方法以及模組化設計

See all articles