亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Javarscript中模塊(module)、加載(load)與捆綁(bundle)詳解

2019-11-19 16:28:04
字體:
來源:轉載
供稿:網友

JS模塊簡介

js模塊化,簡單說就是將系統或者功能分隔成單獨的、互不影響的代碼片段,經過嚴格定義接口,使各模塊間互不影響,且可以為其他所用。

常見的模塊化有,C中的include (.h)文件、java中的import等。

為什么JS需要模塊

很顯然,沒有模塊我們也可以實現同樣的功能,為什么我們還要使用模塊來寫js代碼呢?下面幾點是模塊化給我們帶來的一些變化:

  • 抽象代碼:我們在使用模塊來調用一個api時,可以不用知道內部是如何實現的,避免去理解其中復雜的代碼;
  • 封裝代碼:在不需要再次修改代碼的前提下,我們可以在模塊內部隱藏其具體實現;
  • 復用代碼:一些常用的、通用的功能,以模塊來實現可以避免過多的重復代碼;
  • 管理依賴:可以通過簡單的修改依賴項來管理功能的實現,而不需要去重新修改自己內部的代碼實現。

ES5及之前的模塊系統

在ES5及之前版本,還沒有原生的模塊語法。不過這并不代表ES5之前,前端沒有使用模塊。簡單介紹兩種:IIFE、Revealing Module.

IIFE

Immediately Invoked Function Expression,立即執行函數表達式。

(function(){  // ... })()

看上面的代碼,IIFE可以說成是一個在定義的時候就執行的匿名函數。注意函數是先被”()”包起來了,然后后面緊跟”()”表示執行函數。如果是以下代碼,將會報錯:

function(){  console.log('test'); }() // => Uncaught SyntaxError: Unexpected token )

這種寫法表示,先定義一個匿名函數,然后再去解析”()”。由于在第一行”function”出現在首位,這表明此處定義一個函數,函數后緊跟”()”,此時表示單獨解析”()”,就會報出上面的錯誤信息,因此需要先將函數定義包裹起來。
“(function…)”這種寫法表示執行”()”內部代碼,并返回該語句執行結果,此處返回結果為該函數,后面緊跟”()”即表示執行該函數。IIFE可以幫助我們做到:

  • 不需要了解具體的代碼實現情況下取得想要的效果;
  • 在內部定義的變量不會污染全局作用域。

顯而易見,這種編碼方式并沒有提供良好的機制來解決依賴管理問題。

Revealing Module

根據字面暫解釋為揭示模式,與IIFE形式類似,但是提供了一個返回值。方便集中管理公有的api,使模塊、公用api更加簡潔清晰。

// Expose module as global variable var singleton = function(){  // Inner logic  function sayHello(){  console.log('Hello');  }  // Expose API  return {  sayHello: sayHello  } }()

稍微注意下,上面的代碼,我們并沒有用”()”去包裹,因為關鍵字”function”并不在該行的開頭。

我們可以像下面這樣使用模塊api:

// Access module functionality singleton.sayHello(); // => Hello

當然,我們也可以以構造函數形式導出:

// Expose module as global variable var Module = function(){  // Inner logic  function sayHello(){  console.log('Hello');  }  // Expose API  return {  sayHello: sayHello  } }

請注意,上面函數在定義的時候并沒有執行。

我們可以這么使用它:

var module = new Module();module.sayHello(); // => Hello

與IIFE一樣,揭示模式并沒有提供良好的解決依賴管理的方案。

更多模塊化解決方案

ES6或者ES2015,自帶原生的模塊語法。

在這之前,有以下幾種常見的用于模塊化的解決方案:

  • AMD
  • CMD
  • CommonJs
  • UMD
  • System.register
  • ES6

AMD

AMD,Asynchronous Module Definition,異步模塊定義。AMD形式被用于瀏覽器端,使用”define”來定義模塊依賴:

//Calling define with a dependency array and a factory function define(['dep1', 'dep2'], function (dep1, dep2) {  //Define the module value by returning a value.  return function () {}; });

CMD

CMD,Common Module Definition,通用模塊定義。該規范由國內大神玉伯提出,與AMD區別在與AMD是依賴關系前置,有該依賴就必須先加載依賴,CMD是按需加載。

// CMD define(function(require, exports, module) { var a = require('./a') a.doSomething() // 此處略去 100 行 var b = require('./b') // 依賴可以就近書寫 b.doSomething() // ... }) // AMD 默認推薦的是 define(['./a', './b'], function(a, b) { // 依賴必須一開始就寫好 a.doSomething() // 此處略去 100 行 b.doSomething() ... })

CommonJs

CommonJs在Node.js中用的較多,使用”require”來定義依賴,使用”module.exports”來定義模塊:

var dep1 = require('./dep1'); var dep2 = require('./dep2'); module.exports = function(){  // ... }

UMD

UMD,Universal Module Definition,通用模塊定義??梢杂糜跒g覽器端與Node.js端:

(function (root, factory) {  if (typeof define === 'function' && define.amd) {  // AMD. Register as an anonymous module.   define(['b'], factory);  } else if (typeof module === 'object' && module.exports) {  // Node. Does not work with strict CommonJS, but  // only CommonJS-like environments that support module.exports,  // like Node.  module.exports = factory(require('b'));  } else {  // Browser globals (root is window)  root.returnExports = factory(root.b);  } }(this, function (b) {  //use b in some fashion.  // Just return a value to define the module export.  // This example returns an object, but the module  // can return a function as the exported value.  return {}; }));

System.register

System.register方式設計初衷主要是為了在ES5中能夠支持ES6模塊語法:

import { p as q } from './dep'; var s = 'local'; export function func() {  return q; } export class C { }

ES6 module

ES6中自帶原生的模塊語法,使用關鍵字”export”來導出模塊的公用api:

// lib.js // Export the function export function sayHello(){  console.log('Hello'); } // Do not export the function function somePrivateFunction(){  // ... }

以關鍵字”import”來導入模塊:

import { sayHello } from './lib'; sayHello(); // => Hello

目前各瀏覽器對ES6的支持度不一,因此我們現在需要使用編譯器,像Babel,來將ES6的代碼編譯成ES5的形式。

模塊加載器

一個模塊加載器可以理解模塊,并以固定的形式來加載模塊。

模塊加載器工作在運行時,流程大致如下:

  • 你在瀏覽器中運行模塊加載器;
  • 你告訴模塊加載器需要加載哪個主文件;
  • 模塊加載器下載并解析主文件;
  • 模塊加載器按需加載其他文件。

一些比較常見的模塊加載器有:

  • RequireJS:以AMD風格加載模塊;
  • SeaJS:以CMD風格加載模塊;
  • SystemJS:以AMD, CommonJS, UMD 或者 System.register風格加載模塊;
  • jspm:jspm基于SystemJS,是模塊加載器,同時也具備瀏覽器端包管理功能。

模塊打包

模塊打包可以替換模塊加載器。

然而,相比模塊加載器,模塊打包動作是在編譯時運行的:

  • 使用模塊打包在編譯期生成一個js文件;(例如bundle.js)
  • 在瀏覽器中加載該文件。

截止目前,比較常用的模塊打包方案有以下兩種:

  • Browserify:為CommonJS模塊打包;
  • Webpack: 為AMD、CommonJS、ES6模塊打包。

總結

為了在現代js開發環境中更好的使用這些工具,你首先需要知道模塊、模塊化解決方案、模塊加載、模塊打包之前的區別。

模塊是一段封裝好的代碼,可以以公用api形式導出并在其他代碼中被加載和調用;

模塊化解決方案或者模塊化思想,實際含義是定義一個模塊的語法。由于定義語法的差異,目前常用的有AMD、CMD、CommonJS、UMD等;

模塊加載,在運行期解析和加載模塊。常見的有RequireJS、SeaJS、SystemJS和jspm;

模塊打包,其替換了模塊加載的概念,在編譯期間生成一個所有代碼整合后的bundle.js文件。常見的有Browserify和Webpack。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
福利精品视频在线| 97超级碰碰人国产在线观看| 国产有码在线一区二区视频| 91色视频在线导航| 亚洲精品aⅴ中文字幕乱码| 国产欧美日韩精品丝袜高跟鞋| 亚洲高清一二三区| 日韩大胆人体377p| 亚洲欧美日韩精品久久亚洲区| 日韩中文字幕在线精品| 91中文在线观看| 久久激情视频久久| 国产精品91久久久| 国产欧美日韩中文字幕| 黄色成人av网| 亚洲第一综合天堂另类专| 欧美另类xxx| 久久久久中文字幕2018| 九九久久精品一区| 亚州精品天堂中文字幕| 亚洲国产成人精品女人久久久| 精品女同一区二区三区在线播放| 亚洲欧美另类人妖| 久久亚洲精品一区二区| 欧美理论片在线观看| 国产精品美女999| 国模视频一区二区| 欧美日韩视频免费播放| 在线观看国产精品91| 国内精品视频在线| 国产亚洲精品一区二555| 欧美黑人性视频| 97视频国产在线| 国产成人激情小视频| 精品免费在线观看| 97香蕉超级碰碰久久免费软件| 久久久久免费精品国产| 日韩在线观看免费| 欧美日韩中文字幕| 欧美中文在线视频| 国产日韩欧美中文| 狠狠操狠狠色综合网| 精品久久久国产精品999| 久久久久国产视频| 久久偷看各类女兵18女厕嘘嘘| 亚洲欧美国产另类| 精品福利在线视频| 菠萝蜜影院一区二区免费| 久久久久久亚洲精品中文字幕| 欧美极品在线播放| 国产精品扒开腿做爽爽爽男男| 日本午夜在线亚洲.国产| www.99久久热国产日韩欧美.com| 久久精品国产精品亚洲| 91中文精品字幕在线视频| 成人福利在线视频| 亚洲爱爱爱爱爱| 在线看福利67194| 久久久久九九九九| 日韩精品视频中文在线观看| 97av在线播放| 精品久久久久久久久久久| 国产精品久久久久久搜索| 亚洲综合小说区| 91精品国产91久久久久| 性色av一区二区咪爱| 北条麻妃一区二区在线观看| 91av在线播放| 在线观看国产精品淫| 国产偷亚洲偷欧美偷精品| 一区二区欧美亚洲| 国产精品视频26uuu| 97人人模人人爽人人喊中文字| 国内自拍欧美激情| 奇米影视亚洲狠狠色| 欧美激情性做爰免费视频| 欧美精品激情blacked18| 日韩电影在线观看中文字幕| 久久99精品国产99久久6尤物| 国产欧美 在线欧美| 狠狠久久五月精品中文字幕| 亚洲国产三级网| 国产香蕉97碰碰久久人人| 精品动漫一区二区| 97视频在线看| 色妞欧美日韩在线| 最近免费中文字幕视频2019| 亚洲国产精品久久久久秋霞蜜臀| 国产一区二区激情| 91精品国产免费久久久久久| 亚洲男人av在线| 日韩亚洲精品视频| 在线观看中文字幕亚洲| 欧美激情一区二区久久久| 日韩av色在线| 亚洲国产中文字幕在线观看| 欧美一级视频一区二区| 亚洲电影免费观看高清完整版| 欧美日韩成人在线观看| 欧美午夜视频一区二区| 亚洲国产91色在线| 午夜精品久久久久久久白皮肤| 91欧美日韩一区| 91沈先生在线观看| 亚洲free嫩bbb| 91国偷自产一区二区三区的观看方式| 欧美疯狂xxxx大交乱88av| 欧美在线视频一二三| 日韩专区在线播放| 欧美怡春院一区二区三区| 国产精品午夜国产小视频| 国产91免费观看| 欧美精品亚州精品| 91高潮在线观看| 欧美国产日产韩国视频| 亚洲午夜色婷婷在线| 国产精品久久国产精品99gif| 久久精品国产一区二区三区| 欧美日韩在线第一页| 国产美女91呻吟求| 51视频国产精品一区二区| 久久精品91久久久久久再现| 97视频免费在线观看| 国产精品电影一区| 77777少妇光屁股久久一区| 欧美精品第一页在线播放| 琪琪第一精品导航| 亚洲精品视频中文字幕| 国产精品成人久久久久| 国产亚洲精品高潮| 日韩中文视频免费在线观看| 国产精品一区二区久久久| 精品自在线视频| 国产精品成人免费视频| 国产精品久久久久久久久久免费| 久久99精品国产99久久6尤物| 欧美激情视频一区二区| 久久综合电影一区| 91黑丝高跟在线| 日韩av免费观影| 国产精品96久久久久久又黄又硬| 亚洲第一区第二区| 国产欧美欧洲在线观看| 91精品国产高清自在线看超| 青青久久aⅴ北条麻妃| 亚洲毛片在线看| 亚洲深夜福利网站| 国产精品国产三级国产aⅴ浪潮| 国产欧美日韩中文字幕在线| 少妇高潮久久久久久潘金莲| 一区二区三区回区在观看免费视频| 亚洲女人天堂网| 亚洲第一精品久久忘忧草社区| 亚洲精品色婷婷福利天堂| 国产一区二区三区高清在线观看| 欧美成人sm免费视频| 欧美性猛交xxxx黑人猛交| 国产亚洲成av人片在线观看桃| 欧美日韩xxx| 日韩视频欧美视频| 26uuu另类亚洲欧美日本老年| 性欧美在线看片a免费观看| 日韩av三级在线观看| 国产成人拍精品视频午夜网站|