使用Vite創(chuàng)建一個(gè)動(dòng)態(tài)網(wǎng)頁(yè)的前端項(xiàng)目
1. 引言
雖然現(xiàn)在的前端更新?lián)Q代的速度很快,IDE 和工具一批批的換,但是我們始終要理解一點(diǎn)基本的程序構(gòu)建的思維,這些環(huán)境和工具都是為了幫助我們更快的發(fā)布程序。筆者還記得以前寫前端代碼的時(shí)候,只使用文本編輯器,然后在瀏覽器中刷新就可以了。對(duì)于純前端項(xiàng)目,其實(shí)這樣也是很方便的。不過一旦涉及到文件資源訪問的問題就麻煩了,因?yàn)闉g覽器的安全限制,不能訪問域以外的資源。那么你就需要將其部署到 Web 服務(wù)器中,這意味著你要起個(gè)服務(wù)器。另外,調(diào)試的時(shí)候也要每次都刷新頁(yè)面;第三方依賴包的引入也是問題,需要自己去管理,然后進(jìn)行引入。于是,像 Vite 這樣的前端開發(fā)與構(gòu)建工具就出現(xiàn)了,它可以幫助你將上述這些步驟自動(dòng)化處理,加快你的前端程序的編程效率。這里筆者就總結(jié)一下如何使用 Vite 創(chuàng)建動(dòng)態(tài)網(wǎng)頁(yè)的前端項(xiàng)目。
2. 操作
首先,安裝 Node.js 和 npm。Node.js 是 JavaScript 的運(yùn)行時(shí)環(huán)境,npm 是一個(gè)包管理和任務(wù)運(yùn)行工具,安裝過程比較簡(jiǎn)單,這里就不復(fù)述了。
接下來(lái),選擇一個(gè)文件夾,在終端中運(yùn)行以下命令來(lái)創(chuàng)建項(xiàng)目:
npm create vite@latest my-native-js-app
這時(shí),終端會(huì)讓你選擇一個(gè)框架:
> npx > create-vite my-native-js-app | * Select a framework: | > Vanilla | Vue | React | Preact | Lit | Svelte | Solid | Qwik | Angular | Marko | Others —
這里筆者選擇使用 Vanilla,表示使用原生的模板,不使用任何框架。接下來(lái),終端會(huì)讓你選擇使用 TypeScript 還是 JavaScript:
> npx > create-vite my-native-js-app | o Select a framework: | Vanilla | * Select a variant: | > TypeScript | JavaScript —
這里筆者選擇使用 JavaScript。然后等待一會(huì)兒,前端項(xiàng)目就創(chuàng)建完成了,如下所示:
> npx > create-vite my-native-js-app | o Select a framework: | Vanilla | * Select a variant: | > TypeScript | JavaScript —
雖然可以接著使用終端,但這時(shí)就可以使用 VS Code 接管項(xiàng)目了。通過 VS Code 打開 my-native-js-app 文件夾,并啟動(dòng)終端,如下圖所示:
圖 1 通過 VS Code 打開一個(gè)前端項(xiàng)目
在終端執(zhí)行指令:
npm install
這一步是為了安裝第三方依賴庫(kù)。一般來(lái)說(shuō),如果你開始一個(gè)新的項(xiàng)目,這一步是必須的。當(dāng)然依賴庫(kù)安裝完成后,如果后續(xù)依賴庫(kù)沒有變動(dòng),就不需要執(zhí)行這一步了。
此時(shí)的項(xiàng)目的文件組織如下所示:
my-native-js-app
├── public
│ └── vite.svg
├── src
│ ├── counter.js
│ ├── javascript.svg
│ ├── main.js
│ └── style.css
├── index.html
└── package.json
這里的 package.json 文件是 npm 的核心配置文件,如下所示:
{ "name": "my-native-js-app", "private": true, "version": "0.0.0", "type": "module", "scripts": { "dev": "vite", "build": "vite build", "preview": "vite preview" }, "devDependencies": { "vite": "^6.3.5" } }
主要作用有兩個(gè):
- 依賴管理。dependencies 字段和 devDependencies 字段,其中 dependencies 字段是項(xiàng)目需要的依賴庫(kù)包,devDependencies 構(gòu)建項(xiàng)目需要的依賴庫(kù)包。執(zhí)行
npm install
就是根據(jù)這兩個(gè)字段中的值自動(dòng)安裝響應(yīng)的依賴包。 - 執(zhí)行任務(wù)腳本。scripts 字段,通過自定義命令來(lái)執(zhí)行跟構(gòu)建相關(guān)的任務(wù),這里的 dev、build 和 preview 就是最基礎(chǔ)和常用的三個(gè)指令。
dev 就是執(zhí)行指令:
npm run dev
表示在開發(fā)環(huán)境中啟動(dòng)服務(wù)器,終端一般會(huì)有如下提示:
> my-native-js-app@0.0.0 dev > vite VITE v6.3.5 ready in 500 ms ? Local: http://localhost:5173/ ? Network: use --host to expose ? press h + enter to show help
在瀏覽器中訪問地址:http://localhost:5173/ ,可以看到頁(yè)面中顯示了一個(gè)基礎(chǔ)的 HTML +JS 示例,如下所示:
圖 2 Vite 自帶的 HTML +JS 示例
另外兩個(gè)指令主要是為了實(shí)際發(fā)布時(shí)使用:
npm run build
構(gòu)建項(xiàng)目代碼,比如壓縮、拼接、混淆等。npm run preview
發(fā)布經(jīng)過構(gòu)建后的代碼項(xiàng)目。
3. 解析
這個(gè)示例 JS 項(xiàng)目不僅僅是個(gè)歡迎頁(yè)面,甚至還是個(gè)動(dòng)態(tài)頁(yè)面:可以對(duì)鼠標(biāo)點(diǎn)擊的次數(shù)計(jì)數(shù)。那么我們就來(lái)稍微解析一下其中的代碼。首先是 index.html:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <link rel="icon" type="image/svg+xml" href="/vite.svg" rel="external nofollow" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Vite App</title> </head> <body> <div id="app"></div> <script type="module" src="/src/main.js"></script> </body> </html>
可以看到這個(gè) HTML 頁(yè)面并沒有顯示在界面的元素,因?yàn)檫@些元素都是通過 JS 動(dòng)態(tài)加載上來(lái)的。另外,要注意的是這里的
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
是用來(lái)兼容高分屏的,具體可以參考文末補(bǔ)充介紹《HTML 頁(yè)面關(guān)于高分屏的設(shè)置》??梢钥吹郊词故沁@個(gè)最簡(jiǎn)化的示例都把這個(gè)元數(shù)據(jù)標(biāo)簽帶上了,因?yàn)楝F(xiàn)在使用高分屏的設(shè)備已經(jīng)非常多了。
接著我們來(lái)看一下 main.js:
import './style.css' import javascriptLogo from './javascript.svg' import viteLogo from '/vite.svg' import { setupCounter } from './counter.js' document.querySelector('#app').innerHTML = ` <div> <a rel="external nofollow" target="_blank"> <img src="${viteLogo}" class="logo" alt="Vite logo" /> </a> <a rel="external nofollow" target="_blank"> <img src="${javascriptLogo}" class="logo vanilla" alt="JavaScript logo" /> </a> <h1>Hello Vite!</h1> <div class="card"> <button id="counter" type="button"></button> </div> <p class="read-the-docs"> Click on the Vite logo to learn more </p> </div> ` setupCounter(document.querySelector('#counter'))
這段代碼的主要意思也就是剛才說(shuō)的,查詢#app 元素,并填充 HTML 字符串,也就是這個(gè)頁(yè)面是先顯示 HTML,再通過 js 動(dòng)態(tài)加載元素到頁(yè)面中。
另一個(gè)有意思的點(diǎn)是這里的導(dǎo)入:
import './style.css' import javascriptLogo from './javascript.svg' import viteLogo from '/vite.svg'
其實(shí)并不是原生 JS 的行為,而是 Vite 提供的。這其實(shí)也體現(xiàn)了一種思想,HTML、CSS 和 JavaScript 三者來(lái)說(shuō),JavaScript 才是最主要的,css 樣式和 HTML 頁(yè)面都可以通過 JavaScript 來(lái)生成。
再來(lái)看下 counter.js:
export function setupCounter(element) { let counter = 0 const setCounter = (count) => { counter = count element.innerHTML = `count is ${counter}` } element.addEventListener('click', () => setCounter(counter + 1)) setCounter(0) }
函數(shù)實(shí)現(xiàn)很簡(jiǎn)單,就是個(gè)簡(jiǎn)單的計(jì)數(shù)功能。不過要注意的是這里的 export function setupCounter(element)
使用的是 JavaScript ES6(ECMAScript 2015)中的模塊導(dǎo)出語(yǔ)法,表示將 setupCounter 這個(gè)函數(shù)導(dǎo)出。在 main.js 中則進(jìn)行導(dǎo)入:
import { setupCounter } from './counter.js' setupCounter(document.querySelector('#counter'))
4. 結(jié)語(yǔ)
之所以選擇使用原生 JS 項(xiàng)目沒有使用框架,是因?yàn)楣P者想研究一下比較底層的實(shí)現(xiàn),以及對(duì)比體會(huì)一些框架的設(shè)計(jì)思路。當(dāng)然不能重復(fù)造輪子,但是也不能離開這些輪子就啥都不會(huì)了,理解一些更深層次、更底層的東西,有助于我們更新?lián)Q代,使用更好的輪子。
補(bǔ)充:HTML頁(yè)面關(guān)于高分屏的設(shè)置
HTML頁(yè)面關(guān)于高分屏的設(shè)置
記錄一個(gè) HTML 頁(yè)面關(guān)于高分屏的踩到的坑。
所謂高分屏,就是在同樣大小的屏幕面積上顯示更多的像素點(diǎn),這樣可以呈現(xiàn)更好的可視效果的屏幕。例如,我的筆記本是 15.6 寸,理論上它的屏幕分辨率應(yīng)該是 1920 x 1080 像素,但實(shí)際上我的筆記本屏幕分辨率確實(shí) 2560 x 1440 像素,也就是俗稱的 2K 屏。這樣的高分屏雖然實(shí)現(xiàn)了更加細(xì)膩的圖像和更加清晰的文本,但也對(duì)軟件適配帶來(lái)了問題。
我這里遇到的問題是,在 HTML5 頁(yè)面中沒有特別設(shè)置,PC 端的 Chrome 和 Firefox 的環(huán)境下,window.innerWidth, window.innerHeight
這樣的參數(shù),以及鼠標(biāo)響應(yīng)事件中的鼠標(biāo)位置,都是物理設(shè)備寬度和位置,而不是實(shí)際像素的寬度和位置。在安卓端的 Firefox,也是物理設(shè)備寬度和位置,但是安卓端的 Chrome 確是實(shí)際像素的寬度和位置,導(dǎo)致行為表現(xiàn)不一致。
為了兼容這種情況,可以在 HTML 頭中增加一個(gè) viewport 元標(biāo)簽,并設(shè)置屬性,具體如下設(shè)置:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>High DPI Support</title> </head> <body> </body> </html>
在這個(gè) viewport 元標(biāo)簽中,width=device-width 表示設(shè)置了視口的寬度等于設(shè)備的屏幕寬度,initial-scale=1.0 表示設(shè)置初始縮放比例為 1。
更具體來(lái)說(shuō),我這里使用的是 three.js 進(jìn)行三維圖形渲染,如果沒有 viewport 元標(biāo)簽,在安卓端的 Chrome 中進(jìn)行位置相關(guān)的計(jì)算總是不正確,研究了很久才找到是高分屏支持的問題。同樣是三維圖形渲染,Cesium.js 官方提供的例子就增加了 viewport 元標(biāo)簽:
<!DOCTYPE html> <html lang="en"> <head> <!-- Make the application on mobile take up the full browser screen and disable user scaling. --> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no" /> <title>Hello World!</title> </head> <body> </body> </html>
其實(shí) viewport 元標(biāo)簽只要學(xué)習(xí)過 Cesium 的案例就有印象,但也是泛泛而過。直到遇到了問題踩坑了才明白原來(lái)是這回事,因此將這個(gè)問題記錄一下。
到此這篇關(guān)于使用Vite創(chuàng)建一個(gè)動(dòng)態(tài)網(wǎng)頁(yè)的前端項(xiàng)目的文章就介紹到這了,更多相關(guān)vite創(chuàng)建動(dòng)態(tài)網(wǎng)頁(yè)前端項(xiàng)目?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Javascript 修改String 對(duì)象 增加去除空格功能(示例代碼)
這篇文章主要介紹了Javascript 修改String 對(duì)象 增加去除空格功能(示例代碼)。需要的朋友可以過來(lái)參考下,希望對(duì)大家有所幫助2013-11-11另一個(gè)javascript小測(cè)驗(yàn)(代碼集合)
共25道題,測(cè)試內(nèi)容包括運(yùn)算符,表達(dá)式,語(yǔ)句,javascript語(yǔ)言特性,JSON語(yǔ)法,數(shù)組,正則等。2011-07-07微信小程序?qū)崿F(xiàn)表格前后臺(tái)分頁(yè)
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)表格前后臺(tái)分頁(yè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08Bootstrap每天必學(xué)之工具提示(Tooltip)插件
Bootstrap每天必學(xué)之工具提示(Tooltip)插件,工具提示就是通過鼠標(biāo)移動(dòng)選定在特定的元素上時(shí),顯示相關(guān)的提示語(yǔ),感興趣的小伙伴們可以參考一下2016-04-04js如何根據(jù)class獲取元素并且點(diǎn)擊元素詳解
這篇文章主要給大家介紹了關(guān)于js如何根據(jù)class獲取元素并且點(diǎn)擊元素的相關(guān)資料,獲取元素集合的方法有很多,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04js實(shí)現(xiàn)方塊上下左右移動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)方塊上下左右移動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08js 實(shí)現(xiàn) list轉(zhuǎn)換成tree的方法示例(數(shù)組到樹)
這篇文章主要介紹了js 實(shí)現(xiàn) list轉(zhuǎn)換成tree的方法示例(數(shù)組到樹),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08