JS模塊化工具requirejs教程(二):基本知識

来源:http://www.cnblogs.com/EnderH/archive/2016/03/31/5343308.html
-Advertisement-
Play Games

前一篇:JS模塊化工具requirejs教程(一):初識requirejs我們以非常簡單的方式引入了requirejs,這一篇將講述一下requirejs中的一些基本知識,包括API使用方式等 基本API require會定義三個變數:define,require,requirejs,其中requi ...


  前一篇:JS模塊化工具requirejs教程(一):初識requirejs我們以非常簡單的方式引入了requirejs,這一篇將講述一下requirejs中的一些基本知識,包括API使用方式等

  基本API

  require會定義三個變數:define,require,requirejs,其中require === requirejs,一般使用require更簡短

  • define 從名字就可以看出這個api是用來定義一個模塊
  • require 載入依賴模塊,並執行載入完後的回調函數

  前一篇中的a.js:

define(function(){
    function fun1(){
      alert("it works");
    }

    fun1();
})

  通過define函數定義了一個模塊,然後再頁面中使用:

require(["js/a"]);

  來載入該模塊(註意require中的依賴是一個數組,即使只有一個依賴,你也必須使用數組來定義),requir API的第二個參數是callback,一個function,是用來處理載入完畢後的邏輯,如:

require(["js/a"],function(){
    alert("load finished");
})

  載入文件

  之前的例子中載入模塊都是本地js,但是大部分情況下網頁需要載入的JS可能來自本地伺服器、其他網站或CDN,這樣就不能通過這種方式來載入了,我們以載入一個jquery庫為例:

require.config({
    paths : {
        "jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery"]   
    }
})
require(["jquery","js/a"],function($){
    $(function(){
        alert("load finished");  
    })
})

  這邊涉及了require.configrequire.config是用來配置模塊載入位置,簡單點說就是給模塊起一個更短更好記的名字,比如將百度的jquery庫地址標記為jquery,這樣在require時只需要寫["jquery"]就可以載入該js,本地的js我們也可以這樣配置:

require.config({
    paths : {
        "jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery"],
        "a" : "js/a"   
    }
})
require(["jquery","a"],function($){
    $(function(){
        alert("load finished");  
    })
})

  通過paths的配置會使我們的模塊名字更精煉,paths還有一個重要的功能,就是可以配置多個路徑,如果遠程cdn庫沒有載入成功,可以載入本地的庫,如:

require.config({
    paths : {
        "jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery", "js/jquery"],
        "a" : "js/a"   
    }
})
require(["jquery","a"],function($){
    $(function(){
        alert("load finished");  
    })
})

  這樣配置後,當百度的jquery沒有載入成功後,會載入本地js目錄下的jquery

  1. 在使用requirejs時,載入模塊時不用寫.js尾碼的,當然也是不能寫尾碼
  2. 上面例子中的callback函數中發現有$參數,這個就是依賴的jquery模塊的輸出變數,如果你依賴多個模塊,可以依次寫入多個參數來使用:
require(["jquery","underscore"],function($, _){
    $(function(){
        _.each([1,2,3],alert);
    })
})

  如果某個模塊不輸出變數值,則沒有,所以儘量將輸出的模塊寫在前面,防止位置錯亂引發誤解

  全局配置

  上面的例子中重覆出現了require.config配置,如果每個頁面中都加入配置,必然顯得十分不雅,requirejs提供了一種叫"主數據"的功能,我們首先創建一個main.js:

require.config({
    paths : {
        "jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery", "js/jquery"],
        "a" : "js/a"   
    }
})

  然後再頁面中使用下麵的方式來使用requirejs:

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

  解釋一下,載入requirejs腳本的script標簽加入了data-main屬性,這個屬性指定的js將在載入完reuqire.js後處理,我們把require.config的配置加入到data-main後,就可以使每一個頁面都使用這個配置,然後頁面中就可以直接使用require來載入所有的短模塊名

  data-main還有一個重要的功能,當script標簽指定data-main屬性時,require會預設的將data-main指定的js為根路徑,是什麼意思呢?如上面的data-main="js/main"設定後,我們在使用require(['jquery'])後(不配置jquery的paths),require會自動載入js/jquery.js這個文件,而不是jquery.js,相當於預設配置了:

require.config({
    baseUrl : "js"
})

  第三方模塊

  通過require載入的模塊一般都需要符合AMD規範即使用define來申明模塊,但是部分時候需要載入非AMD規範的js,這時候就需要用到另一個功能:shim,shim解釋起來也比較難理解,shim直接翻譯為"墊",其實也是有這層意思的,目前我主要用在兩個地方
1. 非AMD模塊輸出,將非標準的AMD模塊"墊"成可用的模塊,例如:在老版本的jquery中,是沒有繼承AMD規範的,所以不能直接require["jquery"],這時候就需要shim,比如我要是用underscore類庫,但是他並沒有實現AMD規範,那我們可以這樣配置

require.config({
    shim: {
        "underscore" : {
            exports : "_";
        }
    }
})

  這樣配置後,我們就可以在其他模塊中引用underscore模塊:

require(["underscore"], function(_){
    _.each([1,2,3], alert);
})
  1. 插件形式的非AMD模塊,我們經常會用到jquery插件,而且這些插件基本都不符合AMD規範,比如jquery.form插件,這時候就需要將form插件"墊"到jquery中:
require.config({
    shim: {
        "underscore" : {
            exports : "_";
        },
        "jquery.form" : {
            deps : ["jquery"]
        }
    }
})

  也可以簡寫為:

require.config({
    shim: {
        "underscore" : {
            exports : "_";
        },
        "jquery.form" : ["jquery"]
    }
})

  這樣配置之後我們就可以使用載入插件後的jquery了

require.config(["jquery", "jquery.form"], function($){
    $(function(){
        $("#form").ajaxSubmit({...});
    })
})

好了,requirejs的基本配置大致就是這麼多,還有一些擴展的功能會在之後的篇幅中提到

文章來源:https://github.com/liuxey/blog/issues/2


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近的工作在做一個多步驟多分步的表單頁面,這個多步驟多分步的意思是說這個頁面的業務是分多個步驟完成的,每個步驟可能又分多個小步驟來處理,大步驟之間,以及小步驟之間都是一種順序發生的業務關係。起初以為這種功能很好做,就跟tab頁的實現原理差不多,真做下來才發現,這裡面的相關邏輯還是挺多的(有可能是我沒... ...
  • “我們正在用HTML5編寫我們下一套移動產品。”“是啊,這些天很多人在玩著Appcelerator,我也在玩著。”“嗯,但這並不是我要說的那種HTML5產品。” 最近,我有很多類似的交流對話,可能因為我正在開發一套HTML5的應用吧。就像2005年的“AJAX”,“HTML5”這個術語現在還沒有被清 ...
  • 前段時間做項目,有個功能是消息提醒。 我相信很多大牛都做過。下麵來分享我遇到的問題和解決方案。 首先我們的項目是用frameset框架,main代碼。 <frameset name="myFrame" cols="85,*" frameborder="no" border="0" framespac ...
  • 即將從事Web前端的工作的 先對即將從事的行業有個瞭解。 Web前端發展史: 第一個網頁誕生於90年代初,早期的網頁除了一些小圖片和毫無佈局可言的標題段落,其全由文字構成。然而隨著時代的進步,互聯網的不斷發展,接下來出現了表格佈局,此次是flash,最後是基於CSS的網頁設計。不可否認,前端頁面重構 ...
  • JavaScript中有三個可以對字元串編碼的函數,分別是: escape,encodeURI,encodeURIComponent,相應3個解碼函數:unescape,decodeURI,decodeURIComponent 。 下麵簡單介紹一下它們的區別 1 escape()函數 定義和用法es ...
  • 前面的話:JavaScript可運行在所有主要平臺的主流瀏覽器上,也可運行在每一個主流操作系統的伺服器端上。所以呢,要想成為一名優秀的全棧工程師,必須懂得JavaScript語言。這是我整理的JS的部分函數問題,供大家參考借閱,有不妥的地方也請多多指教。 1、函數的三要素 1.1 函數的功能 1.2 ...
  • 該篇隨我讀書的進度持續更新閱讀書目:《JavaScript設計模式》 2016/3/30: 模式是一種可復用的解決方案,可用於解決軟體設計中遇到的常見問題./將解決問題的方法製作成模板,並且這些模板可應用於多種不同的情況.有效模式的附加要求:適合性,實用性,適用性. 模式的優點: 防止局部問題引起大 ...
  • 基本數據類型 number string boolean underfined null; 引用數據類型 Object Array RegExp; typeof 檢測數據類型 但是不能檢測(對象、數組、正則) instanceof/constructor檢測某一個實例是否屬於一個類; 我們的cons ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...