前端模塊化

前端模塊化定義

前端的那模塊化,通過將代碼拆分為更小、獨立的單元,讓開發(fā)這可以更好管控代碼,提高可維護性、可重用性、可讀性

commonjs和es module區(qū)別

https://zhuanlan.zhihu.com/p/356526196
commonjs

  • 一般在服務(wù)器(node)中使用
  • 導(dǎo)入require,導(dǎo)出:exports/module.exports
  • 支持動態(tài)引入,即不用放在最上層,使用時引入即可;重復(fù)引入只加載一次
  • require加載的是值的拷貝
  • require()方法同步,代碼會等待此處模塊加載完成后,再執(zhí)行
  • 混合導(dǎo)出不會出現(xiàn)問題;導(dǎo)出引用對象時之前的導(dǎo)出就被覆蓋了

es module

  • 一般用在客戶端
  • 導(dǎo)入import、導(dǎo)出export/export default
  • 導(dǎo)入只能放在最上層(不可再函數(shù)、判斷語句中引用),不支持動態(tài)導(dǎo)入
  • import加載的是值的引用
  • import方法異步,代碼不會阻塞在關(guān)鍵字處,等待加載完成,而是在后臺異步加載,莫塊加載完成后執(zhí)行后面代碼
  • 混合導(dǎo)出不會出現(xiàn)問題,但是導(dǎo)入時要先引用【默認導(dǎo)出】,后引用【單個導(dǎo)出】

值的拷貝:基本類型的值是按值傳遞的,每個變量存儲的都是該值的拷貝,修改其中一個變量不會影響其他變量
值的引用:引用類型的值是按引用傳遞的,每個變量存儲的是該值的引用,即指向同一個對象。修改其中一個變量會影響其他變量

module.exports與exports區(qū)別

http://www.lxweimin.com/p/2f8d097a681a

當(dāng)每個js文件在執(zhí)行或被require的時候,NodeJS其實創(chuàng)建了一個新的實例var module = new Module(),這個實例名叫module

var module = new Module();
var exports = module.exports;

exports是module.exports的引用(地址是一樣的),module.exports初始值為{}

  • require 引用模塊后,返回的是 module.exports 而不是 exports!!!!!
  • exports.xxx 相當(dāng)于在導(dǎo)出對象上掛屬性,該屬性對調(diào)用模塊直接可見
exports = [0, 1];
console.log(exports === module.exports);// false
exports.arr = [0, 1];
console.log(exports === module.exports);// true

// require引入的模塊是一個對象值
let data = require("./index.js") // data是一個對象
export 與export default區(qū)別
  • 都可以導(dǎo)出變量、函數(shù)、文件等
  • 一個文件中export可以存在多個,export default只能存在一個
  • export導(dǎo)出的文件在引入時需要加上{},export default不需要
require和import區(qū)別

https://zhuanlan.zhihu.com/p/121770261

  • require是commonjs規(guī)范,用在服務(wù)器端;import是es module規(guī)范用在客戶端
  • require運行時動態(tài)加載,import是靜態(tài)編譯
  • require加載的是值的拷貝,import加載的是值的引用
  • require引入的值,不可以被提前使用,ES6 模塊可以在import之前使用import的值
  • require可以在判斷語句、函數(shù)中引用,import不可以
  • require默認不使用嚴格模式,import/export導(dǎo)出的模塊默認使用嚴格模式
AMD(預(yù)加載)和CMD(懶加載)區(qū)別
  • 對于依賴的模塊,AMD 是提前執(zhí)行,CMD 是延遲執(zhí)行
  • AMD依賴前置,CMD就近依賴
// AMD 默認推薦的是
define(['./a', './b'], function(a, b) {  // 依賴必須一開始就寫好    
a.doSomething()   
// 此處略去 100 行    
b.doSomething()    ...})
// CMD
define(function(require, exports, module) {   
var a = require('./a')  
a.doSomething()   
// 此處略去 100 行  
var b = require('./b') 
// 依賴可以就近書寫  
b.doSomething()   // ... })
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容