聽說公司的項目較多的用到requirejs管理依賴,因此大熊同窗擠出了5分鐘休息時間學習了一下,如今分享一下。若是你想了解requirejs的實現原理,請繞道!若是你想了解requirejs的高級用法,請繞道!那麼問題來了,這篇小文還有人看嗎?😄html
曾經,咱們將一些js組件放到不一樣的文件,而後經過script標籤引入,若是幾個組件有依賴,那麼要當心了,你必須將被依賴的放到前面,不然的話會出現啥啥啥is undefined
或者啥啥啥is not a function
之類的錯誤。好比一個jquery的插件顯然是依賴jquery核心庫的,因此jquery核心庫文件必須先引入。項目小組件少依賴簡單還好,要是項目大組件多依賴複雜就糟糕了。咋辦?用requirejs啊😜!jquery
只要按照requirejs規範寫,他會從一個根開始檢查依賴,根據這些依賴關係自動的幫助咱們插入script標籤,很棒,對不對?這樣依賴咱們不就不再用糾結哪一個標籤應該放在前,哪一個該放在後了嗎?👏👏👏es6
請記住使用requirejs的口訣,兩函數一配置一屬性
<script src="scripts/require.js" data-main="scripts/app.js"></script>
這裏就指定了根是app.js,只有直接或者間接與app.js有依賴關係的模塊纔會被插入到html中。數組
require.config({ //默認狀況下從這個文件開始拉去取資源 baseUrl:'scripts/app', //若是你的依賴模塊以lib頭,會從scripts/lib加載模塊。 paths:{ lib:'../lib' }, // load backbone as a shim,所謂就是將沒有采用requirejs方式定義 //模塊的東西轉變爲requirejs模塊 shim:{ 'backbone':{ deps:['underscore'], exports:'Backbone' } } });
//logger.js define(["a"], function(a) { 'use strict'; function info() { console.log("我是私有函數"); } return { name:"一個屬性", test:function(a){ console.log(a+"你好!"); a.f(); info(); } } });
define函數就受兩個參數。
* 第一個是一個字符串數組,表示你定義的模塊依賴的模塊,這裏依賴模塊a;
* 第二個參數是一個函數,參數是注入前面依賴的模塊,順序同第一參數順序。在函數中可作邏輯處理,經過return一個對象暴露模塊的屬性和方法,不在return中的能夠認爲是私有方法和私有屬性。app
//app.js require(['logger'], function (logger) { logger.test("大熊"); console.log(logger.name); }); //輸出結果: //大熊你好! //不肯定(取決於a模塊的f方法) //我是私有函數 //一個屬性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <script src="js/require.js" data-main="app.js"></script> </body> </html>
require.config({ //By default load any module IDs from js/ baseUrl: 'js', //except, if the module ID starts with "lib" paths: { lib: '../lib' }, shim: { 'world': { deps:['animalWorld'], // use the global 'Backbone' as the module name. exports: 'world' } } }); require(['cat','dog','world'], function (cat,dog,world) { world.world(); cat.say(); dog.say(); });
define([], function() { 'use strict'; function _showName(name){ console.log(name); } return { say(words){ console.log(words); }, showName(name){ //練習私有方法 _showName(name); } } });
define([ 'lib/animal' ], function(animal) { 'use strict'; return { say(){ animal.say("喵喵"); animal.showName("貓"); } } });
define([ 'lib/animal' ], function(animal) { 'use strict'; return { say(){ animal.say("汪汪"); animal.showName("狗"); } } });
window.animal = function() { console.log("這裏是動物世界!"); }
define([], function() { 'use strict'; return { world(){ animal(); } } });
輸出結果
函數
解釋一下
須要解釋嗎?自行體會吧!這裏再貼個加載順序的圖,你想一想看是否是應該是這樣的。
這裏的標籤順序正好是我想象中的反過來。爲何會這樣呢?我猜想是,加載順序依然時被依賴的要先加載的,咱們知道只要指定了script的src屬性就會加載對應的js,跟標籤順序無必然關係。這裏不知道是否是對的,誰知道請賜教。工具
requirejs的基本用法比較簡單,可是功能強大,讓咱們可以很是輕鬆的處理各類依賴問題。有人云requirejs是遵循的一個叫AMD的規範,也有遵循CMD規範的seajs模塊管理庫,還有用於服務端的commonjs模塊管理工具,如今es6已經原生支持模塊管理了,關於這些內容,大熊不作介紹了,爲啥呢?由於大熊也不知道啊。要是你以爲大熊寫的東西對你有所幫助,不妨點個關注或者推薦!requirejs