一、commonjs
node.js的模組系統,就是參照commonjs規範實現的。在commonjs中,有乙個全域性性方法require(),用於載入模組。假定有乙個數學模組math.js,就可以像下面這樣載入。
var math = require('math');然後,就可以呼叫模組提供的方法:
var math = require('math');math.add(2,3); // 5
commonjs定義的模組分為:
require()用來引入外部模組;exports物件用於匯出當前模組的方法或變數,唯一的導出口;module物件就代表模組本身。
var module =};(function
(module, exports) ;
}(module, module.exports))
var f =module.exports.multiply;
f(5) //
5000
上面**向乙個立即執行函式提供 module 和 exports 兩個外部變數,模組就放在這個立即執行函式裡面。模組的輸出值放在 module.exports 之中,這樣就實現了模組的載入。
二、amd
基於commonjs規範的nodejs出來以後,服務端的模組概念已經形成,很自然地,大家就想要客戶端模組。而且最好兩者能夠相容,乙個模組不用修改,在伺服器和瀏覽器都可以執行。但是,由於乙個重大的侷限,使得commonjs規範不適用於瀏覽器環境。
var math = require('math');第二行math.add(2, 3),在第一行require('math')之後執行,因此必須等math.js載入完成。也就是說,如果載入時間很長,整個應用就會停在那裡等。您會注意到math.add(2, 3);
require
是同步的。
這對伺服器端不是乙個問題,因為所有的模組都存放在本地硬碟,可以同步載入完成,等待時間就是硬碟的讀取時間。但是,對於瀏覽器,這卻是乙個大問題,因為模組都放在伺服器端,等待時間取決於網速的快慢,可能要等很長時間,瀏覽器處於"假死"狀態。
因此,瀏覽器端的模組,不能採用"同步載入"(synchronous),只能採用"非同步載入"(asynchronous)。這就是amd規範誕生的背景。
commonjs是主要為了js在後端的表現制定的,他是不適合前端的,amd(非同步模組定義)出現了,它就主要為前端js的表現制定規範。
amd是"asynchronous module definition"的縮寫,意思就是"非同步模組定義"。它採用非同步方式載入模組,模組的載入不影響它後面語句的執行。所有依賴這個模組的語句,都定義在乙個**函式中,等到載入完成之後,這個**函式才會執行。
amd也採用require()語句載入模組,但是不同於commonjs,它要求兩個引數:
require([module], callback);第乙個引數[module],是乙個陣列,裡面的成員就是要載入的模組;第二個引數callback,則是載入成功之後的**函式。如果將前面的**改寫成amd形式,就是下面這樣:
require(['math'], function (math) );假定主模組依賴jquery、underscore和backbone這三個模組,main.js就可以這樣寫:
require(['jquery', 'underscore', 'backbone'], function ($, _, backbone){
// some code here
Shell程式設計筆記(未完待續)
單引號關閉所有有特殊作用的字元 而雙引號只要求shell忽略大多數,除了 美元符號 反引號 反斜槓,這3種特殊字元不被忽略。具體而言 單引號包括的內容均被原樣輸出 雙引號會做變數替換,命令替換和轉義,除此之外原樣輸出 示例 bin bash dt today is singlequote dt is...
2 核心模組問題(未完待續)
核心模組問題 一般而言,系統核心會編譯進很多東西,但是也有不少東西是不編譯進去的。這些可以動態載入的東西,就叫核心模組。對android而言,其實普通使用者沒必要在意到底機器內的某個模組是模組形式還是編譯進入了核心,所以下面統稱核心功能。無論是模組還是核心形態,只要能用,就稱這個功能開啟。核心常用的...
js面試題總結 未完待續。。。
let str asss23sjdssskssa7lsssdkjsssdss const arr str.split 把字串轉換為陣列 const str2 arr.sort join 首先進行排序,這樣結果會把相同的字元放在一起,然後再轉換為字串 let value let index 0 con...