LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

JavaScript 模塊化系統(tǒng)

admin
2025年7月20日 10:3 本文熱度 461

一、為什么需要模塊化?

想象一下你正在寫(xiě)一個(gè)大型項(xiàng)目, 所有代碼都堆在一個(gè)文件里: 
// 可怕的全局變量地獄var utils = {...};var api = {...};var componentA = {...};var componentB = {...};
// 20000行之后...function doSomething() {    //誰(shuí)知道這個(gè)函數(shù)會(huì)不會(huì)覆蓋前面的定義?}

這種寫(xiě)法有幾個(gè)致命問(wèn)題: 

  • 命名沖突: 變量和函數(shù)都在全局作用域,容易覆蓋

  • 依賴混亂:不知道代碼執(zhí)行前需要加載哪些依賴

  • 難以維護(hù): 代碼組織像意大利面條,牽一發(fā)而動(dòng)全身


模塊化就是為了解決這些問(wèn)題而生的! 它讓我們可以: 

  • 將代碼拆分成獨(dú)立的小文件(模塊)

  • 明確聲明依賴關(guān)系

  • 避免污染全局命名空間

  • 方便代碼復(fù)用和維護(hù)

二、CommonJS

CommonJS 是 Node.js 采用的模塊系統(tǒng), 語(yǔ)法非常簡(jiǎn)單: 
// math.jsfunction add(a, b) {    return a + b;}
function subtract(a, b) {    return a - b;}
//導(dǎo)出模塊module.exports = {    add,    subtract};
//或者也可以這樣導(dǎo)出exports.add = add;exports.subtract = subtract;
使用的時(shí)候如下所示:
// app.jsconst math = require('./math.js');
console.log(math.add(23)); // 5console.log(math.subtract(52)); // 3
它有什么特點(diǎn)呢?

  • 同步加載: 模塊在 require 時(shí)同步加載并執(zhí)行.

  • 緩存機(jī)制: 模塊首次加載后會(huì)被緩存, 后續(xù) require 直接返回緩存.

  • 值拷貝: 導(dǎo)出的是值的拷貝(對(duì)于原始類(lèi)型), 修改不會(huì)影響原模塊.

三、ES Modules

ES Modules(簡(jiǎn)稱(chēng) ESM)是 ECMAScript 2015(ES6)引入的官方模塊系統(tǒng), 現(xiàn)在已經(jīng)被現(xiàn)代瀏覽器和 Node.js 支持. 

基本語(yǔ)法: 
// math.jsexport function add(a, b) {    return a + b;}
export function subtract(a, b) {    return a - b;}
// 或者默認(rèn)導(dǎo)出export default {    add,    subtract};
導(dǎo)入模塊: 
// 命名導(dǎo)入import { add, subtract } from './math.js';
// 默認(rèn)導(dǎo)入import math from './math.js';
// 混合導(dǎo)入import math, { add } from './math.js';
// 整體導(dǎo)入import * as math from './math.js';
與CommonJS的區(qū)別: 

  • 靜態(tài)分析: ESM 的 import/export 必須在頂層作用域, 可以被靜態(tài)分析

  • 動(dòng)態(tài)綁定: ESM 導(dǎo)出的是值的引用(活的綁定), 修改會(huì)影響所有導(dǎo)入

  • 異步加載: ESM 在瀏覽器中是異步加載的

// counter.jsexport let count = 0;
export function increment() {    count++;}
// app.jsimport { count, increment } from './counter.js';
console.log(count); // 0increment();console.log(count); //1(ESM是動(dòng)態(tài)綁定)
在瀏覽器里如何加載模塊呢?
<!-- 傳統(tǒng)腳本 --><script src="app.js"></script>
<!-- 模塊腳本 --><script type="module" src="app.js"></script>

關(guān)鍵區(qū)別: 

  • 模塊默認(rèn)defer, 在文檔解析完成后執(zhí)行

  • 模塊有獨(dú)立作用域, 不會(huì)污染全局

  • 模塊需要 CORS 配置, 不能使用 file:// 協(xié)議

  • 模塊會(huì)自動(dòng)應(yīng)用嚴(yán)格模式

四、按需加載

靜態(tài)導(dǎo)入(import ... from ...)必須在模塊頂層, 但有時(shí)候我們需要按需加載: 
// 普通導(dǎo)入import('./math.js').then(math => {    console.log(math.add(23));});
// 配合 async/awaitasync function calculate() {    const math = await import('./math.js');    console.log(math.add(23));}
條件加載: 
if (user.isAdmin) {    import('./admin.js').then(...);}
預(yù)加載: 
<link rel="modulepreload" href="critical-module.js">
組合使用: 
Promise.all([    import('./moduleA.js'),    import('./moduleB.js')]).then(([moduleA, moduleB]) => {    // 兩個(gè)模塊都加載完成});


閱讀原文:原文鏈接


該文章在 2025/7/21 10:33:09 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲国产欧美一区二区三区深喉 | 午夜男女爽爽视频在线观看 | 亚洲男人AV天堂午夜精品 | 日韩AV一区五月天 | 日本三级2020亚洲视频 | 亚洲精品高清国产 |