js模塊化規(guī)范

介紹

js模塊化規(guī)范當(dāng)下最重要的前端開發(fā)范式之一
為了解決,作用域,變量沖突,代碼組織的問題,早期是沒有模塊化,隨著前端日益復(fù)雜,代碼組織越來越困難,出現(xiàn)了一系列模塊化規(guī)范

功能不同,劃分為不同模塊 ,是一種思想,并不包含實(shí)現(xiàn)

演變介紹

1.基于文件劃分
最原始 ,單獨(dú)存放在不同文件,通過script將文件引用到代碼中,
 沒有私用空間,都是全局變量,容易引起命令沖突,無(wú)法管理依賴關(guān)系,完全依靠約束

2.命名空間
將每個(gè)對(duì)象包裹在不同的函數(shù)模塊內(nèi)
任然沒有私用空間,依賴關(guān)系任然沒解決

3.IIFE 立即執(zhí)行函數(shù)方式提供私用空間
image.png

標(biāo)準(zhǔn)和規(guī)范

1.Common.js

nodejs提出的一套標(biāo)準(zhǔn),nodejs遵循此規(guī)范,通過module.exports導(dǎo)出模塊,通過require導(dǎo)入

瀏覽器使用有問題,通過同步方式加載模塊,如果在瀏覽器中導(dǎo)致降低效率

2.AMD (Asynchronous Module Definition) 異步模塊加載規(guī)范

request.js實(shí)現(xiàn)了AMD規(guī)范 強(qiáng)大的模塊加載器
AMD使用方式

//定義一個(gè)模塊  定義一個(gè)私有空間
define('module1', ['jqury', './module2' ], function($, moudle2){
  return { // 導(dǎo)出一些成員
      start: function(){
          $('body').animate({ margin: '200px' })
          module2()
        }
   }
}) 

載入一個(gè)模塊

require(['module1', function(module1){
  module1.start()
}]

目前絕大多數(shù)第三庫(kù)支持AMD規(guī)范
缺點(diǎn):請(qǐng)求次數(shù)多,頁(yè)面效率低

同期一個(gè)淘寶推出規(guī)范類似AMD
sea.js CMD

目前模塊化已經(jīng)比較成熟,主要瀏覽器使用 esModule, nodejs使用Common.js


image.png

Common.js nodejs內(nèi)置的模塊系統(tǒng)

esModule
最主流的瀏覽器模塊管理工具
ECMAScript2015(es6)新出的模塊規(guī)范

esModuel特性

目前大多數(shù)瀏覽器已經(jīng)支持esModule規(guī)范

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 通過給script添加type=module屬性, 就可以以esModule的標(biāo)準(zhǔn)執(zhí)行其中js代碼 -->
    <script type="module">
        console.log('這是一個(gè)esmodue')
    </script>
    <!-- 自動(dòng)采取嚴(yán)格模式, 忽略 ’use strict‘, 嚴(yán)格模式中,不能再全局直接使用this -->
    <script type="module">
        console.log(this) // undefined
    </script>

    <!-- 每一個(gè)ES Module都是運(yùn)行在單獨(dú)的私有作用域中 -->
    <script type="module">
        var fot = 100;
        console.log(fot)
    </script>
    <script type="module">
        console.log(fot) // 訪問不到
    </script>

    <!-- ESModule 通過CORS 的方式請(qǐng)求外部 JS模塊的 -->
    <script type="module" src='https://www.baidu.com'></script>

    <!-- ESModule會(huì)延遲執(zhí)行 腳本 相當(dāng)于 defer -->
    <script defer type="module"></script>
</body>
</html>

esmodule導(dǎo)入和導(dǎo)出

module.js
var str = 'esmodule'
export {str}

app.js
import {str} from './module.js'

由于esModule是新出的規(guī)范,一些瀏覽器(IE,國(guó)產(chǎn)的小型瀏覽器)還不支持此規(guī)范,所以需要考慮兼容,polyfill
可以使用插件# es-module-loader

image.png

如果ie報(bào)不支持promise則還需要引用 promise-polyfill

Tip:生產(chǎn)階段盡量不要使用,影響頁(yè)面加載效率

常用的模塊化打包工具

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容