Node實戰學習:瀏覽器預覽專案所有圖片
在前端實際專案開發中,會有這樣一種場景。每次引入新的圖片,並不知道這個資源是否被引用過,所以會點開存放圖片的資源一個個去看。實際問題是:
1.圖片並不是放到一個目錄下的,可能存在任何的地方,不好找
2 .費時間,費力
3.可能會重複引入圖片資源
如果有個能力,將項目圖片資源羅列到一起查看,並方便看到引入路徑的話,就會大大節約開發的體力活。
如果要做這樣的能力,該考慮什麼呢?
需求分析
可以整合到任何前端專案中,那就要求是個
npm套件
讀取文件,分析哪些是圖片,將圖片資源透過
img標籤
寫入到html檔案中建立一個伺服器,將html渲染出來
這就需要藉助Node來實現,需要用到的fs
path
http
模組。 【相關教學推薦:nodejs影片教學、程式設計教學】
#實作
##1實作可發佈npm套件
- 建立一個專案
npm init
套件名字是test-read- img
- 在package.json 中加入下列程式碼
"bin": { "readimg": "./index.js" },
- 在入口檔index.js 中加入測試程式碼意思是這個檔案是可執行的node檔案
#!/usr/bin/env node console.log('111')
登入後複製 - #將目前模組連結到全域node_modules模組內,方便偵錯#執行
npm link
執行readimg
#就看到輸出111 了到此就實作了透過指令使用npm套件的使用了,當專案安裝了這個套件,並且設定執行指令,就可以在別的專案執行設計的npm套件了,後面就實作這個"scripts": { "test": "readimg" },
登入後複製
2 整合到別的項目
- 建立一個測試項目,執行
- npm init
- npm link test-read-img
"scripts": { "test": "readimg" },
npm run test
#3 讀取檔案
在test-read-img
專案中,宣告一個執行函數,並執行.
#!/usr/bin/env node const init = async () => { const readFiles = await getFileFun(); const html = await handleHtml(readFiles); createServer(html); } init();
這裡解釋一下,各函數作用
getFileFun : 讀取項目文件,並將讀取的圖片文件路徑返回,這裡不需要圖片資源,後面解釋為什麼。 handleHtml
img
承載 產生新的html檔。createServer
主流程就是這樣。: 將產生的html ,放到伺服器下去渲染出來。
分析這個文件具體要做什麼實作
getFileFun功能
實現,這裡僅僅實現了循環讀取文件,直到將所有文件查找完,將圖片資源過濾出來,讀取文件要異步執行,如何知道何時讀取完文件呢,這裡用
promise單層文件的讀取
,因為發佈到公司內部的npm,請見諒。聰明的你在這裡想想如何遞歸實現?getFileFun
具體程式碼如下:: 應該先讀取完文件,才能將圖片傳回,所以非同步收集器應該在後面執行。
const fs = require('fs').promises; const path = require('path'); const excludeDir = ['node_modules','package.json','index.html']; const excludeImg = ['png','jpg','svg','webp']; let imgPromiseArr = []; // 收集读取图片,作为一个异步收集器 async function readAllFile(filePath) { // 循环读文件 const data = await fs.readdir(filePath) await dirEach(data,filePath); } async function handleIsImgFile(filePath,file) { const fileExt = file.split('.'); const fileTypeName = fileExt[fileExt.length-1]; if(excludeImg.includes(fileTypeName)) { // 将图片丢入异步收集器 imgPromiseArr.push(new Promise((resolve,reject) => { resolve(`${filePath}${file}`) })) } } async function dirEach(arr=[],filePath) { // 循环判断文件 for(let i=0;i<arr.length;i++) { let fileItem = arr[i]; const basePath = `${filePath}${fileItem}`; const fileInfo = await fs.stat(basePath) if(fileInfo.isFile()) { await handleIsImgFile(filePath,fileItem) } } } async function getFileFun() { // 将资源返回给调用使用 await readAllFile('./'); return await Promise.all(imgPromiseArr); } module.exports = { getFileFun }
實作
handleHtml
的html文件,並替換。這裡讀取
test -read-imgconst fs = require('fs').promises; const path = require('path'); const createImgs = (images=[]) => { return images.map(i => { return `<div class='img-warp'> <div class='img-item'> <img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/024/2bbaed968e5cea05cb549ca3b7d46b6d-0.png" class="lazy" src='${i}' / alt="Node實戰學習:瀏覽器預覽專案所有圖片" > </div> <div class='img-path'>文件路径 <span class='path'>${i}</span></div> </div>` }).join(''); } async function handleHtml(images=[]) { const template = await fs.readFile(path.join(__dirname,'template.html'),'utf-8') const targetHtml = template.replace('%--%',` ${createImgs(images)} `); return targetHtml; } module.exports = { handleHtml }
登入後複製實作
createServer
png的文件的展示,對於其他類型的圖片如何支持呢,這裡提示一下對 content-type
進行處理。const http = require('http'); const fs = require('fs').promises; const path = require('path'); const open = require('open'); const createServer =(html) => { http.createServer( async (req,res) => { const fileType = path.extname(req.url); let pathName = req.url; if(pathName === '/favicon.ico') { return; } let type = '' if(fileType === '.html') { type=`text/html` } if(fileType === '.png') { type='image/png' } if(pathName === '/') { res.writeHead(200,{ 'content-type':`text/html;charset=utf-8`, 'access-control-allow-origin':"*" }) res.write(html); res.end(); return } const data = await fs.readFile('./' + pathName ); res.writeHead(200,{ 'content-type':`${type};charset=utf-8`, 'access-control-allow-origin':"*" }) res.write(data); res.end(); }).listen(3004,() => { console.log('project is run: http://localhost:3004/') open('http://localhost:3004/') }); } module.exports = { createServer }
以上就是實作過程,執行一下
就可以看到瀏覽器執行在http://localhost:3004/, 效果如下:
npm publish
思考
-
#為什麼要用非同步讀取檔案?
因為js是單線程,同步讀取檔的話會卡在那裡,不能執行其他了。
-
為什麼要用Promise 收集圖片
因為不知道什麼時候讀取完文件,當非同步讀取完再用
Promise.all
整體處理 -
為什麼不讀取新的html文件,而將結果直接傳回瀏覽器?
如果將轉換後
html放到
test-read-img
文件,就必須將圖片資源也要產生在目前目錄,不然html 讀取的相當路徑資源是找不到的,因為資源都在使用專案中。結束的時候還要將圖片資源刪除,這也無形增加了複雜度;如果將轉換後的
html 寫入放到使用項目
中,這樣就可以直接用圖片的路徑,並能正確加載,但是這樣會多了一個html文件,程序退出的時候還要刪除這個,如果忘記刪除了,就可能被開發者提交到遠程,造成污染,提供的預覽應該是無害的。這兩種方式都不可取。因此直接返回html資源,讓它載入相對目標專案路徑,不會產生任何影響。
更多node相關知識,請造訪:nodejs 教學!
以上是Node實戰學習:瀏覽器預覽專案所有圖片的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

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

SublimeText3漢化版
中文版,非常好用

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

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP與Vue:完美搭檔的前端開發利器在當今網路快速發展的時代,前端開發變得愈發重要。隨著使用者對網站和應用的體驗要求越來越高,前端開發人員需要使用更有效率和靈活的工具來創建響應式和互動式的介面。 PHP和Vue.js作為前端開發領域的兩個重要技術,搭配起來可以稱得上是完美的利器。本文將探討PHP和Vue的結合,以及詳細的程式碼範例,幫助讀者更好地理解和應用這兩

隨著網路技術的發展,前端開發變得日益重要。尤其是行動端設備的普及,更需要高效率、穩定、安全又易於維護的前端開發技術。而作為一門快速發展的程式語言,Go語言已經被越來越多的開發者所使用。那麼,使用Go語言進行前端開發行得通嗎?接下來,本文將為你詳細說明如何使用Go語言進行前端開發。先來看看為什麼要使用Go語言進行前端開發。很多人認為Go語言是一門

在前端開發面試中,常見問題涵蓋廣泛,包括HTML/CSS基礎、JavaScript基礎、框架和函式庫、專案經驗、演算法和資料結構、效能最佳化、跨域請求、前端工程化、設計模式以及新技術和趨勢。面試官的問題旨在評估候選人的技術技能、專案經驗以及對行業趨勢的理解。因此,應試者應充分準備這些方面,以展現自己的能力和專業知識。

Django是一個由Python編寫的web應用框架,它強調快速開發和乾淨方法。儘管Django是web框架,但要回答Django是前端還是後端這個問題,需要深入理解前後端的概念。前端是指使用者直接和互動的介面,後端是指伺服器端的程序,他們透過HTTP協定進行資料的互動。在前端和後端分離的情況下,前後端程式可以獨立開發,分別實現業務邏輯和互動效果,資料的交

身為C#開發者,我們的開發工作通常包括前端和後端的開發,而隨著技術的發展和專案的複雜性提高,前端與後端協同開發也變得越來越重要和複雜。本文將分享一些前端與後端協同開發的技巧,以幫助C#開發者更有效率地完成開發工作。確定好介面規範前後端的協同開發離不開API介面的交互。要確保前後端協同開發順利進行,最重要的是定義好介面規格。接口規範涉及到接口的命

golang可以做前端,Golang是一種通用性很強的程式語言,可以用於開發不同類型的應用程序,包括前端應用程序,透過使用Golang來編寫前端,可以擺脫JavaScript等語言引起的一系列問題,例如類型安全性差、效能低下,以及程式碼難以維護等問題。

Go語言作為一種快速、高效的程式語言,在後端開發領域廣受歡迎。然而,很少有人將Go語言與前端開發聯繫起來。事實上,使用Go語言進行前端開發不僅可以提高效率,還能為開發者帶來全新的視野。本文將探討使用Go語言進行前端開發的可能性,並提供具體的程式碼範例,幫助讀者更了解這一領域。在傳統的前端開發中,通常會使用JavaScript、HTML和CSS來建立使用者介面

實作即時通訊的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。詳細介紹:1、WebSocket,它可以在客戶端和伺服器之間建立持久連接,實現即時的雙向通信,前端可以使用WebSocket API來創建WebSocket連接,並透過發送和接收訊息來實現即時通訊;2、Long Polling,是一種模擬即時通訊的技術等等
