iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Node怎么实现浏览器预览项目所有图片
  • 751
分享到

Node怎么实现浏览器预览项目所有图片

2023-07-04 23:07:44 751人浏览 独家记忆
摘要

本文小编为大家详细介绍“node怎么实现浏览器预览项目所有图片”,内容详细,步骤清晰,细节处理妥当,希望这篇“Node怎么实现浏览器预览项目所有图片”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在前端实际项目开发

本文小编为大家详细介绍“node怎么实现浏览器预览项目所有图片”,内容详细,步骤清晰,细节处理妥当,希望这篇“Node怎么实现浏览器预览项目所有图片”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

前端实际项目开发中,会有这样一种场景。每次引入新的图片,并不知道这个资源是否被引用过,所以会点开存放图片的资源一个个去看。实际问题是:

  • 图片并不是放到一个目录下的,可能存在任何的地方,不好查找

  • 费时间,费力

  • 可能会重复引入图片资源

如果有个能力,将项目图片资源罗列到一起查看,并方便看到引入路径的话,就会大大节约开发的体力活。

需求分析

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

  • 读取文件,分析哪些是图片,将图片资源通过img标签写入到html文件中

  • 创建一个服务器,将html渲染出来

这就需要借助Node来实现,需要用到的 fs path Http 模块。

实现

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}

效果

以上就是实现过程,执行一下 npm run test就可以看到浏览器执行在http://localhost:3004/, 效果如下:

Node怎么实现浏览器预览项目所有图片

发布

npm login

npm publish

思考

  • 为什么用异步读取文件?

    因为js是单线程,同步读取文件的话会卡在那里,不能执行其他了。

  • 为什么要用Promise 收集图片

    因为不知道什么时候读取完文件,当异步读取完再用Promise.all整体处理

  • 为什么 不读取新的html文件,而将结果直接返回给浏览器?

    如果将转换后html放到 test-read-img 文件,就必须将图片资源也要生成在当前目录,要不然html 读取的相当路径资源是找不到的,因为资源都在使用项目中。结束的时候还要将图片资源删除,这也无形增加了复杂度;

    如果将转化后的html 写入放到使用项目中,这样就可以直接用图片的路径,并能正确加载,但是这样会多了一个html文件,程序退出的时候还要删除这个,如果忘记删除了,就可能被开发者提交到远程,造成污染,提供的预览应该是无害的。这两种方式都不可取。因此直接返回html资源,让它去加载相对目标项目路径,不会产生任何影响。

读到这里,这篇“Node怎么实现浏览器预览项目所有图片”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Node怎么实现浏览器预览项目所有图片

本文链接: https://www.lsjlt.com/news/348123.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Node怎么实现浏览器预览项目所有图片
    本文小编为大家详细介绍“Node怎么实现浏览器预览项目所有图片”,内容详细,步骤清晰,细节处理妥当,希望这篇“Node怎么实现浏览器预览项目所有图片”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在前端实际项目开发...
    99+
    2023-07-04
  • Node实战学习:浏览器预览项目所有图片
    在前端实际项目开发中,会有这样一种场景。每次引入新的图片,并不知道这个资源是否被引用过,所以会点开存放图片的资源一个个去看。实际问题是:1.图片并不是放到一个目录下的,可能存在任何的地方,不好查找2.费时间,费力3.可能会重复引入图片资源如...
    99+
    2023-05-14
    前端 Node.js
  • Node如何实现在浏览器预览项目的所有图片详解
    目录背景需求分析实现1 实现可发布npm包2 集成到别的项目3 读取文件效果发布思考总结背景 在前端实际项目开发中,会有这样一种场景。每次引入新的图片,并不知道这个资源是否被引用过,...
    99+
    2023-01-07
    node浏览器预览图片打不开 浏览器在线预览文件 node浏览器预览图片
  • Qt怎么实现图片浏览器
    这篇文章主要介绍了Qt怎么实现图片浏览器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Qt怎么实现图片浏览器文章都会有所收获,下面我们一起来看看吧。图片浏览器逻辑实现图片浏览器用到了前面几乎所有的知识,包括窗口...
    99+
    2023-07-05
  • html5怎么实现图片上传预览
    这篇文章主要介绍“html5怎么实现图片上传预览”,在日常操作中,相信很多人在html5怎么实现图片上传预览问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”html5怎么实现图...
    99+
    2022-10-19
  • 怎么在Android中实现一个网络图片浏览器
    这篇文章给大家介绍怎么在Android中实现一个网络图片浏览器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、创建一个“网络图片浏览器的应用程序”,并设计用户交互界面,“网络图片浏览器”对应的布局文件(activit...
    99+
    2023-05-31
    android roi %d
  • html5中怎么实现图片上传预览功能
    今天就跟大家聊聊有关html5中怎么实现图片上传预览功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。<!DOCTYPE html&...
    99+
    2022-10-19
  • HTML5中怎么实现本地图片预览功能
    这期内容当中小编将会给大家带来有关HTML5中怎么实现本地图片预览功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。问题描述假设我们在 HTML 里面有一个图片上传控件:...
    99+
    2022-10-19
  • Android怎么实现图片预览与保存功能
    这篇“Android怎么实现图片预览与保存功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android怎么实现图片预览与...
    99+
    2023-06-30
  • angularjs怎么实现多张图片上传并预览功能
    这篇文章主要介绍angularjs怎么实现多张图片上传并预览功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下directive.js    angu...
    99+
    2022-10-19
  • Html5怎么实现上传本地图片并预览功能
    小编给大家分享一下Html5怎么实现上传本地图片并预览功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!最近工作中需要H5上传显...
    99+
    2022-10-19
  • Vue和UpLoad怎么实现上传预览和删除图片
    这篇文章主要介绍“Vue和UpLoad怎么实现上传预览和删除图片”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue和UpLoad怎么实现上传预览和删除图片”文章能帮助大家解决问题。用vue+Ele...
    99+
    2023-06-29
  • 怎么用html5的canvas移动浏览器实现图片压缩上传
    这篇文章主要介绍“怎么用html5的canvas移动浏览器实现图片压缩上传”,在日常操作中,相信很多人在怎么用html5的canvas移动浏览器实现图片压缩上传问题上存在疑惑,小编查阅了各式资料,整理出简单...
    99+
    2022-10-19
  • Android中怎么利用ViewPager实现图片滑动预览效果
    本篇文章给大家分享的是有关Android中怎么利用ViewPager实现图片滑动预览效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。xml代码:<xml ve...
    99+
    2023-05-30
    android viewpager
  • Nodejs中怎么实现图片上传和压缩预览功能
    这篇文章给大家介绍Nodejs中怎么实现图片上传和压缩预览功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、引入基本配置const Koa = req...
    99+
    2022-10-19
  • CSS浏览器的视图与坐标怎么实现
    本篇内容主要讲解“CSS浏览器的视图与坐标怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS浏览器的视图与坐标怎么实现”吧!   像素(Pixel)...
    99+
    2022-10-19
  • vue项目怎么实现前端预览word与pdf格式文件
    今天小编给大家分享一下vue项目怎么实现前端预览word与pdf格式文件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。页面上...
    99+
    2023-07-05
  • Android应用中怎么实现一个图片预览缩放功能
    Android应用中怎么实现一个图片预览缩放功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体实现方法如下<&#63;xml version="1....
    99+
    2023-05-31
    android roi
  • vue3怎么使用useMouseInElement实现图片局部放大预览效果
    本文小编为大家详细介绍“vue3怎么使用useMouseInElement实现图片局部放大预览效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue3怎么使用useMouseInElement实现图片局部放大预览效果”文章能帮助大家解决...
    99+
    2023-07-05
  • vue中element的el-image图片预览下载功能怎么实现
    这篇文章主要讲解了“vue中element的el-image图片预览下载功能怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue中element的el-image图片预览下载功能怎么...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作