前端模塊commonjs,前端模塊化開發

本文目錄一覽:

react怎麼使用commonjs

Common JS 即 node.js 的模塊組織形式,前端可以用 webpack 或者 browserify 來打包

如何理解前端模塊化

前端模塊化

在JavaScript發展初期就是為了實現簡單的頁面交互邏輯,寥寥數語即可;如今CPU、瀏覽器性能得到了極大的提升,很多頁面邏輯遷移到了客戶端(表單驗證等),隨着web2.0時代的到來,Ajax技術得到廣泛應用,jQuery等前端庫層出不窮,前端代碼日益膨脹

這時候JavaScript作為嵌入式的腳本語言的定位動搖了,JavaScript卻沒有為組織代碼提供任何明顯幫助,甚至沒有類的概念,更不用說模塊(module)了,JavaScript極其簡單的代碼組織規範不足以駕馭如此龐大規模的代碼

模塊

既然JavaScript不能handle如此大規模的代碼,我們可以借鑒一下其它語言是怎麼處理大規模程序設計的,在Java中有一個重要帶概念——package,邏輯上相關的代碼組織到同一個包內,包內是一個相對獨立的王國,不用擔心命名衝突什麼的,那麼外部如果使用呢?直接import對應的package即可

import java.util.ArrayList;

遺憾的是JavaScript在設計時定位原因,沒有提供類似的功能,開發者需要模擬出類似的功能,來隔離、組織複雜的JavaScript代碼,我們稱為模塊化。

一個模塊就是實現特定功能的文件,有了模塊,我們就可以更方便地使用別人的代碼,想要什麼功能,就加載什麼模塊。模塊開發需要遵循一定的規範,各行其是就都亂套了

規範形成的過程是痛苦的,前端的先驅在刀耕火種、茹毛飲血的階段開始,發展到現在初具規模,簡單了解一下這段不凡的歷程

函數封裝

我們在講函數的時候提到,函數一個功能就是實現特定邏輯的一組語句打包,而且JavaScript的作用域就是基於函數的,所以把函數作為模塊化的第一步是很自然的事情,在一個文件裡面編寫幾個相關函數就是最開始的模塊了

function fn1(){

statement

}

function fn2(){

statement

}

這樣在需要的以後夾在函數所在文件,調用函數就可以了

這種做法的缺點很明顯:污染了全局變量,無法保證不與其他模塊發生變量名衝突,而且模塊成員之間沒什麼關係。

對象

為了解決上面問題,對象的寫法應運而生,可以把所有的模塊成員封裝在一個對象中

var myModule = {

var1: 1,

var2: 2,

fn1: function(){

},

fn2: function(){

}

}

這樣我們在希望調用模塊的時候引用對應文件,然後

myModule.fn2();

這樣避免了變量污染,只要保證模塊名唯一即可,同時同一模塊內的成員也有了關係

看似不錯的解決方案,但是也有缺陷,外部可以隨意修改內部成員

myModel.var1 = 100;

這樣就會產生意外的安全問題

立即執行函數

可以通過立即執行函數,來達到隱藏細節的目的

var myModule = (function(){

var var1 = 1;

var var2 = 2;

function fn1(){

}

function fn2(){

}

return {

fn1: fn1,

fn2: fn2

};

})();

這樣在模塊外部無法修改我們沒有暴露出來的變量、函數

上述做法就是我們模塊化的基礎,目前,通行的JavaScript模塊規範主要有兩種:CommonJS和AMD

CommonJS

我們先從CommonJS談起,因為在網頁端沒有模塊化編程只是頁面JavaScript邏輯複雜,但也可以工作下去,在服務器端卻一定要有模塊,所以雖然JavaScript在web端發展這麼多年,第一個流行的模塊化規範卻由服務器端的JavaScript應用帶來,CommonJS規範是由NodeJS發揚光大,這標誌着JavaScript模塊化編程正式登上舞台。

定義模塊

根據CommonJS規範,一個單獨的文件就是一個模塊。每一個模塊都是一個單獨的作用域,也就是說,在該模塊內部定義的變量,無法被其他模塊讀取,除非定義為global對象的屬性

模塊輸出:

模塊只有一個出口,module.exports對象,我們需要把模塊希望輸出的內容放入該對象

加載模塊:

加載模塊使用require方法,該方法讀取一個文件並執行,返迴文件內部的module.exports對象

CommonJS與ES6模塊化的具體使用方式

所以:只需要將需要暴露給外部的變量或者方法 設置為exports的屬性 就行,

可以把exports看做一個全局對象,把所有暴露出來的函數和變量都存放在裡面

1.先寫個6.js文件

CommonJS規範規定,每個模塊內部,module變量代表當前模板,這個變量是一個對象,他的 exports 屬性(相當於 module.exports )是對外的接口。 這裡詳情請看我的另一篇文章: module、exports 和 require的關係

加載某個模塊,其實是加載該模塊的module.exports屬性。require方法用於加載模塊

ES6模塊化的使用方法:(注!因為CommonJS類庫眾多,以及 CommonJS 和 ES6 之間的差異,所以無法直接兼容es6。)

直接/按需導出:可使用多個 用變量/常量的方式

導入:需要用按需導入 {解構} 的方式獲取

默認導出:只能使用一個 (default屬性只有es6才有)可以用引入對象定義多個屬性,但這樣在引入後調用的時候,更麻煩。

導入:優點:可以直接使用文件做接收參數且不用結構。

重命名export和import

如果導入的多個文件中,變量名字相同,即會產生命名衝突的問題,為了解決該問題,ES6為提供了重命名的方法,當你在導入名稱時可以這樣做:

如果想看CommonJS與ES6模塊化的原理 可以去看我另一篇文章

[秦圓圓]大佬寫的 require和import的區別

[大孩子氣]大佬寫的 require/exports、import/export 的區別

[七分sunshine!]大佬寫的# 前端模塊化工具 requireJs的使用;

react+webpack 模塊化應該採用CommonJS規範還是ES6規範,為什麼

研究react的時候也考慮過這個問題,首先可以先了解下這兩種模塊的機制。參考這裡

要考慮的點:

目前Commonjs是nodejs(瀏覽器環境需要模塊加載器)原生支持的,而es6需要藉助babeljs來實現。意味着如果要實現自動編譯上線(我司沒有在線上安裝node_modules做法)可能需要將babel之類的node_modules提交代碼倉庫,大概45M。

還有要考慮下你選擇的react的組件庫是基於es6還是Commonjs。如果你業務使用Commonjs規範,組件使用es6,這個就沒法統一了。

考慮下團隊對es6的熟悉程度,關係到代碼質量和維護成本。

暫時就想到這些。

commonjs為什麼不適合前端

JavaScript是一個強大面向對象語言,它有很多快速高效的解釋器。官方JavaScript標準定義的API是為了構建基於瀏覽器的應用程序。然而,並沒有定於一個用於更廣泛的應用程序的標準庫。

CommonJS API定義很多普通應用程序(主要指非瀏覽器的應用)使用的API,從而填補了這個空白。它的終極目標是提供一個類似Python,Ruby和Java標準庫。這樣的話,開發者可以使用CommonJS API編寫應用程序,然後這些應用可以運行在不同的JavaScript解釋器和不同的主機環境中。在兼容CommonJS的系統中。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/256924.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-15 12:43
下一篇 2024-12-15 12:43

相關推薦

  • 光模塊異常,SFP未認證(entityphysicalindex=6743835)——解決方案和

    如果您遇到類似optical module exception, sfp is not certified. (entityphysicalindex=6743835)的問題,那麼…

    編程 2025-04-29
  • Python模塊下載與安裝指南

    如果想要擴展Python的功能,可以使用Python模塊來實現。但是,在使用之前,需要先下載並安裝對應的模塊。本文將從以下多個方面對Python模塊下載與安裝進行詳細的闡述,包括使…

    編程 2025-04-29
  • Python編程三劍客——模塊、包、庫

    本文主要介紹Python編程三劍客:模塊、包、庫的概念、特點、用法,以及在實際編程中的實際應用,旨在幫助讀者更好地理解和應用Python編程。 一、模塊 1、概念:Python模塊…

    編程 2025-04-29
  • Python如何下載第三方模塊

    想要使Python更加強大且具備跨平台性,我們可以下載許多第三方模塊。下面將從幾個方面詳細介紹如何下載第三方模塊。 一、使用pip下載第三方模塊 pip是Python的軟件包管理器…

    編程 2025-04-28
  • 如何使用pip安裝模塊

    pip作為Python默認的包管理系統,是安裝和管理Python包的一種方式,它可以輕鬆快捷地安裝、卸載和管理Python的擴展庫、模塊等。下面從幾個方面詳細介紹pip的使用方法。…

    編程 2025-04-28
  • Python datetime和time模塊用法介紹

    本文將詳細闡述Python datetime和time模塊的用法和應用場景,以幫助讀者更好地理解和運用這兩個模塊。 一、datetime模塊 datetime模塊提供了處理日期和時…

    編程 2025-04-28
  • Idea創建模塊時下面沒有啟動類的解決方法

    本文將從以下幾個方面對Idea創建模塊時下面沒有啟動類進行詳細闡述: 一、創建SpringBoot項目時沒有啟動類的解決方法 在使用Idea創建SpringBoot項目時,有可能會…

    編程 2025-04-28
  • l9110風扇傳感器模塊原理圖解析

    本文將從原理圖概述、硬件特性、軟件實現等多個方面對l9110風扇傳感器模塊進行詳細解析,並給出對應代碼實例。 一、原理圖概述 l9110風扇傳感器模塊主要由驅動芯片l9110、電位…

    編程 2025-04-28
  • 掌握Python3中datetime模塊的使用

    Python3中的datetime模塊是處理日期和時間的常用模塊之一,它提供了一些函數和類,可以輕鬆處理日期和時間,包括日期和時間的計算、格式化、解析、時區轉換等。本文將從多個方面…

    編程 2025-04-28
  • Python導入模塊方法

    在Python編程中,模塊是管理函數和變量之類內容的一種方式。Python標準庫提供了許多有用的模塊,讓我們可以方便地實現對底層硬件和網絡等的控制。本文將介紹Python中常用的導…

    編程 2025-04-28

發表回復

登錄後才能評論