最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node如何實(shí)現(xiàn)在瀏覽器預(yù)覽項(xiàng)目的所有圖片詳解

 更新時(shí)間:2023年01月07日 15:59:10   作者:螞蟻絆大象  
最近項(xiàng)目遇到了個(gè)需求,需要將存放圖片進(jìn)行預(yù)覽,所以這篇文章主要給大家介紹了關(guān)于Node如何實(shí)現(xiàn)在瀏覽器預(yù)覽項(xiàng)目的所有圖片的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

背景

在前端實(shí)際項(xiàng)目開發(fā)中,會(huì)有這樣一種場景。每次引入新的圖片,并不知道這個(gè)資源是否被引用過,所以會(huì)點(diǎn)開存放圖片的資源一個(gè)個(gè)去看。實(shí)際問題是:

  • 1.圖片并不是放到一個(gè)目錄下的,可能存在任何的地方,不好查找
  • 2.費(fèi)時(shí)間,費(fèi)力
  • 3.可能會(huì)重復(fù)引入圖片資源

如果有個(gè)能力,將項(xiàng)目圖片資源羅列到一起查看,并方便看到引入路徑的話,就會(huì)大大節(jié)約開發(fā)的體力活。

如果要做這樣的能力,應(yīng)該考慮什么呢?

需求分析

  • 可以集成到任何前端項(xiàng)目中,那就要求是個(gè)npm包
  • 讀取文件,分析哪些是圖片,將圖片資源通過img標(biāo)簽寫入到html文件中
  • 創(chuàng)建一個(gè)服務(wù)器,將html渲染出來

這就需要借助Node來實(shí)現(xiàn),需要用到的 fs path http 模塊。

實(shí)現(xiàn)

1 實(shí)現(xiàn)可發(fā)布npm包

  • 創(chuàng)建一個(gè)項(xiàng)目 npm init

    包名字是 test-read-img

  • 在package.json 中加入如下代碼

    "bin": {
      "readimg": "./index.js"
    },
  • 在入口文件index.js 中加入測(cè)試代碼

    含義是這個(gè)文件是可執(zhí)行的node文件

      #!/usr/bin/env node
      
      console.log('111')
  • 將當(dāng)前模塊鏈接到全局node_modules模塊內(nèi),方便調(diào)試

    執(zhí)行 npm link

    執(zhí)行 readimg

    就看到輸出111 了

    到此就實(shí)現(xiàn)了通過命令使用npm包的使用了,當(dāng)項(xiàng)目安裝了這個(gè)包,并配置執(zhí)行命令,就可以在別的項(xiàng)目執(zhí)行設(shè)計(jì)的npm包了,后面就實(shí)現(xiàn)這個(gè)

      "scripts": {
       "test": "readimg"
     },

2 集成到別的項(xiàng)目

  • 創(chuàng)建一個(gè)測(cè)試項(xiàng)目 ,執(zhí)行 npm init
  • 將測(cè)試包集成到當(dāng)前項(xiàng)目, 執(zhí)行 npm link test-read-img
  • 配置執(zhí)行命令
  "scripts": {
  
   "test": "readimg"
 },

執(zhí)行npm run test

就能看到當(dāng)前項(xiàng)目執(zhí)行了讀取文件的包的代碼了。 現(xiàn)在只輸出了 111距離讀取文件還很遠(yuǎn),下面來實(shí)現(xiàn)讀取文件

3 讀取文件

  • test-read-img 項(xiàng)目中,聲明一個(gè)執(zhí)行函數(shù),并執(zhí)行.
  #!/usr/bin/env node
  const init = async () => {
      const readFiles = await getFileFun();
      const html =  await handleHtml(readFiles);
      createServer(html);
  }

  init();

這里解釋一下 ,各函數(shù)作用

  • getFileFun: 讀取項(xiàng)目文件,并將讀取的圖片文件路徑返回,這里不需要圖片資源,后面解釋為什么。
  • handleHtml: 讀取模版html文件, 將圖片資源通過 img 承載 生成新的html文件。
  • createServer : 將生成的html ,放到服務(wù)器下去渲染出來。

主流程就是這樣。

  • 實(shí)現(xiàn)getFileFun 功能

    分析一下這個(gè)文件具體要做什么

    循環(huán)讀取文件,直到將所有文件查找完,將圖片資源過濾出來,讀取文件要異步執(zhí)行,如何知道何時(shí)讀取完文件呢,這里用promise實(shí)現(xiàn),這里僅僅實(shí)現(xiàn)了單層文件的讀取 ,因?yàn)榘l(fā)布到公司內(nèi)部的npm,請(qǐng)見諒。 聰明的你這里想想如何遞歸實(shí)現(xiàn)呢?

    getFileFun: 應(yīng)該先讀取完文件,才能將圖片返回,所以異步收集器應(yīng)該在后面執(zhí)行。

    具體代碼如下:

        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 = []; // 收集讀取圖片,作為一個(gè)異步收集器
        async function readAllFile(filePath) { // 循環(huán)讀文件
             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) { // 循環(huán)判斷文件
    
        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() {  // 將資源返回給調(diào)用使用
            await readAllFile('./');
            return await Promise.all(imgPromiseArr);
         }
    
        module.exports = {
            getFileFun
        }
  • 實(shí)現(xiàn) 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
   }
  • 實(shí)現(xiàn) createServer

    這里讀取html 文件,并返回給服務(wù)器。 這里僅僅實(shí)現(xiàn)了對(duì) png的文件的展示,對(duì)于其他類型的圖片如何支持呢,這里提示一下對(duì) content-type進(jìn)行處理。

  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
}

效果

以上就是實(shí)現(xiàn)過程,執(zhí)行一下 npm run test 就可以看到瀏覽器執(zhí)行在http://localhost:3004/, 效果如下:

發(fā)布

npm login

npm publish

思考

  • 為什么用異步讀取文件?

    因?yàn)閖s是單線程,同步讀取文件的話會(huì)卡在那里,不能執(zhí)行其他了。

  • 為什么要用Promise 收集圖片

    因?yàn)椴恢朗裁磿r(shí)候讀取完文件,當(dāng)異步讀取完再用Promise.all整體處理

  • 為什么 不讀取新的html文件,而將結(jié)果直接返回給瀏覽器?

    如果將轉(zhuǎn)換后html放到 test-read-img 文件,就必須將圖片資源也要生成在當(dāng)前目錄,要不然html 讀取的相當(dāng)路徑資源是找不到的,因?yàn)橘Y源都在使用項(xiàng)目中。結(jié)束的時(shí)候還要將圖片資源刪除,這也無形增加了復(fù)雜度;

    如果將轉(zhuǎn)化后的html 寫入放到使用項(xiàng)目中,這樣就可以直接用圖片的路徑,并能正確加載,但是這樣會(huì)多了一個(gè)html文件,程序退出的時(shí)候還要?jiǎng)h除這個(gè),如果忘記刪除了,就可能被開發(fā)者提交到遠(yuǎn)程,造成污染,提供的預(yù)覽應(yīng)該是無害的。這兩種方式都不可取。因此直接返回html資源,讓它去加載相對(duì)目標(biāo)項(xiàng)目路徑,不會(huì)產(chǎn)生任何影響。

總結(jié)

到此這篇關(guān)于Node如何實(shí)現(xiàn)在瀏覽器預(yù)覽項(xiàng)目的所有圖片的文章就介紹到這了,更多相關(guān)Node瀏覽器預(yù)覽圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • nodejs不用electron實(shí)現(xiàn)打開文件資源管理器并選擇文件

    nodejs不用electron實(shí)現(xiàn)打開文件資源管理器并選擇文件

    最近在開發(fā)一些小腳本,用 nodejs 實(shí)現(xiàn),其中很多功能需要選擇一個(gè)/多個(gè)文件,或者是選擇一個(gè)文件夾,這種情況下網(wǎng)上給出的解決方案都是 electron,但是我一個(gè)小腳本用 electron 屬實(shí)有點(diǎn)夸張了,后來轉(zhuǎn)念一想可以通過 powershell 來實(shí)現(xiàn)類似的功能,需要的朋友可以參考下
    2024-01-01
  • nodejs進(jìn)階(6)—連接MySQL數(shù)據(jù)庫示例

    nodejs進(jìn)階(6)—連接MySQL數(shù)據(jù)庫示例

    本篇文章主要介紹了nodejs進(jìn)階(6)—連接MySQL數(shù)據(jù)庫示例,詳細(xì)的介紹了NodeJS操作MySQL數(shù)據(jù)庫,作為應(yīng)用最為廣泛的開源數(shù)據(jù)庫則成為我們的首選,有興趣的可以了解一下。
    2017-01-01
  • Express系列之multer上傳的使用

    Express系列之multer上傳的使用

    本篇文章主要介紹了Express系列之multer上傳的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • node.js中的fs.fchmodSync方法使用說明

    node.js中的fs.fchmodSync方法使用說明

    這篇文章主要介紹了node.js中的fs.fchmodSync方法使用說明,本文介紹了fs.fchmodSync的方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js處理多個(gè)請(qǐng)求的技巧和方法

    Node.js處理多個(gè)請(qǐng)求的技巧和方法

    Node.js在處理多個(gè)請(qǐng)求方面具有優(yōu)勢(shì),它利用事件驅(qū)動(dòng)和非阻塞式I/O的特性,能夠高效地處理并發(fā)請(qǐng)求,提供快速響應(yīng)和良好的可擴(kuò)展性,這篇文章主要介紹了Node.js如何處理多個(gè)請(qǐng)求,需要的朋友可以參考下
    2023-11-11
  • CentOS 8.2服務(wù)器上安裝最新版Node.js的方法

    CentOS 8.2服務(wù)器上安裝最新版Node.js的方法

    這篇文章主要介紹了CentOS 8.2服務(wù)器上安裝最新版Node.js的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Node.js與Sails redis組件的使用教程

    Node.js與Sails redis組件的使用教程

    這篇文章主要介紹了Node.js與Sails redis組件的使用教程,主要介紹幾個(gè)用法,為string,set,hash和list的使用。需要的朋友可以參考下
    2017-02-02
  • NodeJS實(shí)現(xiàn)視頻轉(zhuǎn)碼的示例代碼

    NodeJS實(shí)現(xiàn)視頻轉(zhuǎn)碼的示例代碼

    本篇文章主要介紹了NodeJS實(shí)現(xiàn)視頻轉(zhuǎn)碼的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • 全面了解Node事件循環(huán)

    全面了解Node事件循環(huán)

    這篇文章主要詳細(xì)介紹了Node事件循環(huán),文中的圖片以及文字講解可以幫助大家更好的了解事件循環(huán),感興趣的小伙伴可以看一看,多多參考一下
    2021-08-08
  • 整理 node-sass 安裝失敗的原因及解決辦法(小結(jié))

    整理 node-sass 安裝失敗的原因及解決辦法(小結(jié))

    這篇文章主要介紹了整理 node-sass 安裝失敗的原因及解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02

最新評(píng)論

永平县| 德兴市| 江油市| 桂林市| 莆田市| 南开区| 巴彦淖尔市| 星子县| 松原市| 固镇县| 迁安市| 天津市| 曲阳县| 宁陕县| 类乌齐县| 西盟| 定边县| 南乐县| 前郭尔| 东明县| 汾西县| 开阳县| 绩溪县| 沙河市| 田阳县| 定边县| 东辽县| 马山县| 常德市| 青阳县| 大姚县| 温泉县| 香港| 疏勒县| 诏安县| 佛冈县| 普兰县| 永康市| 新乐市| 鸡泽县| 肃南|