站長資訊網
        最全最豐富的資訊網站

        Node實戰學習:瀏覽器預覽項目所有圖片

        Node實戰學習:瀏覽器預覽項目所有圖片

        在前端實際項目開發中,會有這樣一種場景。每次引入新的圖片,并不知道這個資源是否被引用過,所以會點開存放圖片的資源一個個去看。實際問題是:

        • 1.圖片并不是放到一個目錄下的,可能存在任何的地方,不好查找

        • 2.費時間,費力

        • 3.可能會重復引入圖片資源

        如果有個能力,將項目圖片資源羅列到一起查看,并方便看到引入路徑的話,就會大大節約開發的體力活。

        如果要做這樣的能力,應該考慮什么呢?

        需求分析

        • 可以集成到任何前端項目中,那就要求是個npm包

        • 讀取文件,分析哪些是圖片,將圖片資源通過img標簽寫入到html文件中

        • 創建一個服務器,將html渲染出來

        這就需要借助Node來實現,需要用到的 fs path http 模塊?!鞠嚓P教程推薦: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('./');         return await Promise.all(imgPromiseArr);      }      module.exports = {         getFileFun     }
          登錄后復制

        • 實現 handleHtml

        這里讀取 test-read-img 的html文件,并替換。

            const 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='${i}' /> </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

          這里讀取html 文件,并返回給服務器。 這里僅僅實現了對 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 }
        登錄后復制

        效果

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 亚洲欧美日韩另类精品一区二区三区 | 热久久这里只有精品| 欧美激情精品久久久久久久九九九| 国产精品186在线观看在线播放| 亚洲欧美一级久久精品| 国产精品无码永久免费888| 国产91精品在线| 亚洲国产另类久久久精品| 亚洲国产精品无码久久久久久曰| 国产网红无码精品视频| 免费精品精品国产欧美在线| 国产av无码专区亚洲国产精品| jizzjizz国产精品久久| 亚洲乱码国产乱码精品精| 精品一区二区三区色花堂| 99视频在线精品国自产拍亚瑟| 国产一区二区精品久久| 精品国产三级a∨在线| 亚洲精品无码专区在线在线播放| 久久99国产精品成人欧美| 国产69精品久久久久99| 亚洲国产精品久久久久网站| 国产精品亚洲片在线va| 国产AV午夜精品一区二区入口| 日韩精品无码一区二区三区| 真实国产精品vr专区| 亚洲国产精品尤物YW在线观看 | 国产精品666| jizzjizz国产精品久久| MM1313亚洲国产精品| 99久久99这里只有免费费精品 | 亚洲国产精品福利片在线观看| 亚洲А∨精品天堂在线| 亚洲AV无码乱码精品国产| 亚洲国产主播精品极品网红| 亚洲国产成人a精品不卡在线| 日韩一区二区三区精品| 影院无码人妻精品一区二区| 亚洲精品午夜国产VA久久成人| 免费精品无码AV片在线观看| 精品无人码麻豆乱码1区2区|