【前端工程化】

目錄

  • 前端工程戶核心技術之模塊化
    • 前端模塊化的進化過程
    • commonjs規范介紹
      • commonjs規范示例
      • commonjs模塊打包
    • amd規范、cmd規范
    • 前端工程化關鍵技術之npm+webpack原理

前端工程戶核心技術之模塊化

前端模塊化是一種標準,不是實現。commonjs是前端模塊化的標準,而nodejs實現了一套commonjs的規范。
什么是前端模塊化:將復雜程序根據規范拆分成若干個模塊,每個模塊間組織是有邏輯的,一個模塊包括輸入和輸出,每個模塊內部實現時私有的,對外暴露接口與其他模塊通信,而不是直接調用的關系。這其實就是一種典型的面向對象編程思想。一個html頁面可以引用的script標簽包括:腳本和模塊
腳本和模塊的區別:請添加圖片描述
原來我們所有的業務邏輯代碼只能寫在index.js里,但用了模塊化標準以后,就可以對他進行拆分了,可以把他拆分為一個入口文件entry.js,這個入口文件去引用若干個模塊,然后把他們組織起來進行調用,瀏覽器去調用時,主要訪問入口文件,再由入口文件調用其他模塊化文件,組裝成一個業務邏輯。腳本和模塊化最典型的區別就是,通過模塊化拆分后,我們可以更清楚的看到整個業務的邏輯,如果只有一個index.js你并不知道源碼里面在干什么。

前端模塊化的進化過程

請添加圖片描述
定義的函數是掛載在window上的,如果有一個文件夾里也定義api函數,會引發全局命名空間沖突
請添加圖片描述
請添加圖片描述
請添加圖片描述

commonjs規范介紹

commonjs是nodejs默認模塊化規范,每個文件就是一個模塊,有自己的作用域,可以維護自己的私有變量,node中cjs模塊加載采用同步加載方式,必須等這個模塊加載完了再去執行后面的代碼,通過require加載模塊,通過exports或者module.exports輸出模塊。
commonjs規范特點:

  1. 所有代碼都運行在模塊作用域,沒有js腳本概念,寫一個js文件就是一個模塊,所以不會污染全局作用域。
  2. 模塊可以多次加載,第一次加載時會運行模塊,模塊輸出結果會被緩存,再次加載時,會從緩存結果中直接讀取模塊輸出結果。
  3. 模塊加載的順序,按照其在代碼中出現的順序
  4. 模塊輸出的值是值的拷貝,類似iife方案中的內部變量

commonjs規范示例

每個功能創建一個文件,如api文件:

const handle = require('./handle')
function api(){return {code: 0,data:{a: 1,b: 2,}}
}
module.exports = {api,handle
}

handle.js文件:

function handle(data, key){return data.data[key]
}module.exports = handle;

sum.js文件:

function sum(a, b){return a+b;
}module.exports = sum;

然后在entry.js中引入各文件,執行相關業務邏輯:
請添加圖片描述
請添加圖片描述
首先,我們需要有一個主模塊(即入口文件entry.js),在主模塊中,我們會使用require加載模塊,require加載模塊時會把模塊變成module對象,module對象中有一個load方法,通過load方法進行模塊加載,在加載過程中,他會在模塊的外層包一層,把原來的模塊變成自適應函數,我們寫的代碼(比如寫在api.js中的代碼)變成函數里面的內容了,他會向自適應函數傳入一些變量(require、module、exports、_filename、_dirname),這就是為什么在node里可以直接使用require的原因。使用module.exports輸出模塊時,最終輸出結果會被緩存到module cache map中,這是一個鍵值對,鍵是module path+module name,值是module.exports。commonjs輸出模塊時,module.exports只能輸出一個結果

commonjs模塊打包

安裝browserify:npm install browserify -g
打包命令:browserify module_test/cjs/entry.js -o dist/bundle.js
??當存在多個entry.js模塊時,每個entry.js模塊都需要單獨打包
browserify打包原理:

  1. 本質還是通過自執行函數實現模塊化
  2. 將每個模塊編號,存入一個對象,每個模塊標記依賴模塊
  3. 實現了require方法,核心是通過call方法調用模塊,并傳入require、module、exports方法,通過module存儲模塊信息,通過exports存儲模塊輸出信息

amd規范、cmd規范

amd規范采用非同步(異步)加載模塊,允許指定回調函數。node模塊通常位于本地,加載速度快,所以適用于同步加載,但是在瀏覽器中,如果用同步加載會阻塞模塊渲染(整個頁面的渲染),所以在瀏覽器環境下,模塊需要請求獲取,適用于異步加載,所以誕生了amd規范,用來做異步加載,require.js是amd的一個具體實現庫,amd、cmd目前很少使用,因為目前我們主要使用node和瀏覽器開發,分別使用commonjs和esmoudle。
cmd規范整合了commonjs和amd的優點,模塊加載是異步的,cmd專門用于瀏覽器端,sea.js是cmd規范的一個實現,amd和cmd最大的問題是沒有通過語法升級解決模塊化,他們定義模塊還是通過調用js方法來生成模塊,這種方式利于我們快速應用,但是他沒有辦法對模塊化進行規模化的應用,因為他們沒有實現標準的語法規范
ESMoudle規范設計理念是希望在編譯時就確定模塊以來關系及輸入輸出,commonjs和amd必須在運行時才能確定依賴和輸入、輸出,ESMoudle通過import加載模塊,通過exports輸出模塊
commonjs和ESMoudle規范的對比:

  1. commonjs模塊輸出的是值的拷貝,也就是說commonjs模塊內部的值你想改是改不了的,但是es6模塊輸出的是值的引用
    使用es6定義test.js文件:
export let a = 1;
export function plus() {a++;
}

定義entry.js文件:

import {a, plus} from './test.js'
console.log(a);//1
plus();
console.log(a);//2

使用commonjs定義test.js:

let a = 1;
exports.a = a;
exports.plus = function(){a++;
}
// 上述代碼等同于:
// module.exports={
//     a:1,// 這個a的值是直接拷貝過來的
//     plus// plus里加的是模塊里的a
// }

定義entry.js文件:

const { a, plus} = require(./test.js);
console.log(a);// 1
plus();
console.log(a);// 1

如果想要獲取模塊里的a,需要使用get方法,在commonjs定義的test.js中定義get方法:

let a = 1;
exports.a = a;
exports.plus = function(){a++;
}
exports.get = function(){return a;
}

在entry.js文件中調用get:

const { a, plus, get} = require(./test.js);
console.log(a);// 1
plus();
console.log(a);// 1
console.log(get());// 2
  1. commonjs模塊是運行時加載,es6模塊是編譯時輸出接口,在編譯時就能確定導入哪些模塊,輸出哪些模塊
  2. commonjs是單個值導出,es6可以導出多個
  3. commonjs模塊為同步加載,es6支持異步加載,導出的是一個promise
    請添加圖片描述
  4. commonjs的this是當前模塊的輸出值,es6的this是undefined
  5. commonjs和es6的語法不同
    請添加圖片描述
    script腳本和模塊對比:模塊具備更高的開發效率,可以將復雜的代碼拆分成若干簡單的代碼,代碼可讀性強,復用高效,但是模塊在加載過程中會損耗性能,因為模塊文件很多,會使得加載速度變得更慢,而腳本具有更高的頁面性能。模塊在瀏覽器中運行會存在兼容性問題,要特別注意。所以在瀏覽器中運用模塊化存在一些局限性,比如瀏覽器缺乏模塊管理能力,模塊分散在各個項目中,模塊性能加載慢,無法在大型項目中直接使用,這兩個問題是npm(解決模塊管理能力問題)和webpack(解決模塊加載慢問題)核心解決的問題

前端工程化關鍵技術之npm+webpack原理

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73071.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73071.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73071.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于CNN,RNN,GAN,GNN,DQN,Transformer,LSTM,DBN你了解多少

以下是神經網絡中常見的幾種模型的簡要介紹: 1. ?CNN (Convolutional Neural Network, 卷積神經網絡) ?用途: 主要用于圖像處理和計算機視覺任務。?特點: 通過卷積核提取局部特征,具有平移不變性,能夠有效處理高維數據(如圖像…

T113-i開發板的休眠與RTC定時喚醒指南

??在嵌入式系統設計中,休眠與喚醒技術是優化電源管理、延長設備續航的關鍵。飛凌嵌入式基于全志T113-i處理器開發設計的OK113i-S開發板提供了兩種休眠模式:freeze和mem,以滿足不同應用場景下的功耗與恢復速度需求。本文將詳細介紹如何讓OK1…

SpringBoot項目實戰(初級)

目錄 一、數據庫搭建 二、代碼開發 1.pom.xml 2.thymeleaf模塊處理的配置類 3.application配置文件 4.配置(在啟動類中) 5.編寫數據層 ②編寫dao層 ③編寫service層 接口 實現類 注意 補充(注入的3個注解) 1.AutoWir…

高性能網絡SIG雙月動態:加速 SMC eBPF 透明替換特性上游化進程,并與上游深度研討新特性

01、整體進展 本次雙月報總結了 SIG 在 1 月和 2 月的工作進展,工作聚焦在 ANCK CVE 和穩定性問題修復,以及上游 SMC eBPF 透明替換特性推進和多個話題討論上。 本月關鍵進展: 1. 推進 SMC eBPF 透明替換特性上游化,更新至 V7&…

某視頻的解密下載

下面講一下怎么爬取視頻,這個還是比小白的稍微有一點繞的 首先打開網址:aHR0cDovL3d3dy5wZWFydmlkZW8uY29tL3BvcHVsYXJfNA 首頁 看一下: 有一個標題和一個href,href只是一個片段,待會肯定要拼接, 先找一…

C++繼承機制:從基礎到避坑詳細解說

目錄 1.繼承的概念及定義 1.1繼承的概念 1.2 繼承定義 1.2.1定義格式 1.2.2繼承關系和訪問限定符 1.2.3繼承基類成員訪問方式的變化 總結: 2.基類和派生類對象賦值轉換 3.繼承中的作用域 4.派生類的默認成員函數 ?編輯 默認構造與傳參構造 拷貝構造&am…

測試基礎入門

文章目錄 軟件測試基礎1.1軟件測試概述什么是軟件測試什么是軟件需求說明書軟件測試的原則測試用例的設計測試用例設計的基本原則軟件測試分類軟件缺陷的定義 2.1軟件開發模型軟件開發模型概述大爆炸模型(邊寫邊改)軟件開發生命周期模型--螺旋模型軟件開…

022-spdlog

spdlog 以下是從原理到代碼實現的全方位spdlog技術調研結果,結合核心架構、優化策略和完整代碼示例: 一、核心架構設計原理 spdlog三級架構 (圖示說明:spdlog采用三級結構實現日志系統解耦) Registry管理中樞 全局…

STM32時鐘樹

時鐘樹 時鐘樹就是STM32中用來產生和配置時鐘,并且把配置好的時鐘發送到各個外設的系統,時鐘是所有外設運行的基礎,所以時鐘也是最先需要配置的東西,在程序中主函數之前還會執行一個SystemClock_Config()函數,這個函數…

【第22節】windows網絡編程模型(WSAAsyncSelect模型)

目錄 引言 一、WSAAsyncSelect模型概述 二、WSAAsyncSelect模型流程 2.1 自定義消息 2.2 創建窗口例程 2.3 初始化套接字 2.4 注冊網絡事件 2.5 綁定和監聽 2.6 消息循環 三、完整示例代碼 引言 在網絡編程的廣袤天地中,高效處理網絡事件是構建穩定應用的…

利用Dify編制用戶問題意圖識別和規范化回復

繼上一篇文章,成功完成Dify本地部署后,主要做了一些workflow和Agent的應用實現,整體感覺dify在工作流可視化編排方面非常好,即使部分功能無法實現,也可以通過代碼執行模塊或者自定義工具來實現(后續再具體分…

雙核鎖步技術在汽車芯片軟錯誤防護中的應用詳解

摘要 本文深入探討了雙核鎖步技術在保障汽車芯片安全性中的應用。文章首先分析了國產車規芯片在高安全可靠領域面臨的軟錯誤難點及攻克方向,然后詳細介紹了雙核鎖步技術的基本原理及其在汽車芯片防軟錯誤的重要性。通過對比國內外多家廠商的芯片技術,分析…

Lustre 語言的 Rust 生成相關的工作

目前 Lustre V6 編譯器支持編譯生成的語言為C語言。但也注意到,以 Rust 語言為生成目標語言,也存在若干相關工作。 rustre(elegaanz) 該項工作為 Lustre v6 語言的解析器,使用 Rust 語言實現。生成 Lustre AST。 項…

Java 之「單調棧」:從入門到實戰

Java 單調棧:從入門到實戰 文章目錄 Java 單調棧:從入門到實戰引言什么是單調棧?單調遞增棧單調遞減棧 單調棧的應用場景Java 實現單調棧代碼示例:下一個更大元素代碼解析 單調棧的優勢實戰應用:股票價格跨度代碼示例代…

【Golang】defer與recover的組合使用

在Go語言中,defer和recover是兩個關鍵特性,通常結合使用以處理資源管理和異常恢復。以下是它們的核心應用場景及使用示例: 1. defer 的應用場景 defer用于延遲執行函數調用,確保在函數退出前執行特定操作。主要用途包括&#xff…

CSS 中flex - grow、flex - shrink和flex - basis屬性的含義及它們在彈性盒布局中的協同作用。

大白話CSS 中flex - grow、flex - shrink和flex - basis屬性的含義及它們在彈性盒布局中的協同作用。 在 CSS 的彈性盒布局(Flexbox)里,flex-grow、flex-shrink 和 flex-basis 這三個屬性對彈性元素的尺寸和伸縮性起著關鍵作用。下面為你詳細…

OpenGL ES ->乒乓緩沖,計算只用兩個幀緩沖對象(Frame Buffer Object)+疊加多個濾鏡作用后的Bitmap

乒乓緩沖核心思想 不使用乒乓緩沖,如果要每個濾鏡作用下的繪制內容,也就是這個濾鏡作用下的幀緩沖,需要創建一個Frame Buffer Object加上對應的Frame Buffer Object Texture使用乒乓緩沖,只用兩個Frame Buffer Object加上對應的F…

【HarmonyOS NEXT】關鍵資產存儲開發案例

在 iOS 開發中 Keychain 是一個非常安全的存儲系統,用于保存敏感信息,如密碼、證書、密鑰等。與文件系統不同,Keychain 提供了更高的安全性,因為它對數據進行了加密,并且只有經過授權的應用程序才能訪問存儲的數據。那…

ccfcsp1901線性分類器

//線性分類器 #include<iostream> using namespace std; int main(){int n,m;cin>>n>>m;int x[1000],y[1000];char z[1000];for(int i0;i<n;i){cin>>x[i]>>y[i];cin>>z[i];}int a[20],b[20],c[20];for(int i0;i<m;i){cin>>a[i…

Spring Boot 整合 OpenFeign 教程

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 Spring Boot 整合 OpenFeign 教程 一、OpenFeign 簡介 OpenFeign 是 Netflix 開源的聲明式 HTTP 客戶端&#xff0c;通過接口和注解簡化服務間 HTTP 調用。…