本篇文章帶給大家的內容是關於為什麼需要模組化? js中常用模組化方案介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
為什麼需要模組化
在ES6出現之前,JS語言本身並沒有提供模組化能力,這為開發帶來了一些問題,其中最重要的兩個問題應是全局污染和依賴管理混亂。
// file a.js var name = 'aaa'; var sayName = function() { console.log(name); };
<!-- file index.html --> <script></script> <script> sayName(); // 'aaa' // code... var name = 'bbb'; sayName(); // 'bbb' </script>
上面的程式碼中,我們兩次呼叫a.js所提供的sayName函數輸出了不同結果,很明顯這是因為兩個檔案都對變數name進行了賦值,因此彼此之間造成了影響。當然我們可以在編寫程式碼時注意不要定義已存在的變數名,但是當一個頁面引用了10幾個幾百行的檔案時,記住所有已經定義過的變數顯然不太現實。
// file a.js var name = getName(); var sayName = function() { console.log(name) };
// file b.js var getName = function() { return 'timo'; };
<script></script> <script></script> <script> sayName(); // 'timo' </script>
<script></script> <script></script> // Uncaught ReferenceError: getName is not defined
上面的程式碼說明,多個檔案有依賴關係時,我們需要確保其引入的順序,從而保證運行某個檔案時,其依賴已經提前加載,可以想像,面對越大型的項目,我們需要處理的依賴關係也就越多,這既麻煩又容易出錯。
而為了解決這些,社群中出現了許多為JS語言提供模組化能力的規範,借助這些規範,能讓我們的開發更加方便安全。
常見模組化方案
CommonJS
#CommonJS是由社群提出的模組化方案中的一種,Node.js遵循了這套方案。
基本寫法
// file a.js var obj = { sayHi: function() { console.log('I am timo'); }; }; module.exports obj;
// file b.js var Obj = require('xxx/xxx/a.js'); Obj.sayHi(); // 'I am timo'
上面的程式碼中,檔案a.js是模組的提供方,檔案b.js是模組呼叫方。
規格
每個檔案都是模組;
#在模組內提供module#對象,表示當前模組;
模組使用exports對外暴露自身的函數/對象/變數等;
模組內透過require()方法導入其他模組;
CommonJS的規範,簡單來說就是上面4條,可以對照基本寫法中的例子來理解一下,在實際實作中,Node.js雖然遵循CommonJS規範,但仍然對其進行了一些調整。
AMD
AMD是模組化規格中的一種,RequireJS遵循了這套規格。
基本用法
// file a.js define('module', ['m', './xxx/n.js'], function() { // code... })
上面的程式碼中,檔案a.js向外導出了模組;
規格
AMD中,暴露模組使用define函數
define(moduleName, [], callback);
如上面程式碼,define函式共有三個參數
#moduleName此參數可以省略,表示該模組的名字,一般作用不大
['name1', 'name2'],第二個參數是數組,表示目前模組依賴的其他模組,如果沒有依賴模組,可以省略
callback,第三個參數是必傳參數,是一個回呼函數,內部是目前模組的相關程式碼
其他
#ADM的特點是依賴前置,這是ADM規範與接下來要介紹的CMD規格最大的不同,依賴前置是指:在執行目前載入模組回調前,會先將所有依賴套件載入完畢,也是define函數的第二個參數中指定的依賴包。
CDM
基本寫法
define(function(require, exports, module) { var a = require('./a') a.doSomething(); // code... var b = require('./b') // code... })
上面程式碼是CMD規範導出模組的基本寫法;
規格
從寫法可以看出,CMD的寫法和AMD非常像,其主要區別是對於依賴加載時機的不同,上面已經說過,AMD是依賴前置,而CMD規範推崇就近原則,簡單說就是在模組運行前並不加載依賴,模組運作過程中,當需要某個依賴時,再去進行載入。
UMD
CommonJS、AMD、CMD並行的狀態下,就需要一個方案能夠相容於他們,這樣我們在開發時,就不需要再去考慮依賴模組所遵循的規範了,而UMD的出現就是為了解決這個問題。
基本寫法
(function (root, factory) { if (typeof define === 'function' && define.amd) { //AMD define(['jquery'], factory); } else if (typeof exports === 'object') { //Node, CommonJS之类的 module.exports = factory(require('jquery')); } else { //浏览器全局变量(root 即 window) root.returnExports = factory(root.jQuery); } }(this, function ($) { //方法 function myFunc(){}; //暴露公共方法 return myFunc; }));
上面的程式碼是UMD的基本寫法,從程式碼就可以看出,其能夠同時支援CommonJS規範和AMD規範。
ES6 module
上面分別介紹了CommonJS、AMD、CMD和UMD,他們都是社群對於JS實作模組化的貢獻,這個規範其產生的根本原因,都是JS語言自身沒有模組化能力,而目前,在JS最新的語言規範ES6中,已經為JS增加了模組化能力,而JS自身的模組化方案,完全能夠取代目前社區提出的各類規範,且能夠做到瀏覽器端和Node端通用。
ES6中的模組化能力由兩個指令構成:export和import,export指令用於規定模組的對外接口, import指令用於輸入其他模組提供的功能。
export指令
ES6中一個檔案就是一個模組,模組內部的變數/函數等外部是無法存取的,如果希望將內部的函數/變數等對外暴露,供其他模組進行使用,就需要透過export指令進行匯出
// file a.js export let a = 1; export let b = 2; export let c = 3;
// file b.js let a = 1; let b = 2; let c = 3; export {a, b, c}
// file c.js export let add = (a, b) => { return a + b; };
上面三个文件的代码,都是通过export命令导出模块内容的示例,其中a.js文件和b.js文件都是导出模块中的变量,作用完全一致但写法不同,一般我们更推荐b.js文件中的写法,原因是这种写法能够在文件最底部清楚地知道当前模块都导出了哪些变量。
import命令
模块通过export命令导出变量/函数等,是为了让其他模块能够导入去使用,在ES6中,文件导入其他模块是通过import命令进行的
// file d.js import {a, b, c} from './a.js';
上面的代码中,我们引入了a.js文件中的变量a、b、c,import在引入其他模块内的函数/变量时,必须与原模块所暴露出来的函数名/变量名一一对应。
同时,import命令引入的值是只读的,如果尝试对其进行修改,则会报错
import {a} d from './a.js'; a = 2; // Syntax Error : 'a' is read-only;
export default命令
从上面import的介绍可以看到,当需要引入其他模块时,需要知道此模块暴露出的变量名/函数名才可以,这显然有些麻烦,因此ES6还提供了一个import default命令
// file a.js let add = (a, b) => { return a+b }; export default add;
// file b.js import Add from './a.js'; Add(1, 2); // 3
上面的代码中,a.js通过export default命令导出了add函数,在b.js文件中引入时,可以随意指定其名称
export default命令是默认导出的意思,既然是默认导出,显然只能有一个,因此每个模块只能执行一次export default命令,其本质是导出了一个名为default的变量或函数。
以上是為什麼需要模組化? js中常用模組化方案介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

記事本++7.3.1
好用且免費的程式碼編輯器

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

WebStorm Mac版
好用的JavaScript開發工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),