欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Node怎么實現(xiàn)瀏覽器預(yù)覽項目所有圖片

本文小編為大家詳細(xì)介紹“Node怎么實現(xiàn)瀏覽器預(yù)覽項目所有圖片”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Node怎么實現(xiàn)瀏覽器預(yù)覽項目所有圖片”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

10年積累的成都做網(wǎng)站、網(wǎng)站制作經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計制作后付款的網(wǎng)站建設(shè)流程,更有都昌免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

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

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

  • 2.費時間,費力

  • 3.可能會重復(fù)引入圖片資源

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

需求分析

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

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

  • 創(chuàng)建一個服務(wù)器,將html渲染出來

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

實現(xiàn)

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

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

    包名字是  test-read-img

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

    "bin": {
      "readimg": "./index.js"
    },

  • 在入口文件index.js 中加入測試代碼

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

      #!/usr/bin/env node
     
     console.log('111')

  • 將當(dāng)前模塊鏈接到全局node_modules模塊內(nèi),方便調(diào)試

    執(zhí)行 npm link

    執(zhí)行 readimg

    就看到輸出111 了

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

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

2 集成到別的項目

  • 創(chuàng)建一個測試項目 ,執(zhí)行 npm init

  • 將測試包集成到當(dāng)前項目, 執(zhí)行 npm link test-read-img

  • 配置執(zhí)行命令

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

執(zhí)行npm run test

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

3 讀取文件

  • test-read-img 項目中,聲明一個執(zhí)行函數(shù),并執(zhí)行.

  #!/usr/bin/env node
  const init = async () => {
      const readFiles = await getFileFun();
      const html =  await handleHtml(readFiles);
      createServer(html);
  }

  init();

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

getFileFun: 讀取項目文件,并將讀取的圖片文件路徑返回,這里不需要圖片資源,后面解釋為什么。

handleHtml: 讀取模版html文件, 將圖片資源通過 img 承載 生成新的html文件。

createServer : 將生成的html ,放到服務(wù)器下去渲染出來。

主流程就是這樣。

  • 實現(xiàn)getFileFun 功能

    分析一下這個文件具體要做什么

    循環(huán)讀取文件,直到將所有文件查找完,將圖片資源過濾出來,讀取文件要異步執(zhí)行,如何知道何時讀取完文件呢,這里用promise實現(xiàn),這里僅僅實現(xiàn)了單層文件的讀取 ,因為發(fā)布到公司內(nèi)部的npm,請見諒。 聰明的你這里想想如何遞歸實現(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 = []; // 收集讀取圖片,作為一個異步收集器
       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
       }

  • 實現(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
   }

  • 實現(xiàn) createServer

    這里讀取html 文件,并返回給服務(wù)器。 這里僅僅實現(xiàn)了對 png的文件的展示,對于其他類型的圖片如何支持呢,這里提示一下對   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
}

效果

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

Node怎么實現(xiàn)瀏覽器預(yù)覽項目所有圖片

發(fā)布

npm login

npm publish

思考

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

    因為js是單線程,同步讀取文件的話會卡在那里,不能執(zhí)行其他了。

  • 為什么要用Promise 收集圖片

    因為不知道什么時候讀取完文件,當(dāng)異步讀取完再用Promise.all整體處理

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

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

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

讀到這里,這篇“Node怎么實現(xiàn)瀏覽器預(yù)覽項目所有圖片”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站題目:Node怎么實現(xiàn)瀏覽器預(yù)覽項目所有圖片
分享URL:http://www.chinadenli.net/article10/pissdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)全網(wǎng)營銷推廣微信公眾號電子商務(wù)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司