基于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 相关文章推荐
XHTML-Strict 内允许出现的标签
Dec 11 Javascript
jquery中输入验证中一个不错的效果
Aug 21 Javascript
一个不错的字符串转码解码函数(自写)
Jul 31 Javascript
浅谈JavaScript function函数种类
Dec 29 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
Mar 22 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
May 28 Javascript
学习Javascript闭包(Closure)知识
Aug 07 Javascript
JS实现iframe自适应高度的方法示例
Jan 07 Javascript
axios携带cookie配置详解(axios+koa)
Dec 28 Javascript
原生js实现俄罗斯方块
Oct 20 Javascript
vue-router定义元信息meta操作
Dec 07 Vue.js
让JavaScript代码更加精简的方法技巧
Jun 01 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循环获取GET和POST值的代码
2008/04/09 PHP
删除及到期域名的查看(抢域名必备哦)
2008/05/14 PHP
php实现等比例压缩图片
2018/07/26 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
2019/10/08 PHP
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
一个简单的js渐显(fadeIn)渐隐(fadeOut)类
2010/06/19 Javascript
基于json的jquery地区联动效果代码
2011/07/06 Javascript
AngularJs根据访问的页面动态加载Controller的解决方案
2015/02/04 Javascript
JavaScript设计模式之工厂模式和构造器模式
2015/02/11 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
2015/08/24 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
2015/12/24 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
微信小程序本地缓存数据增删改查实例详解
2017/05/24 Javascript
vue router仿天猫底部导航栏功能
2017/10/18 Javascript
VueJs组件之父子通讯的方式
2018/05/06 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
Python中int()函数的用法浅析
2017/10/17 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
基于python 二维数组及画图的实例详解
2018/04/03 Python
pygame实现简易飞机大战
2018/09/11 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
2015/08/25 面试题
新员工培训个人的自我评价
2013/10/09 职场文书
本科毕业生专业自荐书范文
2014/02/05 职场文书
迟到检讨书300字
2014/02/14 职场文书
美容院营销方案
2014/03/05 职场文书
仓库规划计划书
2014/04/28 职场文书
vue项目两种方式实现竖向表格的思路分析
2021/04/28 Vue.js
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
Oracle中DBLink的详细介绍
2022/04/29 Oracle