基于Node的Axure文件在线预览的实现代码


Posted in Javascript onAugust 28, 2019

前言

公司现在的产品Axure文档在生成好Html文件之后,都是通过git来进行管理的,每次文件更新,大家都需要从git上进行拉取,然后在本地查看,更新会出现不及时的问题,大家有时候忘记git拉取导致出现实现效果与最终产品稿不一致。最近在看Koa的东西,因此通过git hooks 搭配Koa来实现了一个在线预览,实现上大概是根据访问路径查找指定目录,然后对目录进行遍历,然后根据目录和文件类型的区分返回相应的数据。

实现

做的过程中需要注意的点,

  • 对于在Git服务端的文件是在.Git文件夹下的,因此我们无法得到其文件目录,实现的方式是通过git clone的方式将其clone下来,然后通过git hook的方式,当有push操作之后,则执行git pull来将文件拉取到本地,通过这种方式来将做到文件的实时更新。
  • 文件的返回,对于图片文件的读取方式要通过二进制的方式,对于其它的文件,如css,js之类要通过

Utf-8的方式,开始统一通过binary的方式读取,然后返回导致图片可以显示,但是js执行报错。

实现代码如下

const Koa = require('koa');
const path = require('path');
const fs = require('fs');
let mimes = {
  'css': 'text/css',
  'html': 'text/html',
  'jpg': 'image/jpeg',
  'jpeg': 'image/jpeg',
  'json': 'application/json',
  'js': 'text/javascript',
  'xml': 'text/xml',
  'png': 'image/png',
  'pdf': 'application/pdf',
  'less': 'text/css',
  'gif': 'image/gif',
  'txt': 'text/plain',
  'tiff': 'image/tiff',
  'svg': 'image/svg+xml'
};
// Scan dir
function walk(reqPath) {
  let files = fs.readdirSync(reqPath);
  let fileList = [];
  for (let i = 0, len = files.length; i< len; i++) {
    let item = files[i];
    if (item.startsWith('.')) {
      continue;
    }
    let realPath = reqPath + '/' + files[i];
    if (isDir(realPath)) {
      fileList.push(filter(reqPath, files[i]));
    } else {
      fileList.push(files[i]);
    }
  }
  return fileList;
}

function isDir(path){ 
  return fs.existsSync(path) && fs.statSync(path).isDirectory(); 
} 
//
function filter(reqPath, filePath) {
  let files = fs.readdirSync(reqPath + '/' + filePath);
  for (let i = 0; i < files.length; i++) {
    let item = files[i];
    if (item.endsWith('index.html')) {
      return filePath + '/' + 'index.html';
    }
  }
  return filePath;
}

function dir(url, reqPath) {
  let contentList = walk(reqPath);
  let result = '<div align="center" style="font-family:arial;font-size:30px;">Product Document</div><ul>';
  if (url == '/') {
    url = '';
  }
  for (let [index, item] of contentList.entries()) {
    let realHref = url + '/' + item;
    let realItem = item.split('/');
    result += '<li> <a style="font-family:arial;font-size:20px;" href=' + realHref + '>' + realItem[0] + '</a></li>';
  }
  result = result + '</ul>';
  return result;
}

async function file (url, filePath) {
  let resultMime = parseMime(url);
  let content;
  if (resultMime && resultMime.indexOf('image/') >= 0) {
    content = fs.readFileSync(filePath, 'binary');
  } else {
    content = fs.readFileSync(filePath, 'utf8');
  }
  return content;
}

async function content(ctx, fullStaticPath) {
  let url = decodeURI(ctx.url);
  let reqPath = path.join(fullStaticPath, url);
  let exist = fs.existsSync(reqPath);
  let content = '';
  if (!exist) {
    content = 'Local file not exists';
  } else {
    let stat = fs.statSync(reqPath);
    if (stat.isDirectory()) {
      content = dir(ctx.url, reqPath);
    } else {
      content = await file(ctx.url, reqPath);
    }
  }
  return content;
}

function parseMime(url) {
  let extName = path.extname(url);
  extName = extName ? extName.slice(1) : 'unknown';
  return mimes[extName];
}
const app = new Koa();
const staticPath = '../onlinedoc';`请输入代码`
app.use(async(ctx) => {
  let fullStaticPath = path.join(__dirname, staticPath);
  let resultContent = await content(ctx, fullStaticPath);
  let resultMime = parseMime(ctx.url);
  if (resultMime) {
    ctx.type = resultMime;
  } 
  if(resultMime && resultMime.indexOf('image/') >= 0) {
    ctx.res.writeHead(200);
    ctx.res.write(resultContent, 'binary');
    ctx.res.end();
  } else {
    ctx.body = resultContent;
  }
});
app.listen(8080, () => {
  console.log('Running');
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
Mar 12 Javascript
javascript禁止超链接跳转的方法
Feb 02 Javascript
js实现页面跳转的几种方法小结
May 16 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
Sep 23 Javascript
JS实现重新加载当前页面或者父页面的几种方法
Nov 30 Javascript
基于javascript实现按圆形排列DIV元素(一)
Dec 02 Javascript
简单三步实现报表页面集成天气
Dec 15 Javascript
JS随机排序数组实现方法分析
Oct 11 Javascript
基于vue中对鼠标划过事件的处理方式详解
Aug 22 Javascript
在小程序开发中使用npm的方法
Oct 17 Javascript
vue路由守卫及路由守卫无限循环问题详析
Sep 05 Javascript
es6数组的flat(),flatMap()函数用法实例分析
Apr 18 Javascript
详解用async/await来处理异步
Aug 28 #Javascript
vue中监听返回键问题
Aug 28 #Javascript
微信小程序 拍照或从相册选取图片上传代码实例
Aug 28 #Javascript
小程序中this.setData的使用和注意事项
Aug 28 #Javascript
微信小程序 可搜索的地址选择实现详解
Aug 28 #Javascript
vue实现标签云效果的方法详解
Aug 28 #Javascript
微信小程序通过js实现瀑布流布局详解
Aug 28 #Javascript
You might like
PHP 类相关函数的使用详解
2013/05/10 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
php计算税后工资的方法
2015/07/28 PHP
thinkphp5.1 框架钩子和行为用法实例分析
2020/05/25 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
javascript 得到变量类型的函数
2010/05/19 Javascript
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
2014/06/19 Javascript
javascript数据类型详解
2017/02/07 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
Vue监听数组变化源码解析
2017/03/09 Javascript
关于Vue单页面骨架屏实践记录
2017/12/13 Javascript
实时监控input框,实现输入框与下拉框联动的实例
2018/01/23 Javascript
JS中touchstart事件与click事件冲突的解决方法
2018/03/12 Javascript
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
解决layer弹出层自适应页面大小的问题
2019/09/16 Javascript
jQuery实现手风琴效果(蒙版)
2020/01/11 jQuery
js代码实现轮播图
2020/05/04 Javascript
python生成指定长度的随机数密码
2014/01/23 Python
python实现随机密码字典生成器示例
2014/04/09 Python
python静态方法实例
2015/01/14 Python
Python实现的异步代理爬虫及代理池
2017/03/17 Python
python实现校园网自动登录的示例讲解
2018/04/22 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
2018/09/02 Python
在python shell中运行python文件的实现
2019/12/21 Python
Tensorflow 卷积的梯度反向传播过程
2020/02/10 Python
Python实现井字棋小游戏
2020/03/09 Python
python 实现两个线程交替执行
2020/05/02 Python
Python3.7下安装pyqt5的方法步骤(图文)
2020/05/12 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
Python如何实现线程间通信
2020/07/30 Python
使用Pytorch搭建模型的步骤
2020/11/16 Python
python利用xpath爬取网上数据并存储到django模型中
2021/02/26 Python
印尼购物网站:iLOTTE
2019/10/16 全球购物
新闻编辑求职信
2014/04/09 职场文书
干部职工纪律作风整改措施思想汇报
2014/10/11 职场文书