基于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 相关文章推荐
网页里控制图片大小的相关代码
Jun 13 Javascript
JQuery与Ajax常用代码实现对比
Oct 03 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
Jun 26 Javascript
详解Javascript中prototype属性(推荐)
Sep 03 Javascript
javascript 分号总结及详细介绍
Sep 24 Javascript
JavaScript 继承详解(六)
Oct 11 Javascript
javascript中活灵活现的Array对象详解
Nov 30 Javascript
JavaScript原型继承_动力节点Java学院整理
Jun 30 Javascript
浅谈JavaScript find 方法不支持IE的问题
Sep 28 Javascript
微信小程序进入广告实现代码实例
Sep 19 Javascript
vue 使用post/get 下载导出文件操作
Aug 07 Javascript
javascript实现电商放大镜效果
Nov 23 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
php5 图片验证码实现代码
2009/12/11 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
微信公众平台之快递查询功能用法实例
2015/04/14 PHP
php实现购物车功能(下)
2016/01/05 PHP
windows环境下使用Composer安装ThinkPHP5
2018/05/18 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
判断页面是关闭还是刷新的js代码
2007/01/28 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
2013/10/15 Javascript
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
JQuery实现table行折叠效果以JSON做数据源
2014/05/26 Javascript
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
js窗口震动小程序分享
2016/11/28 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
nodejs 递归拷贝、读取目录下所有文件和目录
2019/07/18 NodeJs
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
Python利用IPython提高开发效率
2016/08/10 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
Python实现的堆排序算法示例
2018/04/29 Python
在python中利用GDAL对tif文件进行读写的方法
2018/11/29 Python
深入解析Python小白学习【操作列表】
2019/03/23 Python
python实现四人制扑克牌游戏
2020/04/22 Python
Python中内建模块collections如何使用
2020/05/27 Python
html5定制表单_动力节点Java学院整理
2017/07/11 HTML / CSS
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
编码实现字符串转整型的函数
2012/06/02 面试题
汽车专业学生自我评价
2014/01/19 职场文书
迟到检讨书大全
2014/01/25 职场文书
学习雷锋活动总结
2014/04/29 职场文书
2015年学生资助工作总结
2015/05/25 职场文书
2015年中学团委工作总结
2015/07/22 职场文书
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers