深入理解現代前端開發中的 <script type=“module“> 與構建工具實踐

引言:模塊化開發的演進

在早期的前端開發中,JavaScript 缺乏原生的模塊化支持,開發者不得不依賴 IIFE(立即調用函數表達式)或第三方庫(如 RequireJS)來實現代碼組織。隨著 ES6(ES2015)的發布,JavaScript 終于迎來了官方的模塊系統——ES Modules(ESM),這徹底改變了前端開發的方式。

一、<script type="module">?的革命

1.1 什么是 ES Modules?

ES Modules 是 JavaScript 的官方模塊標準,它通過?import?和?export?語法實現了模塊化編程:

// 模塊導出 (math.js)
export const add = (a, b) => a + b;// 模塊導入 (app.js)
import { add } from './math.js';

1.2?type="module"?的特性

當我們在 HTML 中使用?<script type="module">?時,瀏覽器會以特殊方式處理這個腳本:

  • 模塊作用域:變量不會污染全局命名空間

  • 嚴格模式:代碼自動在嚴格模式下運行

  • 延遲執行:默認具有?defer?行為

  • 跨域限制:必須遵守 CORS 策略(Cross-Origin Resource Sharing:跨源資源共享,是一種基于 HTTP 頭的安全機制,用于控制網頁應用在不同源“domain”之間訪問資源的權限。)

<script type="module" src="app.js"></script>

1.3 與傳統腳本的對比

特性type="module"傳統腳本
作用域模塊作用域全局作用域
嚴格模式默認啟用需要手動聲明
依賴解析靜態分析(編譯時)動態解析(運行時)
執行時機默認 defer立即執行(阻塞渲染)
文件擴展名推薦 .mjs(接受 .js).js

二、構建工具下的 TypeScript 模塊

2.1 為什么能直接導入 .ts 文件?

在現代構建工具如 Vite、Webpack 或 Rollup 中,直接導入?.ts?文件成為可能:

<script type="module" src="/src/main.ts"></script>

這背后的魔法在于構建工具的處理流程:

  1. 開發環境

    • Vite 服務器攔截請求

    • 實時編譯 TypeScript 為 JavaScript

    • 返回標準的 ES Module 給瀏覽器

  2. 生產環境

    • 構建時將?.ts?編譯為?.js

    • 生成的文件名通常包含哈希值(如?main.a1b2c3.js

2.2 構建工具的工作流程(以 Vite 為例)

瀏覽器請求 main.ts → Vite 開發服務器 → 即時編譯 → 返回 ESM JavaScript → 瀏覽器執行

這種設計帶來了極佳的開發體驗(HMR 熱更新)和高效的生產構建。

三、defer?的深層意義

3.1?defer?的核心作用

defer?屬性控制腳本的執行時機,其核心特點是:

  • 不阻塞 HTML 解析:瀏覽器會并行下載腳本

  • 保持執行順序:多個?defer?腳本按聲明順序執行

  • 執行時機:在 DOM 解析完成后,DOMContentLoaded?事件前觸發

3.2?type="module"?的隱式?defer

所有模塊腳本自動獲得?defer?行為:

<!-- 以下兩種寫法等效 -->
<script type="module" src="app.js"></script>
<script defer type="module" src="app.js"></script>

3.3 不同加載策略對比

策略執行時機阻塞解析順序保證適用場景
無屬性立即執行傳統腳本
async下載完立即執行獨立第三方庫(如分析)
deferDOM 解析后執行主應用邏輯
type="module"同?defer現代模塊化應用

四、現代前端開發最佳實踐

4.1 項目結構建議

src/├── main.ts       # 應用入口├── components/   # 組件├── utils/        # 工具函數└── styles/       # 樣式

4.2 構建配置示例(vite.config.ts)

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'export default defineConfig({plugins: [vue()],build: {target: 'esnext' // 生成現代 ESM 代碼}
})

4.3 性能優化技巧

  1. 代碼分割:利用動態?import()?實現按需加載

    const module = await import('./heavy-module.ts')

  2. 預加載:使用?<link rel="modulepreload">?提前加載關鍵模塊

  3. 共享依賴:將公共依賴提取為單獨 chunk

五、未來展望

隨著?ESM 導入映射(Import Maps)?的普及,未來可能實現:

<!-- 瀏覽器原生支持裸模塊導入 -->
<script type="importmap">
{"imports": {"vue": "https://unpkg.com/vue@3/dist/vue.esm-browser.js"}
}
</script><script type="module">
import { createApp } from 'vue' // 直接使用
</script>

結語

從?<script type="module">?到構建工具對 TypeScript 的原生支持,現代前端開發已經實現了質的飛躍。理解這些技術背后的原理,能幫助我們構建更高效、更可維護的 Web 應用。隨著瀏覽器能力的不斷增強和工具鏈的持續優化,模塊化開發的體驗將會越來越好。

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

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

相關文章

yolo--qt可視化開發

qt5可能不支持我們的cuda版本&#xff0c;改用qt6 YOLO11QT6OpencvC訓練加載模型全過程講解_yolov11 模型轉換成opencv c模型-CSDN博客 下面是qt5版本的案例&#xff0c;和yolo及cuda有沖突 安裝qt 切換到虛擬環境&#xff0c;例如pyqt&#xff0c;conda activate pyqt pip …

SQL性能優化

show [session|global] status : 查看服務器狀態 show global status like Com_ : 查看各種語句的執行次數 開啟慢查詢: 在 MySQL 配置文件&#xff08;/etc/my.cnf&#xff09;配置: #開啟MySQL慢日志查詢開關 slow_query_log1 #設置慢日志的時間為2秒&#xff0c;SQL語句執…

ctfshow pwn40

目錄 1. 分析程序 2. 漏洞編寫 3. 漏洞驗證 1. 分析程序 首先檢查程序相關保護&#xff0c;發現程序為32位且只開啟了一個NX保護 checksec pwn 使用IDA進行逆向分析代碼&#xff0c;查看漏洞觸發點&#xff1a; 在main函數中&#xff0c;有一個ctfshow函數&#xff0c;這里…

SQL173 店鋪901國慶期間的7日動銷率和滯銷率

SQL173 店鋪901國慶期間的7日動銷率和滯銷率 SQL題解&#xff1a;店鋪動銷率與滯銷率計算 關鍵&#xff1a;只要當天任一店鋪有任何商品的銷量就輸出該天的結果&#xff0c;即使店鋪901當天的動銷率為0。 潛臺詞&#xff1a;?輸出邏輯與店鋪901的銷售情況無關&#xff0c;只取…

PytorchLightning最佳實踐基礎篇

PyTorch Lightning&#xff08;簡稱 PL&#xff09;是一個建立在 PyTorch 之上的高層框架&#xff0c;核心目標是剝離工程代碼與研究邏輯&#xff0c;讓研究者專注于模型設計和實驗思路&#xff0c;而非訓練循環、分布式配置、日志管理等重復性工程工作。本文從基礎到進階&…

Apache Flink 實時流處理性能優化實踐指南

Apache Flink 實時流處理性能優化實踐指南 隨著大數據和實時計算需求不斷增長&#xff0c;Apache Flink 已經成為主流的流處理引擎。然而&#xff0c;在生產環境中&#xff0c;高并發、大吞吐量和低延遲的業務場景對 Flink 作業的性能提出了更高要求。本文將從原理層面深入解析…

ubuntu上將TempMonitor加入開機自動運行的方法

1.新建一個TempMonitor.sh文件&#xff0c;內容如下&#xff1a;#!/bin/bashcd /fjrobot/ ./TempMonitor &2.執行以下命令chmod x TempMonitor chmod x TempMonitor.sh rm -rf /etc/rc2.d/S56TempMonitor rm -rf /etc/init.d/TempMonitor cp /fjrobot/TempMonitor.sh /etc/…

速賣通自養號測評技術解析:IP、瀏覽器與風控規避的實戰方案

一、速賣通的“春天”來了&#xff0c;賣家如何抓住機會&#xff1f;2025年的夏天&#xff0c;速賣通的風頭正勁。從沙特市場躍升為第二大電商平臺&#xff0c;到8月大促返傭力度升級&#xff0c;平臺對優質商家的扶持政策越來越清晰。但與此同時&#xff0c;競爭也愈發激烈——…

adb: CreateProcessW failed: 系統找不到指定的文件

具體錯誤 adb devices * daemon not running; starting now at tcp:5037 adb: CreateProcessW failed: 系統找不到指定的文件。 (2) * failed to start daemon adb.exe: failed to check server version: cannot connect to daemon 下載最新的platform-tools-windows 下載最新…

Centos安裝HAProxy搭建Mysql高可用集群負載均衡

接上文MYSQL高可用集群搭建–docker https://blog.csdn.net/weixin_43914685/article/details/149647589?spm1001.2014.3001.5501 連接到你搭建的 Percona XtraDB Cluster (PXC) 數據庫集群&#xff0c;實現高可用性和負載均衡&#xff0c;建議使用一個中間件來管理這些連接。…

Sql server開掛的OPENJSON

以前一直用sql server2008&#xff0c;自從升級成sql server2019后&#xff0c;用OPENJSON的感覺像開掛&#xff0c;想想以前表作為參數傳輸時的痛苦&#xff0c;不堪回首。一》不堪回首 為了執行效率&#xff0c;很多時候希望將表作為參數傳給數據庫的存儲過程。存儲過程支持自…

【數據結構】隊列和棧練習

1.用隊列實現棧 225. 用隊列實現棧 - 力扣&#xff08;LeetCode&#xff09; typedef int QDatatype; typedef struct QueueNode {struct QueueNode *next;QDatatype data; }QNode;typedef struct Queue {QNode* head;QNode* tail;QDatatype size; }Que;typedef struct {Que…

LabVIEW二維碼實時識別

?LabVIEW通過機器視覺技術&#xff0c;集成適配硬件構建二維碼實時識別系統。通過圖像采集、預處理、定位及識別全流程自動化&#xff0c;解決復雜環境下二維碼識別效率低、準確率不足問題&#xff0c;滿足工業產線追溯、物流分揀等實時識別需求。應用場景適用于工業產線追溯&…

微服務-springcloud-springboot-Skywalking詳解(下載安裝)

一、SkyWalking核心介紹 1. 什么是SkyWalking&#xff1f; Apache SkyWalking是一款國人主導開發的開源APM&#xff08;應用性能管理&#xff09;系統&#xff0c;2015年由吳晟創建&#xff0c;2017年進入Apache孵化器&#xff0c;2019年畢業成為Apache頂級項目。它通過分布式…

Elasticsearch 字段值過長導致索引報錯問題排查與解決經驗總結

在最近使用 Elasticsearch 的過程中&#xff0c;我遇到了一個 字段值過長導致索引失敗 的問題。經過排查和多次嘗試&#xff0c;最終通過設置字段 "index": false 方式解決。本文將從問題現象、排查過程、問題分析、解決方案和建議等方面&#xff0c;詳細記錄這次踩坑…

使用idea 將一個git分支的部分記錄合并到git另一個分支

場景&#xff1a; 有多個版本分支&#xff0c;需要將其中一個分支的某一兩次提交合并到指定分支上 eg&#xff1a; 將v1.0.0分支中指定提交記錄 合并到 v1.0.1分支中 操作&#xff1a; 步驟一 idea切換項目分支到v1.0.1(需要合并到哪個分支就先站到哪個分支上) 步驟二 在ide…

基于深度學習的圖像分類:使用ShuffleNet實現高效分類

前言 圖像分類是計算機視覺領域中的一個基礎任務&#xff0c;其目標是將輸入的圖像分配到預定義的類別中。近年來&#xff0c;深度學習技術&#xff0c;尤其是卷積神經網絡&#xff08;CNN&#xff09;&#xff0c;在圖像分類任務中取得了顯著的進展。ShuffleNet是一種輕量級的…

OpenGL里相機的運動控制

相機的核心構造一個是glm::lookAt函數&#xff0c;一個是glm::perspective函數&#xff0c;本文相機的一切運動都在于如何構建相應的參數傳入上述兩個函數里。glm::mat4 glm::lookAt(glm::vec3 const &eye,//相機所在位置glm::vec3 const &center,//要凝視的點glm::vec…

java設計模式 -【策略模式】

策略模式定義 策略模式&#xff08;Strategy Pattern&#xff09;是一種行為設計模式&#xff0c;允許在運行時選擇算法的行為。它將算法封裝成獨立的類&#xff0c;使得它們可以相互替換&#xff0c;而不影響客戶端代碼。 核心組成 Context&#xff08;上下文&#xff09;&…

項目重新發布更新緩存問題,Nginx清除緩存更新網頁

server {listen 80;server_name your.domain.com; # 替換為你的域名root /usr/share/nginx/html; # 替換為你的項目根目錄# 規則1&#xff1a;HTML 文件 - 永不緩存# 這是最關鍵的一步&#xff0c;確保瀏覽器總是獲取最新的入口文件。location /index.html {add_header Cache-…