目錄
需求分析
#實作
##1實作可發佈npm套件
2 整合到別的項目
#3 讀取檔案
png的文件的展示,對於其他類型的圖片如何支持呢,這裡提示一下對   content-type
就可以看到瀏覽器執行在http://localhost:3004/, 效果如下:
思考
首頁 web前端 js教程 Node實戰學習:瀏覽器預覽專案所有圖片

Node實戰學習:瀏覽器預覽專案所有圖片

Jan 06, 2023 pm 09:00 PM
前端 node.js

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

#就能看到目前專案執行了讀取檔的包的程式碼了。 現在只輸出了111距離讀取檔案還很遠,下面來實作讀取檔案

#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

: 讀取模版html檔, 將圖片資源透過

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(&#39;./&#39;);
            return await Promise.all(imgPromiseArr);
         }
    
        module.exports = {
            getFileFun
        }
    登入後複製

實作handleHtml

  • 這裡讀取test -read-img

    的html文件,並替換。

        const fs = require(&#39;fs&#39;).promises;
       const path = require(&#39;path&#39;);
    
       const createImgs = (images=[]) => {
           return images.map(i => {
               return `<div class=&#39;img-warp&#39;> 
                  <div class=&#39;img-item&#39;>  <img  src="/static/imghw/default1.png"  data-src="https://img.php.cn/upload/article/000/000/024/2bbaed968e5cea05cb549ca3b7d46b6d-0.png"  class="lazy"   src=&#39;${i}&#39; / alt="Node實戰學習:瀏覽器預覽專案所有圖片" > </div>
                  <div class=&#39;img-path&#39;>文件路径 <span class=&#39;path&#39;>${i}</span></div>
                </div>`
           }).join(&#39;&#39;);
       }
    
       async function handleHtml(images=[]) {
           const template =   await fs.readFile(path.join(__dirname,&#39;template.html&#39;),&#39;utf-8&#39;)
           const targetHtml = template.replace(&#39;%--%&#39;,`
            ${createImgs(images)}
           `);
          return targetHtml;
       }
    
       module.exports = {
        handleHtml
       }
    登入後複製
    實作 createServer

#這裡讀取html 文件,並傳回給伺服器。 這裡僅僅實現了對

png的文件的展示,對於其他類型的圖片如何支持呢,這裡提示一下對   content-type

進行處理。

  const http = require(&#39;http&#39;);
const fs = require(&#39;fs&#39;).promises;
const path = require(&#39;path&#39;);
const open = require(&#39;open&#39;);

const createServer =(html) => {
  http.createServer( async (req,res) => {
      const  fileType = path.extname(req.url);
      let pathName = req.url;
      if(pathName === &#39;/favicon.ico&#39;) {
        return;
      }
      let type = &#39;&#39;
      if(fileType === &#39;.html&#39;) {
          type=`text/html`
      }
      if(fileType === &#39;.png&#39;) {
         type=&#39;image/png&#39;
      }
      if(pathName === &#39;/&#39;) {
          res.writeHead(200,{
              &#39;content-type&#39;:`text/html;charset=utf-8`,
              &#39;access-control-allow-origin&#39;:"*"
          })
            res.write(html);
            res.end();
            return
      }
      const data = await fs.readFile(&#39;./&#39; + pathName );
      res.writeHead(200,{
          &#39;content-type&#39;:`${type};charset=utf-8`,
          &#39;access-control-allow-origin&#39;:"*"
      })
      res.write(data);
      res.end();
      
  }).listen(3004,() => {
   console.log(&#39;project is run: http://localhost:3004/&#39;)
  open(&#39;http://localhost:3004/&#39;)
  });

 
}

module.exports = {
  createServer
}
登入後複製
效果

Node實戰學習:瀏覽器預覽專案所有圖片以上就是實作過程,執行一下

npm run test

就可以看到瀏覽器執行在http://localhost:3004/, 效果如下:

###發布############npm login#######

npm publish

思考

  • #為什麼要用非同步讀取檔案?

    因為js是單線程,同步讀取檔的話會卡在那裡,不能執行其他了。

  • 為什麼要用Promise 收集圖片

    因為不知道什麼時候讀取完文件,當非同步讀取完再用Promise.all整體處理

  • 為什麼不讀取新的html文件,而將結果直接傳回瀏覽器?

    如果將轉換後html放到 test-read-img 文件,就必須將圖片資源也要產生在目前目錄,不然html 讀取的相當路徑資源是找不到的,因為資源都在使用專案中。結束的時候還要將圖片資源刪除,這也無形增加了複雜度;

    如果將轉換後的html 寫入放到使用項目中,這樣就可以直接用圖片的路徑,並能正確加載,但是這樣會多了一個html文件,程序退出的時候還要刪除這個,如果忘記刪除了,就可能被開發者提交到遠程,造成污染,提供的預覽應該是無害的。這兩種方式都不可取。因此直接返回html資源,讓它載入相對目標專案路徑,不會產生任何影響。

更多node相關知識,請造訪:nodejs 教學

以上是Node實戰學習:瀏覽器預覽專案所有圖片的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

PHP與Vue:完美搭檔的前端開發利器 PHP與Vue:完美搭檔的前端開發利器 Mar 16, 2024 pm 12:09 PM

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

如何使用 Go 語言進行前端開發? 如何使用 Go 語言進行前端開發? Jun 10, 2023 pm 05:00 PM

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

前端面試官常問的問題 前端面試官常問的問題 Mar 19, 2024 pm 02:24 PM

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

Django是前端還是後端?一探究竟! Django是前端還是後端?一探究竟! Jan 19, 2024 am 08:37 AM

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

C#開發經驗分享:前端與後端協同開發技巧 C#開發經驗分享:前端與後端協同開發技巧 Nov 23, 2023 am 10:13 AM

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

golang可以做前端嗎 golang可以做前端嗎 Jun 06, 2023 am 09:19 AM

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

Go語言前端技術探秘:前端開發新視野 Go語言前端技術探秘:前端開發新視野 Mar 28, 2024 pm 01:06 PM

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

前端怎麼實現即時通訊 前端怎麼實現即時通訊 Oct 09, 2023 pm 02:47 PM

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

See all articles