基于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 Form.elements[i]的使用实例
Nov 13 Javascript
javascript模拟订火车票和退票示例
Apr 24 Javascript
基于javascript实现判断移动终端浏览器版本信息
Dec 09 Javascript
js简单倒计时实现代码
Apr 30 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
Jan 04 Javascript
全面总结Javascript对数组对象的各种操作
Jan 22 Javascript
AngularJS学习第一篇 AngularJS基础知识
Feb 13 Javascript
JS实现的五级联动菜单效果完整实例
Feb 23 Javascript
js判断是否是手机页面
Mar 17 Javascript
微信小程序实现获取准确的腾讯定位地址功能示例
Mar 27 Javascript
多个vue子路由文件自动化合并的方法
Sep 03 Javascript
javascript实现画板功能
Apr 12 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控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
php Notice: Undefined index 错误提示解决方法
2010/08/29 PHP
PHP 验证登陆类分享
2015/03/13 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
2016/05/16 PHP
PHP单链表的实现代码
2016/07/05 PHP
PHP实现的折半查询算法示例
2017/10/09 PHP
div模拟滚动条效果示例代码
2013/10/16 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
jquery.qtip提示信息插件用法简单实例
2016/06/17 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
Angular(5.2-&gt;6.1)升级小结
2018/12/27 Javascript
vue19 组建 Vue.extend component、组件模版、动态组件 的实例代码
2019/04/04 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
JS+CSS实现炫酷光感效果
2020/09/05 Javascript
[01:53]2016完美“圣”典风云人物:Maybe专访
2016/12/05 DOTA
python生成日历实例解析
2014/08/21 Python
Python第三方库face_recognition在windows上的安装过程
2019/05/03 Python
Flask教程之重定向与错误处理实例分析
2019/08/01 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
HTML5 CSS3打造相册效果附源码下载
2014/06/16 HTML / CSS
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
巴西最大的家电和百货零售商:Casas Bahia
2016/11/22 全球购物
jurlique茱莉蔻英国官网:澳洲天然护肤品
2018/08/03 全球购物
高级3D打印市场:Gambody
2019/12/26 全球购物
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
教师自我评价范文
2013/12/16 职场文书
工业设计专业个人求职信范文
2013/12/28 职场文书
淘宝店铺营销方案
2014/02/13 职场文书
战略合作意向书范本
2014/04/01 职场文书
离婚承诺书格式范文
2015/05/04 职场文书
初中毕业生感言
2015/07/31 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书
MySQL中InnoDB存储引擎的锁的基本使用教程
2021/05/26 MySQL
分位数回归模型quantile regeression应用详解及示例教程
2021/11/02 Python