92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

js 模塊化編程

2018-9-14    seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

了解一個技術,首先要了解這個技術產生的背景及解決的問題,而不應該只是單純的知道該怎么用。之前的狀態可能就是只是為了了解而了解,并不知道實際產生的原因及帶來的好處,所以今天就來總結一下。

1. 什么是模塊化編程

來看百度百科的定義

模塊化程序設計是指在進行程序設計時將一個大程序按照功能劃分為若干小程序模塊,每個小程序模塊完成一個確定的功能,并在這些模塊之間建立必要的聯系,通過模塊的互相協作完成整個功能的程序設計方法。

比如 java 的 import,C# 的 using。我的理解是通過模塊化編程,可以將不同的功能獨立出來,修改某個功能時不會對其他功能產生影響。

2. 為什么要模塊化

來看下面一個例子

// A.js function sayWord(type){ if(type === 1){
        console.log("hello");
    }else if(type === 2){
        console.log("world");
    }
} // B.js function Hello(){ sayWord(1);
} // C.js Hello()  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

假設上面三個文件,B.js 引用了 A.js 里面的內容,C.js 又引用了 B.js 里面的內容,如果編寫 C.js 的人只知道引用了 B.js,那他就不會引用 A.js 就會導致程序出錯,而且文件的引用順序也不能出錯。給整體代碼的調試修改帶來不便。

還有個問題,上述代碼暴露了兩個全局變量,容易造成全局變量的污染

3. AMD

AMD 即 Asynchronous Module Definition(異步模塊定義)。采取異步加載的方式加載模塊,模塊的加載不會影響它后面的語句執行。而且只有用到的時候才會去加載相關文件,屬于瀏覽器端的標準

假設下面這種情況

// util.js define(function(){ return {
        getFormatDate:function(date,type){ if(type === 1){ return '2018-08-9' } if(type === 2){ return '2018 年 8 月 9 日' }
        }
    }
}) // a-util.js define(['./util.js'],function(util){ return {
        aGetFormatDate:function(date){ return util.getFormatDate(date,2)
        }
    }
}) // a.js define(['./a-util.js'],function(aUtil){ return {
        printDate:function(date){ console.log(aUtil.aGetFormatDate(date))
        }
    }
}) // main.js require(['./a.js'],function(a){ var date = new Date()
    a.printDate(date)
})
console.log(1); // 使用 // <script src = "/require.min.js" data-main="./main.js"></script>   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

頁面上先打印 1,然后才會打印 2018 年 8 月 9 日。因此 AMD 的加載并不會影響后續的語句執行。

如果不是異步加載會出現什么情況呢

var a = require('a');
console.log(1) 
  • 1
  • 2

后面的語句需要等待 a 加載完成才能執行,如果加載時間過長,整個程序都會卡在這。因此,瀏覽器不能同步加載資源,這也是 AMD 的產生背景。

AMD 是在瀏覽器端實現模塊化開發的規范。由于該規范不是 JavaScript 原始支持的,使用 AMD 規范進行開發的時候需要引入第三方的庫函數,也就是 RequireJS。

RequireJS 主要解決的問題

  • 使 JS 異步加載,避免頁面失去響應
  • 管理代碼之間的依賴性,有利于代碼的編寫和維護

下面來看看如何使用 require.js

要想使用 require.js,首先要 define

// ? 代表該參數可選 define(id?, dependencies?, factory); 
  • 1
  • 2
  • id:指的是定義的模塊的名字
  • dependencies:是定義的模塊所依賴模塊的數組
  • factory:為模塊初始化要執行的函數或對象。如果為函數,它應該只被執行一次。如果是對象,此對象應該為模塊的輸出值。

    具體的規范說明可以參考 AMD (中文版) 
    舉個例子,創建一個名為 “alpha” 的模塊,使用了 require,exports,和名為 “beta” 的模塊:

define("alpha", ["require", "exports", "beta"], function (require, exports, beta) { exports.verb = function() { return beta.verb(); //Or: return require("beta").verb();
       }
   }); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

一個返回對象的匿名模塊:

define(["alpha"], function (alpha) { return {
         verb: function(){ return alpha.verb() + 2;
         }
       };
   }); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

一個沒有依賴性的模塊可以直接定義對象:

define({
     add: function(x, y){ return x + y;
     }
   }); 
  • 1
  • 2
  • 3
  • 4
  • 5

如何使用

AMD 采用 require 語句加載模塊

require([module],callback); 
  • 1
  • module:是一個數組,里面的成員是要加載的模塊
  • callback:加載成功之后的回調函數

例如

require(['./a.js'],function(a){ var date = new Date()
    a.printDate(date)
}) 
  • 1
  • 2
  • 3
  • 4

具體的使用方法如下

// util.js define(function(){ return {
        getFormatDate:function(date,type){ if(type === 1){ return '2018-08-09' } if(type === 2){ return '2018 年 8 月 9 日' }
        }
    }
}) // a-util.js define(['./util.js'],function(util){ return {
        aGetFormatDate:function(date){ return util.getFormatDate(date,2)
        }
    }
}) // a.js define(['./a-util.js'],function(aUtil){ return {
        printDate:function(date){ console.log(aUtil.aGetFormatDate(date))
        }
    }
}) // main.js require(['./a.js'],function(a){ var date = new Date()
    a.printDate(date)
}) // 使用 // <script src = "/require.min.js" data-main="./main.js"></script>  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

假設這里有 4 個文件,util.js,a-util.js 引用了 util.js,a.js 引用了 a-util.js,main.js 引用了 a.js。

其中,data-main 屬性的作用是加載網頁程序的主模塊。

上例演示了一個主模塊最簡單的寫法,默認情況下,require.js 假設依賴和主模塊在同一個目錄。

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

require.config({
    paths:{ "a":"src/a.js", "b":"src/b.js" }
}) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

還有一種方法是改變基礎目錄(baseUrl)

require.config({

    baseUrl: "src",

    paths: { "a": "a.js", "b": "b.js",

    }

  }); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

4. CommonJS

commonJS 是 nodejs 的模塊化規范,現在被大量用在前端,由于構建工具的高度自動化,使得使用 npm 的成本非常低。commonJS 不會異步加載 JS,而是同步一次性加載出來

在 commonJS 中,有一個全局性的方法 require(),用于加載模塊,例如

const util = require('util'); 
  • 1

然后,就可以調用 util 提供的方法了

const util = require('util'); var date = new date();
util.getFormatDate(date,1); 
  • 1
  • 2
  • 3

commonJS 對于模塊的定義分三種,模塊定義(exports),模塊引用(require)和模塊標示(module)

exports() 對象用于導出當前模塊的變量或方法,唯一的導出口。require() 用來引入外部模塊。module 對象代表模塊本身。

舉個栗子

// util.js module.exports = {
    getFormatDate:function(date, type){ if(type === 1){ return '2017-06-15' } if(type === 2){ return '2017 年 6 月 15 日' }
    }
} // a-util.js const util = require('util.js')
module.exports = {
    aGetFormatDate:function(date){ return util.getFormatDate(date,2)
    }
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

或者下面這種方式

 // foobar.js // 定義行為 function foobar(){ this.foo = function(){ console.log('Hello foo');
        } this.bar = function(){ console.log('Hello bar');
          }
 } // 把 foobar 暴露給其它模塊 exports.foobar = foobar; // main.js //使用文件與模塊文件在同一目錄 var foobar = require('./foobar').foobar,
test = new foobar();
test.bar(); // 'Hello bar' 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

5. ES6 Module

ES6 模塊的設計思想是盡量靜態化,使得編譯時就能確定模塊的依賴關系,以及輸入和輸出的變量,而 CommonJS 和 AMD 模塊都只能在運行時確定這些關系。如 CommonJS 加載方式為 “運行時加載”,ES6 的加載方式為 “編譯時加載” 或者靜態加載,即 ES6 可以在編譯時就完成模塊加載,效率比 CommonJS 模塊的加載方式高。

ES6 模塊自動采用嚴格模式,不管有沒有在模塊頭部加上 “use strict”。

ES6 export 語句輸出的接口與其對應的值是動態綁定關系,即通過該接口可以取到模塊內部實時的值。而 CommonJS 模塊輸出的是值的緩存,不存在動態更新。

ES6 與 CommonJS 模塊的差異

  • CommonJS 模塊輸出的是一個值的復制,ES6 模塊輸出的是值的引用。
  • CommonJS 模塊是運行時加載,ES6 模塊是編譯時輸出接口。
  • CommonJS 中的 this 指向當前模塊,ES6 模塊 this 為 undefined

第二個差異是因為 CommonJS 加載的是一個對象(即 Module.exports 屬性),該對象只有在腳本運行結束時才會生成,而 ES6 模塊不是對象,它的對外接口只是一種靜態定義,在代碼靜態解析階段就會生成。

總結

CommonJS 采用了服務器優先的策略,使用同步方式加載模塊,而 AMD 采用異步加載的方式。所以如果需要使用異步加載 js 的話建議使用 AMD,而當項目使用了 npm 的情況下建議使用 CommonJS。

藍藍設計www.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務。


日歷

鏈接

個人資料

藍藍設計的小編 http://www.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
亚洲精品美女久久| 亚洲欧美精品一区二区| 日韩精品免费观看| 韩剧1988免费观看全集| 狠狠躁18三区二区一区| 欧美性猛交xxxx乱大交蜜桃| 日韩美女在线观看一区| 日韩美女视频在线观看| 日韩精品在线私人| 久久大大胆人体| 国产97在线|日韩| 欧美激情精品久久久久久| 欧美日韩激情视频8区| 2019中文字幕在线观看| 精品久久久久久久久久| 国产午夜精品理论片a级探花| 亚洲国产成人精品电影| 国产丝袜一区二区| 欧美最猛性xxxx| 国产91在线播放精品91| 91精品国产综合久久男男| 国产成人鲁鲁免费视频a| 久久免费高清视频| 久久久国产一区二区三区| 欧美大秀在线观看| 欧美日韩国产色| 欧美精品久久久久| 亚洲精品mp4| 伊人男人综合视频网| 黄色一区二区在线| 九九精品视频在线观看| 亚洲欧美日韩精品久久| 国产精品国产三级国产专播精品人| 亚洲少妇中文在线| 国产精品午夜国产小视频| 国产精品1区2区在线观看| 97在线免费视频| 国产精品免费一区二区三区都可以| 奇米4444一区二区三区| 亚洲一区二区日本| 懂色aⅴ精品一区二区三区蜜月| 久久久久久久久国产精品| 国产精品电影观看| 中文在线资源观看视频网站免费不卡| 日韩一区av在线| 国产精品va在线播放我和闺蜜| 国产91热爆ts人妖在线| 亚洲男人天堂视频| 欧美视频中文在线看| 亚洲а∨天堂久久精品9966| 日韩av电影免费观看高清| 亚洲精品成人久久久| 欧美日韩亚洲91| 亚洲一区第一页| 欧美日韩国产区| 日韩在线视频观看正片免费网站| 欧美福利小视频| 国产日韩欧美在线观看| 亚洲理论片在线观看| 国产亚洲精品久久久| 日韩免费在线免费观看| 亚洲乱码一区二区| 久久久久久尹人网香蕉| 日韩黄色av网站| 久久久精品久久| 欧美性猛交xxxx偷拍洗澡| 亚洲国产精品va在线看黑人动漫| 国产精品美乳在线观看| 久久成年人视频| 欧美性猛交xxxx免费看漫画| 在线日韩中文字幕| 日韩美女激情视频| 亚洲国产欧美自拍| 久久久久久中文| 91精品久久久久久| 国产一区二区三区精品久久久| 中文字幕少妇一区二区三区| 欧美韩国理论所午夜片917电影| 亚洲男人天堂2023| 91视频九色网站| 国产精品一区电影| 91亚洲精品在线| 国产精品爽黄69天堂a| 欧美性xxxx18| 日韩欧美aⅴ综合网站发布| 国产精品久久久久久久久久小说| 国产suv精品一区二区三区88区| 57pao精品| 亚洲天堂av综合网| 日韩中文字幕国产| 欧亚精品在线观看| 久久视频在线观看免费| 亚洲美女又黄又爽在线观看| 亚洲一区二区在线| 国产91色在线免费| 国产精品成人一区二区三区吃奶| 国产日韩精品一区二区| 久久香蕉精品香蕉| 久久五月天综合| 51精品国产黑色丝袜高跟鞋| 亚洲综合自拍一区| 久久精品电影一区二区| 性金发美女69hd大尺寸| 海角国产乱辈乱精品视频| 欧美激情视频一区二区三区不卡| 国产日韩欧美在线看| 亚洲人成77777在线观看网| 久久精品视频免费播放| 在线看国产精品| 精品久久久久久久中文字幕| 国自产精品手机在线观看视频| 国产精品国语对白| 96国产粉嫩美女| 国产精品va在线播放我和闺蜜| 亚洲mm色国产网站| 亚洲人成人99网站| 最新日韩中文字幕| 青青在线视频一区二区三区| 日韩在线视频免费观看高清中文| 亚洲福利视频网站| 久久精品久久久久久国产 免费| 1769国产精品| 在线播放日韩精品| 亚洲福利影片在线| 91中文在线视频| 国产欧美韩国高清| 精品露脸国产偷人在视频| 亚洲国产精品va在线看黑人动漫| 国产亚洲一区二区精品| 成人免费观看49www在线观看| 久久久国产精品x99av| 亚洲美女精品成人在线视频| 91精品国产综合久久香蕉的用户体验| 高清欧美性猛交xxxx| 国产精品美女视频网站| 久久久精品在线观看| 免费91麻豆精品国产自产在线观看| 国产精品第100页| 国产精品欧美风情| 午夜精品一区二区三区在线视| 亚洲在线观看视频网站| 久久久噜噜噜久久| 欧美www在线| 久久综合免费视频影院| 欧美精品videofree1080p| 91香蕉电影院| 国产精品美女呻吟| 亚洲精品日韩欧美| 成人福利免费观看| 日韩高清电影免费观看完整版| 日韩中文字幕不卡视频| 日韩欧美有码在线| 久久精品免费播放| 日韩欧美国产骚| 日韩三级成人av网| 成人精品网站在线观看| 日韩精品在线第一页| 亚洲精品91美女久久久久久久| 国产精品色婷婷视频| 欧美日韩国产va另类| 国产精品久久久久久久久久久久久久| 亚洲成人精品av| 日韩欧美在线观看视频| 欧美肥臀大乳一区二区免费视频|